Обсуждаем контроллеры компании Atmel.
Ответить

как сконфигурировать таймер?? (срочненько

Чт сен 21, 2006 18:19:56

помогите плз
мне нужно чтоб у меня какой-то цикл выполнялся по истечении определнного времени скажем 50 мс
как мне это сделать
(в дельфи я использовал таймер системный (системное время и по нему ориентировался)
а как мне это делать для ATmega162
в ассемблере какие есть процедры или функции, чтобы задать прерывание и заставить выполнить немедленно именно этот цикл
находящийся скажем по метке Start_proc:

Чт сен 21, 2006 19:32:07

1. конфигурируете таймер на примерно нужное время
2. устанавливаете нужные прерывания
3. отлавливаете прерывания
4. корректируете таймер.

Пт сен 22, 2006 09:27:12

2 xelos
Проблема, что я такую же себе схемку в уме давно нарисовал, кроме последнего пункта, конфигурировать таймер по-моему не надо, сразу выставляешь, чтоб он только по 50 мс отсчитывал и все...
или я ошибаюсь??????????

- в любом случае, это слова, А КАК МНЕ это сделать?? чего писать, куда писать???
по аналогии с Дельфи, я просто использовал системный таймер (компонента Clock или можно процедуру Timer использовать и просто в цикле сверять сколько миллисекунд прошло!!!)
как в АВР-асме это сделать??

Пт сен 22, 2006 19:06:27

http://www.radiokot.ru/start/mcu_fpga/avr/11 - про таймеры
http://www.radiokot.ru/start/mcu_fpga/avr/16 - про опрос клавиатуры

просто писать то, что там есть второй раз неохота. Там все очень подробно. Советую посмотреть сорсы. Лично когда мне что-то непонятно, то я читаю это второй раз. Если опять непонятно, то см. п. 1 -)

По поводу прерывания. Вначале мы пишем:
.cseg
.org 0

rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM_CAPT1 ; Timer1 Capture Handler
rjmp TIM_COMP1 ; Timer1 Compare Handler
rjmp TIM_OVF1 ; Timer1 Overflow Handler
rjmp TIM_OVF0 ; Timer0 Overflow Handler
rjmp UART_RXC ; UART RX Complete Handler
rjmp UART_DRE ; UDR Empty Handler
rjmp UART_TXC ; UART TX Complete Handler
rjmp ANA_COMP ; Analog Comparator Handler

это вектора прерываний. Правда, для 2313. Для мени они будут другие. См датащит. Вообще, полезный документ, советую от корки до корки -)

Пн сен 25, 2006 10:00:57

угу
спасибо большое. просто еще не дошел до этого раздела
экзамены экстернатом сдаю в универе по дискретке и вычмату -)

Чт сен 28, 2006 12:50:58

ага нифига чего-то не пашет
значит написано
Код:
rjmp TIMER1COMPBaddr
TIMER1COMPBaddr:
ldi Temp0,0            ;обнуление таймера
out TCNT1H,Temp0
out TCNT1L,Temp0

и компилятор пишет
code.asm:108: Error : Label 'TIMER1COMPBaddr' already defined at line 665 in 'C:\avr\tavrasm\appnotes\m162def.inc'
вот что в этом файле на этой строке написано
Код:
.equ   TIMER1COMPBaddr   = $01C

Пт сен 29, 2006 08:24:01

ну помогите кто-н
почему такая ерунденька???

Пт сен 29, 2006 14:13:45

CyberMerlin писал(а):ага нифига чего-то не пашет
значит написано
Код:
rjmp TIMER1COMPBaddr
TIMER1COMPBaddr:
ldi Temp0,0            ;обнуление таймера
out TCNT1H,Temp0
out TCNT1L,Temp0

и компилятор пишет
code.asm:108: Error : Label 'TIMER1COMPBaddr' already defined at line 665 in 'C:\avr\tavrasm\appnotes\m162def.inc'
вот что в этом файле на этой строке написано
Код:
.equ   TIMER1COMPBaddr   = $01C



переводчик promt.ru jy-лайн !

=======

пишет что метка, название

TIMER1COMPBaddr:

уже определена (используется) в файле m162def.inc

назовите иначе.
=======

и на Си переходите.

Пт сен 29, 2006 15:50:57

ну так а как мне добавить
Код:
ldi Temp0,0            ;обнуление таймера
out TCNT1H,Temp0
out TCNT1L,Temp0

под этой TIMER1COMPBaddr меткой ?? и чтоб было определение на адрес $01C ?????

в обучалке немного непонятно описано это

