Вопрос такой к форумчанам: на tiny2313 хочу выводить числа последовательно о 0 до 255, просто ради эксперимента: вот текст программы на ассемблере: .include "tn2313def.inc"
.def Temp1=R16 .def Temp2=R17 .def Temp3=R18 .def Temp4=R19 .def Temp=R20 .def fbin=R21 .def tBCDL=R21 .def tBCDM=R22 .def tBCDH=R23
.dseg
Digit: .byte 3
.cseg .org 0
rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp EXT_INT1 ; IRQ1 Handler rjmp TIM_CAPT1 ; Timer1 Capture Handler rjmp TIM_COMP1 ; Timer1 Compare Handler rjmp TIM_OVF1 ; Timer1 Overflow Handler rjmp TIM_OVF0 ; Timer0 Overflow Handler rjmp UART_RXC ; UART RX Complete Handler rjmp UART_DRE ; UDR Empty Handler rjmp UART_TXC ; UART TX Complete Handler rjmp ANA_COMP ; Analog Comparator Handler
EXT_INT0 : ret EXT_INT1 : ret TIM_CAPT1 : ret TIM_OVF0 : ret TIM_OVF1 : rjmp main UART_RXC : ret UART_DRE : ret UART_TXC : ret ANA_COMP : ret TIM_COMP1 : ret
reset: ldi Temp1,RamEnd ;èíèöèàëèçàöèÿ ñòåêà out SPL,Temp1
;cli
ldi Temp,0b11111111 ;íàñòðîéêà ïîðòîâ out ddrb,Temp
ldi Temp,0b00001111 out ddrd,Temp
;íàñòðîéêà òàéìåðà1 ldi temp, 0 out TCCR1A, temp ldi temp, 0b00000100 out TCCR1B, temp ; âêë ïðåääåë /256 ldi temp, 0b10000000 out TIMSK, temp sei ;ldi Temp,3 ;sts Digit ,Temp ;çàãðóçêà íà÷àëüíûõ ñíà÷åíèé ;ldi Temp,7 ;sts Digit+1,Temp ;ldi Temp,9 ;sts Digit+2,Temp clr fbin
;********************************************************* ;MAIN main: clr temp out TCNT1H, temp out TCNT1L, temp inc fbin rcall bin3bcd8
;*********************************************************
IndicCycle: rcall Display ;öèêë èíäèêàöèè rjmp IndicCycle
;********************************************************* Display: ;ïîñëåäîâàòåëüíûé âûâîä íà èíäèêàöèþ ñîäåðæèìîãî ;ïåðåìåííîé Digit
lds Temp1,Digit ;çàãðóæàåì 0-þ ÿ÷åéêó ldi Temp,0b00001110 ;àêòèâèðóåì 0-é ðàçðÿä ;èíäèêàöèè out PortD,Temp rcall Decoder ;âûçûâàåì 7-ñåãì. äåêîäåð out PortB,Temp1 ;âûâîäèì çíà÷åíèå â ïîðò rcall Delay1 ;æäåì
lds Temp1,Digit+1 ;è .ò.ä ldi Temp,0b00001101 out PortD,Temp rcall Decoder out PortB,Temp1 rcall Delay1
lds Temp1,Digit+2 ldi Temp,0b00001011 out PortD,Temp rcall Decoder out PortB,Temp1 rcall Delay1
;lds Temp1,Digit+3 ;ldi Temp,0b00000111 ;out PortD,Temp ;rcall Decoder ;out PortB,Temp1 ;rcall Delay1
ret
;********************************************************* Decoder: ;ïðåîáðàçîâàíèå äâîè÷íîãî ÷èñëà ;â êîä 7-ñåãìåíòíîãî èíäèêàòîðà
ldi ZL,Low(DcMatrix*2) ;èíèöèàëèçàöèÿ ìàññèâà ldi ZH,High(DcMatrix*2)
ldi Temp2,0 ;ïðèáàâëåíèå ïåðåìåííîé add ZL,Temp1 ;ê 0-ìó àäðåñó ìàññèâà adc ZH,Temp2
lpm ;çàãðóçêà çíà÷åíèÿ mov Temp1,r0 ret
DcMatrix: ;ìàññèâ - òàáëèöà èñòèííîñòè äåêîäåðà ; hgfedcba hgfedcba .db 0b00111111,0b00000110 ;0,1 .db 0b01011011,0b01001111 ;2,3 .db 0b01100110,0b01101101 ;4,5 .db 0b01111101,0b00000111 ;6,7 .db 0b01111111,0b01101111 ;8,9
;********************************************************* ; ïîäïðîãðàììà ïåðåâîäà â äâîè÷íî äåñÿòè÷íûé êîä bin3bcd8: clr tBCDH ;clear result MSD bBCD8_1: subi fbin,10 ;input = input - 10 brcs bBCD8_2 ;abort if carry set inc tBCDM ;inc MSD
rjmp bBCD8_1 ;loop again bBCD8_2:subi fbin,-10 ;compensate extra subtraction
bBCD8_3: subi tBCDM,10 ;input = input - 10 brcs bBCD8_4 ;abort if carry set inc tBCDH ;inc MSD
rjmp bBCD8_3 ;loop again bBCD8_4:subi tBCDM,-10 ;compensate extra subtraction
mov Temp,tBCDL sts Digit ,Temp ;çàãðóçêà íà÷àëüíûõ ñíà÷åíèé mov Temp,tBCDM sts Digit+1,Temp mov Temp,tBCDH sts Digit+2,Temp ret ;********************************************************* Delay1: ;öèêë çàäåðæêè
push Temp1 push Temp2
ldi Temp1,0 ldi Temp2,25
d11: dec Temp1 brne d11 dec Temp2 brne d11
pop Temp2 pop Temp1
ret соответственно увеличение числа происходит по переполнению таймера1, но вот загвоздка на индикаторах я вижу только 1,2 и все потом все останавливается? кто поможет?
|