Witam,
Chciałem napisać prosty program do włączania i wyłączania 5 diod podłączonych do portów PC0-PC4 uP atmega8. Diody zapalą się po ustawieniu na portach stanu 0. Diody mają samoczynnie migać, a czas pomiędzy włączeniem, a wyłączeniem diod będzie ustawiany w timer0. Niestety uP po 294 cyklach uP restartuje się tj. wraca do funkcji reset. 294-ty cykl to wykonywanie komendy ret w funkcji Zapal_5_diod. Ma to miejsce zarówno w Avr Studio jaki na żywym układzie diody nie migają.
Watchdog nie jest włączony. Oczywiście do rejestru TCCR0 wpisałem 0x01, ale tylko dlatego, żeby szybciej obserwować to w AVR Studio. Docelowo ustawie prescaler, aby móc obserwować miganie diody - wpiszę 0x05 do rejestru TCCR0.
Oto listing programu:
Jakieś pomysły?
Będę wdzięczny za pomoc.
Dzięki.
Pozdr,
Łukasz.
Chciałem napisać prosty program do włączania i wyłączania 5 diod podłączonych do portów PC0-PC4 uP atmega8. Diody zapalą się po ustawieniu na portach stanu 0. Diody mają samoczynnie migać, a czas pomiędzy włączeniem, a wyłączeniem diod będzie ustawiany w timer0. Niestety uP po 294 cyklach uP restartuje się tj. wraca do funkcji reset. 294-ty cykl to wykonywanie komendy ret w funkcji Zapal_5_diod. Ma to miejsce zarówno w Avr Studio jaki na żywym układzie diody nie migają.
Watchdog nie jest włączony. Oczywiście do rejestru TCCR0 wpisałem 0x01, ale tylko dlatego, żeby szybciej obserwować to w AVR Studio. Docelowo ustawie prescaler, aby móc obserwować miganie diody - wpiszę 0x05 do rejestru TCCR0.
Oto listing programu:
.include "m8def.inc"
;wektory przerwan
.org $000
rjmp reset
;.org $009
; rjmp TIM0_OVF
;************************************************************
reset:
ldi r16,high(RAMEND) ; Set Stack Pointer to top of RAM
out SPH,r16
ldi r16,low(RAMEND) ; ustawienie stosu
out SPL,r16
;***********************************************************
cli
rcall Set_port_C ; inicjalizacja portu B
rcall Set_Timer0 ; inicjalizacja Timer0
sei ; set global interrupt enable
clr r16
clr r17
clr r18
Start:
nop
in r16, TIFR ; sprawdzanie bitu TOV0
andi r16, 0x01 ; czy rowna sie 1
cpi r16, 0x01 ; czy rowna sie 1
breq Zabawa_diodami
nop
rjmp Start
;************************************************************
Set_port_C:
; Define pull-ups and set outputs high
ldi r16,(0<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)|(1<<PC1)|(1<<PC0)
; Define directions for port pins
ldi r17,(0<<DDC5)|(1<<DDC4)|(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0)
out PORTC,r16
out DDRC,r17
; Insert nop for synchronization
nop
ret
;************************************************************
Set_Timer0:
;ldi r16, 0x01
;out TIMSK, r16 ; Overflow interrupt enable
ldi r16, 0x01 ; no prescaler
out TCCR0, r16 ; Clock select
ret
;************************************************************
TIM0_OVF:
;inc r17
;cpi r17, 0x02
;breq Zapal_5_diod
;cpi r18, 0x01
;breq Zgas_diody
reti
;************************************************************
Zapal_5_diod:
ldi r16, 0x00
out PORTC, r16
nop
ret
;************************************************************
Zgas_diody:
ldi r16, 0xFF
out PORTC, r16
clr r18
nop
ret
;************************************************************
Zabawa_diodami:
nop
inc r18
cpi r18, 0x01 ; jezeli licznik=1 zapal diody
breq Zapal_5_diod
cpi r18, 0x02 ; jezeli licznik=2 zgas diody
breq Zgas_diody
ldi r16, 0x01
out TIFR, r16 ; zerwoanie bitu TOV0 poprzez ustawienie go na 1
nop
ret
;************************************************************
Jakieś pomysły?
Będę wdzięczny za pomoc.
Dzięki.
Pozdr,
Łukasz.