получается из аппноута я должен убрать
но тогда по идее системные нарушения будут (эта метка должная быть строго локализована как понимаю (в обучалке это Timer1_comp1 )

если я сейчас займусь изучать еще С, у меня время уйдет, а так у меня основной цикл, нет ВСЁ готово, только вот эти ошибки есть, ну пару мелких вопросов висят, так что быстрее будет на асме уж дописать

Пт сен 29, 2006 19:27:22

сумбурно ты пишешь, не могу понять что тебе нужно сделать ?

метку ты можешь назвать как тебе угодно лишь бы такого называния уже не было ранее.

Пт сен 29, 2006 19:28:40

на электрониксе начали тоже курс лепить - там на асме, вроде самые азы - звгляни: http://nix-06.nm.ru/

Пн окт 02, 2006 12:04:13

не работает сцылко

в Обучалку глянь вот сюда, http://www.radiokot.ru/start/mcu_fpga/avr/11/
переменная была в appnotes в файле *.inc
народ ну кто-н кто не бездумно читал и примеры делал по ОБУЧАЛКЕ
помогите плз

Создатель ОБУЧАЛКИ плз ответь на вопрос ну проблема же....
админ форума, плз сошли создателя сюда.
я хвост в узел уже заворачиваю
и гривку взъерошил

Пн окт 02, 2006 12:12:40

CyberMerlin писал(а):не работает сцылко


проверил. работает.

Пн окт 02, 2006 13:06:44

Аз есмь Создатель. Немного пробежался по предыдущим постам. Ниче не понял. Поэтому можно вкратце, что имеем на этот момент? Какова задача и какие проблемы при ее реализации?

Пн окт 02, 2006 14:43:18

значиться так
- как в обучалке было сказано я вставитл следующий код в свой модуль
Код:
rjmp TIMER1COMPBaddr
TIMER1COMPBaddr:
   ldi Temp0,0      ;обнуление таймера
   out TCNT1H,Temp0
   out TCNT1L,Temp0

начал компилировать, а он (компилятор) пишет
code.asm:108: Error : Label 'TIMER1COMPBaddr' already defined at line 665 in 'C:\avr\tavrasm\appnotes\m162def.inc'

залез я в файл этот там строка
Код:
.equ   TIMER1COMPBaddr   = $01C

полагаю Ваша рекомендация будет - УДАЛИ её из файла
тогда у меня вопрос а будет ли работать у меня тогда нормально??
и зачем в ИНК файле эта строка??
----------
- в обучалке советовалось такое вписать в модуль
Код:
ldi Temp0,RamEnd   ;инициализация стека for work in the RCALL
out SPL,Temp0

а компилятор пишеть, что не могу туда поместить, якобы выходит за рамки адресного пространства
warning: Constant 0x4FF out of range (0x00-0xFF)

как исправить??

Пн окт 02, 2006 15:08:15

CyberMerlin писал(а):- в обучалке советовалось такое вписать в модуль
Код:
ldi Temp0,RamEnd   ;инициализация стека for work in the RCALL
out SPL,Temp0



off: круто ! я не стал забивать голову асмом и поручаю биться с ним компилятору.

Пн окт 02, 2006 15:12:46

CyberMerlin писал(а):полагаю Ваша рекомендация будет - УДАЛИ её из файла


я ж написал вам выше - переименуйте ВАШУ метку !

Пн окт 02, 2006 15:48:35

в том то и дело, что согласно ОБУЧАЛКи я должен именно ее использовать, чтоб у меня работал Компаратор таймера!
если заменю, таймеру несчем сравнивать будет (если правильно понял ОБУЧАЛКУ)

Пн окт 02, 2006 16:14:55

Уважаемый, приведите текст обучалки, в котором ТАК написано! ;) И тогда мы будем разбираццо :)

Пн окт 02, 2006 17:27:18

да всегда пожалуйста
мррррр
привожу только куски кодов из ОБУЧАЛКИ (понимаете почему)
если мы, скажем, хотим активизировать прерывание Timer1_comp1, то мы должны по адресу $004 поставить ссылку на подпрограмму - обработчик этого прерывания. А вообще, лучше расставить в начале программы ссылки на все прерывания. Давайте так и сделаем

Код:
.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1

В пятой строчке стоит безусловный переход на метку Timer1_comp1. Где-то ниже в программе, мы пишем обработчик этого прерывания и в его начале ставим эту метку.

Код:
Reset:
INT_0:
INT_1:
Timer1_capt1:
Timer1_comp1:

http://www.radiokot.ru/start/mcu_fpga/avr/10/
Код:
Timer1_comp1:
         ldi Temp,0            ;обнуление таймера
         out TCNT1H,Temp
         out TCNT1L,Temp

http://www.radiokot.ru/start/mcu_fpga/avr/11/
Для того, чтобы команда rcall смогла работать, нам надо-таки инициализировать стек. То есть - поставить указатель стека.

Код:
ldi Temp,RamEnd       ;инициализация стека
          out SPL,Temp

http://www.radiokot.ru/start/mcu_fpga/avr/08/
вроде все
Ответить