Таймеры и каунтеры. Бегущий огонек v2.0
Таймеры и каунтеры. Бегущий огонек v2.0
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 мс. Зачем?
1)Наша задача - подобрать такую тактовую частоту таймера, чтобы он считал до 65535 немного дольше, чем 1/8 секунды (125 мс). Зачем немного дольше? Можете объяснить и нарисовать графики сигналов?
2)Максимальное значение таймера: 2^16 = 65535. Т.е. это максимальное число импульсов которое он может посчитать? И для того чтобы определить за сколько он их посчитает надо умножить это число импульсов на период 1 импульса? Я все правильно понял?
3) Не могу понять что такое тактовая частота, здесь наверно проще нарисовать графики импульсов тактирования. Поможете?
4)Мы уже знаем, что тактовая частота таймера в 64 раза меньше частоты кварца. Значит ее период - в 64 раза больше:
100 нс * 64 = 6,4 мкс. Это период 1 импульса таймера?
5) Нам нужно, чтобы сравнение происходило в момент времени, отстоящий от запуска таймера на 125 мс. Зачем?
- Реклама
1) Чтобы не подбирать тактовую частоту самого МК. Иначе для того, чтобы таймер набирал 65536 тиков за 125 мс, понадобятся тактовые сигналы для МК с периодом 1907,34 нС. Где такой кварц найти? Или отдельно генератор собирать?
Поэтому и делят тактовую частоту, чтобы таймер тикал до верхнего значения больше, чем 125 мс, тогда в компаратор можно будет занести число тиков, которое будет соответствовать по времени 125 мс и сравнить их с числом тиков таймера.
2) Да.
3) Частота синхроимпульсов. Операции выполняются только во время тактового импульса.
4) Это период тактирования таймера. Т.е. таймер прибавляет 1 к своему регистру через каждые 6.4 мкС.
5) А что по условию задачи было?
Нужна задержка срабатывания компаратора таймера в 125 мС, иными словами нам нужно прерывание каждые 125 мс, чтобы переключать светодиоды.
Поэтому и делят тактовую частоту, чтобы таймер тикал до верхнего значения больше, чем 125 мс, тогда в компаратор можно будет занести число тиков, которое будет соответствовать по времени 125 мс и сравнить их с числом тиков таймера.
2) Да.
3) Частота синхроимпульсов. Операции выполняются только во время тактового импульса.
4) Это период тактирования таймера. Т.е. таймер прибавляет 1 к своему регистру через каждые 6.4 мкС.
5) А что по условию задачи было?
Нужна задержка срабатывания компаратора таймера в 125 мС, иными словами нам нужно прерывание каждые 125 мс, чтобы переключать светодиоды.
- Necroteeth
- Потрогал лапой паяльник
- Сообщения: 362
- Зарегистрирован: Вс окт 10, 2010 17:43:48
- Откуда: Воронеж
Re: Таймеры и каунтеры. Бегущий огонек v2.0
почему в примере TCCR1B, а OCR1A?
и вообще, зачем таймер1 делится на части A и B? какое бы отличие в коде было, если бы использовали таймер0 (если его нельзя использовать в этом примере, то почему?)?
и еще: почему в начале программы обработчики прерывания закомментили, а прописали далее? нельзя ли было их в начале программы вообще не писать или обработчик писать там, не комментируя эти строки в начале?
и вообще, зачем таймер1 делится на части A и B? какое бы отличие в коде было, если бы использовали таймер0 (если его нельзя использовать в этом примере, то почему?)?
и еще: почему в начале программы обработчики прерывания закомментили, а прописали далее? нельзя ли было их в начале программы вообще не писать или обработчик писать там, не комментируя эти строки в начале?
- gauss
- Держит паяльник хвостом
- Сообщения: 920
- Зарегистрирован: Сб янв 16, 2010 15:34:57
- Откуда: Sevsk/Moscow
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Здравствуйте. Прочитал статью "Таймеры и каунтеры. Бегущий огонек v2.0".
Проблема в том, что из МК только атмега8А. Посидев с даташитом, вроде разобрался, что к чему - получился такой код (для меги8):
Пишу код в AtmelAVR Studio. Почему-то ругается на строку:
Выводит:
Если что, только начинаю осваивать МК
Проблема в том, что из МК только атмега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
Код: Выделить всё
ldi Temp,RamEndНе подскажете, в чем может быть причина?Error 1 Operand(s) out of range in 'ldi r16,0x45f'
Если что, только начинаю осваивать МК
- Реклама
Re: Таймеры и каунтеры. Бегущий огонек v2.0
потому что в ATmega8 RamEnd, гораздо дальше и у указателя стека два регистра, т.е. RamEnd>255
Код: Выделить всё
ldi R16,low(RamEnd)
out SPL,R16
ldi R16,high(RamEnd)
out SPH,R16- gauss
- Держит паяльник хвостом
- Сообщения: 920
- Зарегистрирован: Сб янв 16, 2010 15:34:57
- Откуда: Sevsk/Moscow
Re: Таймеры и каунтеры. Бегущий огонек v2.0
На такой код ругаться перестал, но прога все равно не работает. Наверно, неправильно какой-нибудь таймер подключил.
Буду искать ошибку
Буду искать ошибку
Re: Таймеры и каунтеры. Бегущий огонек v2.0
а вы привели код полностью?
у вас таблица прерываний обрезана
попробуйте так:
у вас таблица прерываний обрезана
попробуйте так:
Код: Выделить всё
.org 0
rjmp Reset
.org OC1Aaddr
rjmp TIM1_CompA
Reset:- gauss
- Держит паяльник хвостом
- Сообщения: 920
- Зарегистрирован: Сб янв 16, 2010 15:34:57
- Откуда: Sevsk/Moscow
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Заработало, спасибо большое 
Не подскажете, что означает третья строчка кода?
P. S. Код приводил полностью
Не подскажете, что означает третья строчка кода?
Код: Выделить всё
.org OC1AaddrRe: Таймеры и каунтеры. Бегущий огонек v2.0
http://radiokot.ru/start/mcu_fpga/avr/11/
Здравствуйте, уважаемые коты!
У меня тоже такая проблема: переписал эту программу под ATMega8 с учетом даташита, но она не работает. Компилятор при этом не ругается. Таймер использовал Timer 1B, частота кварца 16 МГц.
Файл программы во вложении.
Здравствуйте, уважаемые коты!
У меня тоже такая проблема: переписал эту программу под ATMega8 с учетом даташита, но она не работает. Компилятор при этом не ругается. Таймер использовал Timer 1B, частота кварца 16 МГц.
Файл программы во вложении.
- Вложения
-
- runfire_2.0.asm
- (2.73 КБ) 393 скачивания
Золотое правило химика: Серная кислота не отстирывается!
Каким тупым бы угол не был, косинусу единицу не победить!
Каким тупым бы угол не был, косинусу единицу не победить!
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Неправильно задано прерывание OCIE1B
Код: Выделить всё
ldi T0,1<<OCIE1B ;разрешить прерываение компаратора B
; ldi T0, 0b00000100 ;разрешить прерываение компаратора B
out TIMSK, T0
OUT TIFR,T0
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Действительно, программа теперь заработала, но как-то странно: начинает гореть второй светодиод, доходит до 6, а затем снова на 2...
Золотое правило химика: Серная кислота не отстирывается!
Каким тупым бы угол не был, косинусу единицу не победить!
Каким тупым бы угол не был, косинусу единицу не победить!
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Вроде по программе всё правильно. Начинается со второго и далее по кругу. Возможно в монтаже косяк.
Re: Таймеры и каунтеры. Бегущий огонек v2.0
Не, в монтаже все правильно, потому что предыдущие версии бегущего огня работали нормально.
Возникает такое предположение, что это связано с неправильной инициализацией таймера. Если убрать все прерывания кроме таймера и Reset, то программа вообще не работает. Я уже пробовал даже свою программу написать, но все равно не работает.
Может это связано с предысторией контроллера, потому что я раньше прошивал его под паяльную станцию...
Я смотрел другую ветку по этой статье с ATMega8. Там таймер Timer1 обозначался по-другому в прерываниях. Я поменял и программа не работала.
Я бы перешел к следующему шагу, но ведь не разобравшись на данном этапе, я не смогу изучать программирование контроллеров дальше...
Возникает такое предположение, что это связано с неправильной инициализацией таймера. Если убрать все прерывания кроме таймера и Reset, то программа вообще не работает. Я уже пробовал даже свою программу написать, но все равно не работает.
Может это связано с предысторией контроллера, потому что я раньше прошивал его под паяльную станцию...
Я смотрел другую ветку по этой статье с ATMega8. Там таймер Timer1 обозначался по-другому в прерываниях. Я поменял и программа не работала.
Я бы перешел к следующему шагу, но ведь не разобравшись на данном этапе, я не смогу изучать программирование контроллеров дальше...
Золотое правило химика: Серная кислота не отстирывается!
Каким тупым бы угол не был, косинусу единицу не победить!
Каким тупым бы угол не был, косинусу единицу не победить!


