Dwarf » 23 июн 2008, 03:21
Всем снова здрасьте, в общем с прерываниями я примерно разобрался, но опять вопрос возник... Все вроде работает, но по таблице из даташита мое прерывание 8 по счету, но по тексту программы оно 13... что я не так сделал? как надо?
.include "m16def.inc"
.def temp=R16
.def rab=R17
.equ kdel=100
.cseg
.org 0
rjmp init
reti
reti
reti
reti
reti
reti
reti <= должно срабатывать тут
reti
reti
reti
reti
rjmp tc1
reti
reti
reti
reti
reti
reti
reti
reti
init:
ldi temp, 0x80
out ACSR, temp
ldi temp, 0xFF
out SPL, temp
ldi temp, 0xFF
out DDRB, temp
ldi temp, 0x09
out TCCR1B, temp
ldi temp, high(kdel)
out OCR1AH, temp
ldi temp, low(kdel)
out OCR1AL, temp
ldi temp, 0x10
out TIMSK, temp
main:
sei
ldi rab, 0b01000000
m1:
rjmp m1
tc1:
lsr rab
brcc q1
ldi rab, 0b01000000
q1:
out PORTB, rab
reti
Добавлено спустя 2 часа 34 минуты 57 секунд:
Хм оно даже работает... тогда с чем может быть связан данный косяк?
Victorovych » 23 июн 2008, 10:49
Дело в том, что у меги16 вектора препываний идут не по порядку, а по четным адресам, это связано с тем, что однословной команды (rjmp) не достаточно для адресации в любую точку памяти программ
В товоем случае нужно сделать где-то так:
- Код: Выделить всё • Развернуть
rjmp reset ;$000 Reset,Ext Pin,POR,BOR,WDR
nop
reti ;$002 INT0
nop
reti ;$004 INT1
nop
reti ;$006 Timer/Counter2 Compare Match
nop
reti ;$008 Timer/Counter2 Overflow
nop
reti ;$00A Timer/Counter1 Capture Event
nop
reti ;$00C Timer/Counter1 Compare Match A
nop
rjmp tc1 ;$00E Timer/Counter1 Compare Match B
nop
reti ;$010 Timer/Counter1 Overflow
nop
reti ;$012 Timer/Counter0 Overflow
nop
reti ;$014 Serial Transfer Complete
nop
reti ;$016 USART, Rx Complete
nop
reti ;$018 USART, Data Register Empty
nop
reti ;$01A USART, Tx Complete
nop
reti ;$01C ADC Conversion Complete
nop
reti ;$01E EEPROM Ready
nop
reti ;$020 Analog Comparator
nop
reti ;$022 Two-Wire Serial Interface
nop
reti ;$024 INT2
nop
reti ;$026 Timer/Counter0 Compare Match
nop
reti ;$028 Store Program Memory Ready
nop
или
- Код: Выделить всё • Развернуть
rjmp tc1 ;$00E Timer/Counter1 Compare Match B
nop
поменять на jmp tc1
Dwarf » 23 июн 2008, 11:43
Спасибо, получилось
Duhas » 20 июл 2008, 09:59
чтоб не целиться, имхо проще написать
- Код: Выделить всё • Развернуть
.org 0x00E
rjmp tc1