|
|
  |
Файл Def и прерывание таймера |
|
|
|
Mar 18 2008, 13:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Всем здравствуйте!
Хоть на форуме зарегестрировался давно , но всё таки хотелось , для начала , научиться и постораться разобраться самому . Так, что постепенно постигаю AVR B вот возник вопрос в котором я , что-то "застрял" . Пишу программку, где есть прерывание от таймер.счётчика по переполнению . Согласно Datasheet адреса прерываний ( от всех устройств ) я в программе благополучно пропустил т.е. cseg начинается с адреса 0x003E . За TIM2_OVF зарезервировано 0x0016 - правда в файле DEF .equ OVF2addr = 0x0016 ; Timer/Counter2 Overflow имеется вот такая связка. Я пробывал подставлять и этот операнд в JMP , но асемблер всё равно выдаёт ошибку C:\Program Files\Atmel\AVR Tools\project\wire.asm(22): error: syntax error, unexpected SYMBOL, expecting REGISTER Помогите понять в чём дело?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Mar 18 2008, 17:41
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Добрался до дома , так , что извините за задержку
Вот мои настройки
.include "D:\AVR\AVR Tools\AvrAssembler2\Appnotes\m164pdef.inc"
; Определение главных рабочих регистров
.def temp=r16 ; рабочий регистр .def min=r17 ; счетчик минут .def hour=r18 ; счётчик часов .def day=r19 ; счётчик дней .def secd=r20 ;счётчик секунд .equ minu= $3C .equ hours= $18 .equ secs= $3C
;--------- Определение командного сегмента и начала программы
.cseg .org 0x003E .list
;---------- ;Определение прерываний
jmp RESET ; Reset ; jmp INT0 ; IRQ0 ; jmp INT1 ; IRQ1 ; jmp INT2 ; IRQ2 ; jmp PCINT0 ; PCINT0 ; jmp PCINT1 ; PCINT1 ; jmp PCINT2 ; PCINT2 ; jmp PCINT3 ; PCINT3 ; jmp WDT ; Watchdog Timeout ; jmp TIM2COMPA ; Timer2 CompareA ; jmp TIM2_COMPB ; Timer2 CompareB jmp TIM2_OVF ; Timer2 Overflow ; jmp TIM1_CAPT ; Timer1 Capture ; jmp TIM1_COMPA ; Timer1 CompareA ; jmp TIM1_COMPB ; Timer1 CompareB ; jmp TIM1_OVF ; Timer1 Overflow ; jmp TIM0_COMPA ; Timer0 CompareA ; jmp TIM0_COMPB ; Timer0 CompareB ; jmp TIM0_OVF ; Timer0 Overflow ; jmp SPI_STC ; SPI Transfer Complete ; jmp USART0_RXC ; USART0 RX Complete ; jmp USART0_UDRE ; USART0,UDR Empty ; jmp USART0_TXC ; USART0 TX Complete ; jmp ANA_COMP ; Analog Comparator ; jmp ADC ; ADC Conversion Complete ; jmp EE_RDY ; EEPROM Ready ; jmp TWI ; 2-wire Serial ; jmp SPM_RDY ; SPM Ready ; jmp USART1_RXC ; USART1 RX Complete ; jmp USART1_UDRE ; USART1,UDR Empty ; jmp USART1_TXC ; USART1 TX Complete
RESET: ldi temp,high(RAMEND) ; определение вершины стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp cli ; запрет всех прерываний
....................................................
;-----------Initialization Timer2 кварц 32768 ldi temp,0 ; Установка режима работы счётчика sts TCCR2A,temp ; mode " NORMAL" ldi temp,$5 ; Предделитель на 128 sts TCCR2B,temp ldi temp,$1 ; Разрешение прерывания по переполнению sts TIMSK2,temp ; в итоге "Деление на 256 = 1 секунда" ldi temp,$60 ; Установка асинхронного режима и sts ASSR,temp ; разрешение внешнего сигнала ;--------- Initialization UART
................................................................................ ..........................
ldi temp,$82 ; Stop предделителя счётчика out GTCCR,temp sei
................................................................................ ... и вот прерывание
TIM2_OVF: inc secd cpi secd,secs breq minute ................................................................................ ..
Конечно многое пропустил из MAIN
Вот и не получается связать TIM2_OVF: с вектором 0x0016 т.к в include (файл m164pdef.inc ) он связан с equ OVF2addr = 0x0016 - не пойму как сие сделать
Спасибо за ответы
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Mar 18 2008, 17:50
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(ILYAUL @ Mar 18 2008, 20:41)  Вот и не получается связать TIM2_OVF: с вектором 0x0016 т.к в include (файл m164pdef.inc ) он связан с equ OVF2addr = 0x0016 - не пойму как сие сделать Спасибо за ответы .org OVF2addr jmp TIM2_OVF ; Timer2 Overflow И вектор сброса у тебя не на месте. Он должен находиться по нулевому адресу. Догадаешься как это сделать?
Сообщение отредактировал Дон Амброзио - Mar 18 2008, 17:53
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 18 2008, 23:38
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(ILYAUL @ Mar 18 2008, 20:57)  для удобства Не понял.. Поясните что Вы имеете в виду Цитата(ILYAUL @ Mar 18 2008, 20:57)  Но я ведь определил , что основная программа должна начинаться на .org 0x003E соотвественно пропустив все вектора т.е оставив их "заложенные" ATMEL прерывания на их местах. Или я не прав? Если у тебя с 0x003E начинается основная программа, то зачем ты в основную программу суёшь вектора? А область памяти, предназначенная для хранения векторов у тебя наоборот пустая. Так не делают
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 19 2008, 10:12
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(domowoj @ Mar 18 2008, 16:44)  .CSEG .ORG 0 rjmp Reset nop;rjmp EXT_INT0; nop;rjmp PC_INT; rjmp TIM1_COMPA rjmp TIM1_ovf rjmp TIM0_OVF Ужас, вы всегда так пишите? А если придется перейти на другой проц, у которого вектора в других адресах? Обычно пишут так: .CSEG .ORG 0 rjmp Reset .ORG OVF2addr rjmp Int_Tmr2 .ORG ANOTHER_DEVaddr rjmp Int_AnotherDev ... .CSEG Reset: ldi r16, LOW(RAMEND) out SPL, r16 ; установка стека ... Int_Tmr2: ... ; обработка прерывания таймера ... При этом численное значение адреса, по которому окажется метка Reset вас абсолютно не должно волновать (это уже к автору темы).
|
|
|
|
|
Mar 19 2008, 10:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(777777 @ Mar 19 2008, 13:12)  Ужас, вы всегда так пишите? А если придется перейти на другой проц, у которого вектора в других адресах? Обычно пишут так:
.CSEG .ORG 0 rjmp Reset .ORG OVF2addr rjmp Int_Tmr2 .ORG ANOTHER_DEVaddr rjmp Int_AnotherDev ...
.CSEG Reset: ldi r16, LOW(RAMEND) out SPL, r16 ; установка стека ...
Int_Tmr2: ... ; обработка прерывания таймера ...
При этом численное значение адреса, по которому окажется метка Reset вас абсолютно не должно волновать (это уже к автору темы). Извините, но я не очень понялкому это было адресовано , ибо приведённый фрагмент -указанный Вами мне не принадлежит (ILYAUL) но за науку лично от меня Спасибо!
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|