Witam
Wpadłem na problem i mam spory problem z rozwiązaniem. Chciałem zbudować włącznik led do autka zdalnie sterowanego, zasilanie idzie z odbiornika (5V) i sygnał PWM w zakresie ok. 700us - 2300us. W programie mam próg ustawiony ok. 1500us. Gdy włącze układ to robi się dyskoteka (diody migają na przemian), a gdy przekrzywie drążek w jedną stronę to zapala się jedna dioda.
Impuls podawany na PINB.1 (INT0)
Wyjście PINB.0 (jedna dioda) , PINB.1 (druga dioda)
Kwarc 4MHz
W symulatorze przetestowałem i chodzi dobrze, natomiast pojawia się komunikat HW stack overflow at 0x0014. W sumie jest to mój pierwszy program w asm, i z tego co mi się wydaje podczas robienia skoków przez rjmp nie jest używany stos do zapamiętania aktualnej lini programu, więc jakoś się nie przejmowałem tym komunikatem, ale dziś wszystko zlutowałem, programuje a tu nie działa.
Prosiłbym o pomoc, ewentualnie jakieś wskazówki.
Kod:
Pozdrawiam
Wpadłem na problem i mam spory problem z rozwiązaniem. Chciałem zbudować włącznik led do autka zdalnie sterowanego, zasilanie idzie z odbiornika (5V) i sygnał PWM w zakresie ok. 700us - 2300us. W programie mam próg ustawiony ok. 1500us. Gdy włącze układ to robi się dyskoteka (diody migają na przemian), a gdy przekrzywie drążek w jedną stronę to zapala się jedna dioda.
Impuls podawany na PINB.1 (INT0)
Wyjście PINB.0 (jedna dioda) , PINB.1 (druga dioda)
Kwarc 4MHz
W symulatorze przetestowałem i chodzi dobrze, natomiast pojawia się komunikat HW stack overflow at 0x0014. W sumie jest to mój pierwszy program w asm, i z tego co mi się wydaje podczas robienia skoków przez rjmp nie jest używany stos do zapamiętania aktualnej lini programu, więc jakoś się nie przejmowałem tym komunikatem, ale dziś wszystko zlutowałem, programuje a tu nie działa.
Prosiłbym o pomoc, ewentualnie jakieś wskazówki.
Kod:
.nolist
.include "tn12def.inc"
.list
.listmac
.cseg
.org 0x000
rjmp konfig
.org INT0addr
rjmp przerwanie
.org OVF0addr
reti
.org ERDYaddr
reti
.org ACIaddr
reti
konfig:
cli
ldi r16,0x05
out DDRB,r16 ; pinb.0 i pind.2 wyjście, pinb.1 wejscie
ldi r16,0x04
out PORTB,r16 ; wszystkie stan początkowy 0
ldi r16,0x03
out MCUCR,r16 ;int0 zboczem rosnącym
ldi r16,0x40
out GIMSK,r16 ;zezwól na przerwania int0
loop:
sei
in r17,TCNT0 ;przepisz stn licznika do r17
ldi r16,0x00
out TCCR0,r16 ;timer stop
cpi r17, 0x5E
brsh wlacz
cpi r17, 0x5E
brlo wylacz
rjmp loop
przerwanie:
ldi r16,0x00 ; zeruj timer
out TCNT0,r16
ldi r16,0x03
out TCCR0,r16 ;włącz timer /64
sei
sprawdz:
in r16,PINB
andi r16,0x02 ;pinb.1 sprawdzanie czy skończył się impuls
cpi r16, 0x00
brne sprawdz
ldi r16,0x00
out TCCR0,r16 ;stop timer
rjmp loop
wlacz:
sbi portb,0
cbi portb,2
rjmp loop
wylacz:
sbi portb,2
cbi portb,0
rjmp loop
.exit
Pozdrawiam