|
При наличии в программе более двух прерываний (таймер0 и таимер1,таймер0 и UART) зацикливается один из таймеров/счетчиков. Причем флаг переполнения(или совпадения) таймера аппаратно сбрасывается при переходе на вектор прерывания,
однако сразу после выполнения rjmp в регистрах таймера флаг переполнения устанавливается и опять программа выполняет прерывание от таймера.
Привожу маленькую программу, которая корректно работает в симуляторе,однако с эмулятором и на процессоре не работает.
P.S. Plz HELP me, SOS me !!!
.include "AT90S8515_Std.aio"
.include "8515def.inc"
.cseg
.org 0
rjmp start
.org INT0addr
reti
.org INT1addr
reti
.org ICP1addr
reti
.org OC1Aaddr
rjmp On_OC1Aaddr
.org OC1Baddr
reti
.org OVF1addr
reti
.org OVF0addr
rjmp OnTimer0_Ovf
.org SPIaddr
reti
.org URXCaddr
reti
.org UDREaddr
reti
.org UTXCaddr
reti
.org ACIaddr
reti
;SetBitP P,bit
.macro SetBitP
in r16,@0
sbr r16,1<<@1
out @0,r16
.endmacro
start:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,$04
out TCCR0,r16
ldi r16,~(32-1)
out TCNT0,r16
SetBitP TIMSK,TOIE0
ldi r16,$0d
out TCCR1B,r16
ldi r16,200
out OCR1AL,r16
ldi r16,2
out OCR1AH,r16
SetBitP TIMSK,OCIE1A
sei
forever:
nop
rjmp forever
OnTimer0_Ovf:
nop
ldi r16,~(32-1)
out TCNT0,r16
reti
On_OC1Aaddr:
nop
reti
E-mail: info@telesys.ru