Witam
Zacząłem sprawdzać przerwanie TIMER1 w trybie przepełnienia. Na symulatorze program normalnie działa jednak w rzeczywistości inaczej.
Zadaniem programu jest cykliczne zmienianie pinu B6 i pozostałych linii portu B na przeciwny w odstępach wyznaczanych przez przerwanie. I tak się dzieje. Jednak na początku bardzo długo panuje stan wysoki na PD6 - zanim przerwanie nie zaskoczy
Po tym PD6 zmienia stan na niski i pozostałe linie portu B są w stanie wysokim. I to trwa znowu bardzo długo. Jak znowu PD6 ma stan wysoki to program działa tak jak chcę czyli zmiana następuje co kilkaset ms.
Proszę o pomoc.
Zacząłem sprawdzać przerwanie TIMER1 w trybie przepełnienia. Na symulatorze program normalnie działa jednak w rzeczywistości inaczej.
.include "m8def.inc"
.equ przyciski = portc
.equ in_przyciski = ddrc
.equ wyjscie1 = portb
.equ out_wyjscie1 = ddrb
.equ wyjscie2 = portd
.equ out_wyjscie2 = ddrd
.equ wys0 = portd0
.equ wys1 = portd1
.equ vol0 = portd2
.equ vol1 = portd3
.equ bass0 = portd4
.equ bass1 = portd5
.cseg
.org 0
rjmp reset
.org OVF1addr
rjmp przerwanie
reset:
ldi r17,high(ramend)
ldi r16,low(ramend)
out sph,r17
out spl,r16
;ldi r16,0
;out in_przyciski , r16
ldi r16,255
out out_wyjscie1 , r16
;out out_wyjscie2 , r16
;out przyciski , r16
in r16,tccr1a
cbr r16,1<<wgm11
cbr r16,1<<wgm10
out tccr1a,r16
cbr r16,1<<wgm13
cbr r16,1<<wgm12
out tccr1b,r16
ldi r16,(1<<cs12) |(0<<cs11) |(0<<cs10);prescale 256
out tccr1b,r16
ldi r16,(1<<toie1) ;wl timera1
out timsk,r16
;ldi r17,high(65500)
;ldi r16,low(65500)
sei
ldi r20,255
ldi r21,64
out wyjscie1,r21
petla:
rjmp petla
przerwanie:
cli ;timer=63000
ldi r17,high(63000)
ldi r16,low(63000)
out tcnt1l,r16
out tcnt1h,r17
sei
eor r21,r20
out wyjscie1,r21
retiZadaniem programu jest cykliczne zmienianie pinu B6 i pozostałych linii portu B na przeciwny w odstępach wyznaczanych przez przerwanie. I tak się dzieje. Jednak na początku bardzo długo panuje stan wysoki na PD6 - zanim przerwanie nie zaskoczy
Proszę o pomoc.