Прерывания в AVR на ASM

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Прерывания в AVR на ASM

Сообщение 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 секунд:
Хм оно даже работает... тогда с чем может быть связан данный косяк?
Dwarf
 
Сообщения: 3
Зарегистрирован: 16 июн 2008, 23:41
Откуда: Питер

Re: Прерывания в AVR на ASM

Сообщение 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
Аватара пользователя
Victorovych
 
Сообщения: 491
Зарегистрирован: 20 сен 2007, 11:44
Откуда: Харьков
Skype: Victorovych_FF
прог. языки: ASM
ФИО: Иван ВикторОвич

Re: Прерывания в AVR на ASM

Сообщение Dwarf » 23 июн 2008, 11:43

Спасибо, получилось :good:
Dwarf
 
Сообщения: 3
Зарегистрирован: 16 июн 2008, 23:41
Откуда: Питер

Re: Прерывания в AVR на ASM

Сообщение Duhas » 20 июл 2008, 09:59

чтоб не целиться, имхо проще написать
Код: Выделить всё
.org 0x00E
rjmp tc1
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot], Google [Bot] и гости: 10