Страница 1 из 1
Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Сб окт 24, 2009 08:22:07
anon2009
http://radiokot.ru/start/mcu_fpga/avr/11/
1)Наша задача - подобрать такую тактовую частоту таймера, чтобы он считал до 65535 немного дольше, чем 1/8 секунды (125 мс). Зачем немного дольше? Можете объяснить и нарисовать графики сигналов?
2)Максимальное значение таймера: 2^16 = 65535. Т.е. это максимальное число импульсов которое он может посчитать? И для того чтобы определить за сколько он их посчитает надо умножить это число импульсов на период 1 импульса? Я все правильно понял?
3) Не могу понять что такое тактовая частота, здесь наверно проще нарисовать графики импульсов тактирования. Поможете?
4)Мы уже знаем, что тактовая частота таймера в 64 раза меньше частоты кварца. Значит ее период - в 64 раза больше:
100 нс * 64 = 6,4 мкс. Это период 1 импульса таймера?
5) Нам нужно, чтобы сравнение происходило в момент времени, отстоящий от запуска таймера на 125 мс. Зачем?
Добавлено: Сб окт 24, 2009 19:29:42
anon2009
сложные вопросы?
Добавлено: Сб окт 24, 2009 20:00:21
GRAF
1) Чтобы не подбирать тактовую частоту самого МК. Иначе для того, чтобы таймер набирал 65536 тиков за 125 мс, понадобятся тактовые сигналы для МК с периодом 1907,34 нС. Где такой кварц найти? Или отдельно генератор собирать?
Поэтому и делят тактовую частоту, чтобы таймер тикал до верхнего значения больше, чем 125 мс, тогда в компаратор можно будет занести число тиков, которое будет соответствовать по времени 125 мс и сравнить их с числом тиков таймера.
2) Да.
3) Частота синхроимпульсов. Операции выполняются только во время тактового импульса.
4) Это период тактирования таймера. Т.е. таймер прибавляет 1 к своему регистру через каждые 6.4 мкС.
5) А что по условию задачи было?
Нужна задержка срабатывания компаратора таймера в 125 мС, иными словами нам нужно прерывание каждые 125 мс, чтобы переключать светодиоды.
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Пт янв 14, 2011 21:30:19
Necroteeth
почему в примере TCCR1B, а OCR1A?
и вообще, зачем таймер1 делится на части A и B? какое бы отличие в коде было, если бы использовали таймер0 (если его нельзя использовать в этом примере, то почему?)?
и еще: почему в начале программы обработчики прерывания закомментили, а прописали далее? нельзя ли было их в начале программы вообще не писать или обработчик писать там, не комментируя эти строки в начале?
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Ср июл 25, 2012 16:35:00
gauss
Здравствуйте. Прочитал статью "Таймеры и каунтеры. Бегущий огонек v2.0".
Проблема в том, что из МК только атмега8А. Посидев с даташитом, вроде разобрался, что к чему - получился такой код (для меги8):
Код: Выделить всё
.def Temp=R16
.def Temp2=R17
.def Temp3=R18
.def Temp4=R19
.def Temp5=R20
.cseg
.org 0
rjmp Reset
rjmp TIM1_CompA
Reset:
ldi Temp, 0b11111111
out DDRB, Temp
ldi Temp, 0b00010000
out TIMSK, Temp
ldi Temp, 0b00000011
out TCCR1B, Temp
ldi Temp, 0x3D
out OCR1AH, Temp
ldi Temp, 0x09
out OCR1AL, Temp
ldi Temp,RamEnd
out SPL, Temp
ldi Temp2, 0b00000001
ldi Temp, 0
out TCNT1H, Temp
out TCNT1L, Temp
sei
Inf: rjmp Inf
TIM1_CompA:
ldi Temp,0
out TCNT1H, Temp
out TCNT1L, Temp
Shift:
cpi Temp2, 0b10000000
breq Init
lsl Temp2
rjmp Output
Init: ldi Temp2, 0b00000001
Output:
out PortB, Temp2
reti
Пишу код в AtmelAVR Studio. Почему-то ругается на строку:
Выводит:
Error 1 Operand(s) out of range in 'ldi r16,0x45f'
Не подскажете, в чем может быть причина?
Если что, только начинаю осваивать МК

Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Ср июл 25, 2012 20:51:22
BVS
потому что в ATmega8 RamEnd, гораздо дальше и у указателя стека два регистра, т.е. RamEnd>255
Код: Выделить всё
ldi R16,low(RamEnd)
out SPL,R16
ldi R16,high(RamEnd)
out SPH,R16
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Ср июл 25, 2012 21:14:04
gauss
На такой код ругаться перестал, но прога все равно не работает. Наверно, неправильно какой-нибудь таймер подключил.
Буду искать ошибку
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Чт июл 26, 2012 16:14:18
gauss
ошибку не нашел

Помогите, пожалуйста

Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Чт июл 26, 2012 20:52:29
BVS
а вы привели код полностью?
у вас таблица прерываний обрезана
попробуйте так:
Код: Выделить всё
.org 0
rjmp Reset
.org OC1Aaddr
rjmp TIM1_CompA
Reset:
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Чт июл 26, 2012 21:17:48
gauss
Заработало, спасибо большое

Не подскажете, что означает третья строчка кода?
P. S. Код приводил полностью
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Чт июл 26, 2012 22:02:40
BVS
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Вс окт 16, 2016 12:09:01
Evgenij
http://radiokot.ru/start/mcu_fpga/avr/11/
Здравствуйте, уважаемые коты!
У меня тоже такая проблема: переписал эту программу под ATMega8 с учетом даташита, но она не работает. Компилятор при этом не ругается. Таймер использовал Timer 1B, частота кварца 16 МГц.
Файл программы во вложении.
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Вс окт 16, 2016 12:29:28
akl
Неправильно задано прерывание OCIE1B
Код: Выделить всё
ldi T0,1<<OCIE1B ;разрешить прерываение компаратора B
; ldi T0, 0b00000100 ;разрешить прерываение компаратора B
out TIMSK, T0
OUT TIFR,T0
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Вс окт 16, 2016 12:40:22
Evgenij
Действительно, программа теперь заработала, но как-то странно: начинает гореть второй светодиод, доходит до 6, а затем снова на 2...
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Пн окт 17, 2016 06:05:55
akl
Вроде по программе всё правильно. Начинается со второго и далее по кругу. Возможно в монтаже косяк.
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Добавлено: Пн окт 17, 2016 19:11:40
Evgenij
Не, в монтаже все правильно, потому что предыдущие версии бегущего огня работали нормально.
Возникает такое предположение, что это связано с неправильной инициализацией таймера. Если убрать все прерывания кроме таймера и Reset, то программа вообще не работает. Я уже пробовал даже свою программу написать, но все равно не работает.
Может это связано с предысторией контроллера, потому что я раньше прошивал его под паяльную станцию...
Я смотрел другую ветку по этой статье с ATMega8. Там таймер Timer1 обозначался по-другому в прерываниях. Я поменял и программа не работала.
Я бы перешел к следующему шагу, но ведь не разобравшись на данном этапе, я не смогу изучать программирование контроллеров дальше...