реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Файл Def и прерывание таймера
ILYAUL
сообщение Mar 18 2008, 13:21
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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
Помогите понять в чём дело?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Mar 18 2008, 13:28
Сообщение #2


Местный
***

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



Ничего не понял.. Как-то путанно объясняешь..Приведи фрагмент кода


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
domowoj
сообщение Mar 18 2008, 13:44
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Нужно взять стандартную шапку для вашего МК
Это для ATtiny45
***************************
.INCLUDE "tn45def.inc"
.DEVICE ATtiny45

.equ pb=portb;

.set ae=portb2
.set ae1=portb1
.set ae2=portb4

.CSEG
.ORG 0
rjmp Reset
nop;rjmp EXT_INT0;
nop;rjmp PC_INT;
rjmp TIM1_COMPA
rjmp TIM1_ovf
rjmp TIM0_OVF
nop;rjmp EE_RDY
nop;rjmp ANA_COMP
nop;rjmp ADCC
nop;rjmp TIM1_COMPB
nop;rjmp TIM0_COMPA
nop;rjmp TIM0_COMPB
nop;rjmp WDT
nop;rjmp USI_START
nop;rjmp USI_OVF
.ORG $10

Reset:
wdr
; настройка направления работы линий портов
;

TIM1_ovf:
;тело п/п прерывания
reti
*****************
По адресу вектора прерывания должен стоять rjmp на тело п\п прерывания

Сообщение отредактировал domowoj - Mar 18 2008, 13:47


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
GDI
сообщение Mar 18 2008, 14:53
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Цитата
C:\Program Files\Atmel\AVR Tools\project\wire.asm(22): error: syntax error, unexpected SYMBOL, expecting REGISTER
Помогите понять в чём дело?

Он ругается на 22ю строку файла wire.asm ожидает там увидеть, видимо регистр, а записано там что то другое, так что смотрите что там у вас записано, или запостите сюда именно эту строку.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 18 2008, 17:41
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 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 - не пойму как сие сделать


Спасибо за ответы


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Mar 18 2008, 17:50
Сообщение #6


Местный
***

Группа: Участник*
Сообщений: 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


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 18 2008, 17:57
Сообщение #7


Профессионал
*****

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



Цитата(Дон Амброзио @ Mar 18 2008, 20:50) *
.org OVF2addr
jmp TIM2_OVF ; Timer2 Overflow

И вектор сброса у тебя не на месте.

Он должен находиться по нулевому адресу

Да я знаю, что RESET в 0x00( для удобства)

Но я ведь определил , что основная программа должна начинаться на .org 0x003E соотвественно пропустив все вектора т.е оставив их "заложенные" ATMEL прерывания на их местах. Или я не прав?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Mar 18 2008, 23:38
Сообщение #8


Местный
***

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



Цитата(ILYAUL @ Mar 18 2008, 20:57) *
для удобства

Не понял.. Поясните что Вы имеете в виду

Цитата(ILYAUL @ Mar 18 2008, 20:57) *
Но я ведь определил , что основная программа должна начинаться на .org 0x003E соотвественно пропустив все вектора т.е оставив их "заложенные" ATMEL прерывания на их местах. Или я не прав?

Если у тебя с 0x003E начинается основная программа, то зачем ты в основную программу суёшь вектора?
А область памяти, предназначенная для хранения векторов у тебя наоборот пустая.

Так не делают


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 18 2008, 23:51
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(ILYAUL @ Mar 18 2008, 21:57) *
Да я знаю, что RESET в 0x00( для удобства)

Но я ведь определил , что основная программа должна начинаться на .org 0x003E соотвественно пропустив все вектора т.е оставив их "заложенные" ATMEL прерывания на их местах. Или я не прав?


smile.gif

Ты не определил. Ты задал ассемблеру задание генерить код программы начиная с адреса 3E. Но процессор и ассемблер - это разные вещи. Процессор будет стартовать с адреса 0 (либо, если выставить фузами, то с адреса начала bootloader-а. И уж никак не с адреса 3E.
Go to the top of the page
 
+Quote Post
777777
сообщение Mar 19 2008, 10:12
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 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 вас абсолютно не должно волновать (это уже к автору темы).
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Mar 19 2008, 10:28
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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)
но за науку лично от меня Спасибо!


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016