Таймеры и каунтеры. Бегущий огонек v2.0

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


Ответить
anon2009
Родился
Сообщения: 13
Зарегистрирован: Сб окт 24, 2009 08:18:47

Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение 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 мс. Зачем?
Реклама
anon2009
Родился
Сообщения: 13
Зарегистрирован: Сб окт 24, 2009 08:18:47

Сообщение anon2009 »

сложные вопросы?
Реклама
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

1) Чтобы не подбирать тактовую частоту самого МК. Иначе для того, чтобы таймер набирал 65536 тиков за 125 мс, понадобятся тактовые сигналы для МК с периодом 1907,34 нС. Где такой кварц найти? Или отдельно генератор собирать?
Поэтому и делят тактовую частоту, чтобы таймер тикал до верхнего значения больше, чем 125 мс, тогда в компаратор можно будет занести число тиков, которое будет соответствовать по времени 125 мс и сравнить их с числом тиков таймера.

2) Да.

3) Частота синхроимпульсов. Операции выполняются только во время тактового импульса.

4) Это период тактирования таймера. Т.е. таймер прибавляет 1 к своему регистру через каждые 6.4 мкС.

5) А что по условию задачи было?
Нужна задержка срабатывания компаратора таймера в 125 мС, иными словами нам нужно прерывание каждые 125 мс, чтобы переключать светодиоды.
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение Necroteeth »

почему в примере TCCR1B, а OCR1A?
и вообще, зачем таймер1 делится на части A и B? какое бы отличие в коде было, если бы использовали таймер0 (если его нельзя использовать в этом примере, то почему?)?
и еще: почему в начале программы обработчики прерывания закомментили, а прописали далее? нельзя ли было их в начале программы вообще не писать или обработчик писать там, не комментируя эти строки в начале?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение 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. Почему-то ругается на строку:

Код: Выделить всё

ldi Temp,RamEnd
Выводит:
Error 1 Operand(s) out of range in 'ldi r16,0x45f'
Не подскажете, в чем может быть причина?
Если что, только начинаю осваивать МК :)
:idea:
Реклама
BVS
Потрогал лапой паяльник
Сообщения: 336
Зарегистрирован: Пн май 23, 2011 18:27:41

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение BVS »

потому что в 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

Сообщение gauss »

На такой код ругаться перестал, но прога все равно не работает. Наверно, неправильно какой-нибудь таймер подключил.
Буду искать ошибку
:idea:
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение gauss »

ошибку не нашел :(
Помогите, пожалуйста :)
:idea:
BVS
Потрогал лапой паяльник
Сообщения: 336
Зарегистрирован: Пн май 23, 2011 18:27:41

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение BVS »

а вы привели код полностью?
у вас таблица прерываний обрезана
попробуйте так:

Код: Выделить всё

.org 0
rjmp Reset
.org	OC1Aaddr
rjmp TIM1_CompA
Reset:
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение gauss »

Заработало, спасибо большое :)
Не подскажете, что означает третья строчка кода?

Код: Выделить всё

.org   OC1Aaddr
P. S. Код приводил полностью
:idea:
BVS
Потрогал лапой паяльник
Сообщения: 336
Зарегистрирован: Пн май 23, 2011 18:27:41

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение BVS »

Аватара пользователя
Evgenij
Мучитель микросхем
Сообщения: 407
Зарегистрирован: Чт авг 13, 2009 12:17:49

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение Evgenij »

http://radiokot.ru/start/mcu_fpga/avr/11/
Здравствуйте, уважаемые коты!
У меня тоже такая проблема: переписал эту программу под ATMega8 с учетом даташита, но она не работает. Компилятор при этом не ругается. Таймер использовал Timer 1B, частота кварца 16 МГц.
Файл программы во вложении.
Вложения
runfire_2.0.asm
(2.73 КБ) 393 скачивания
Золотое правило химика: Серная кислота не отстирывается!
Каким тупым бы угол не был, косинусу единицу не победить!
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение akl »

Неправильно задано прерывание OCIE1B

Код: Выделить всё

	ldi T0,1<<OCIE1B		;разрешить прерываение компаратора B
;	ldi T0, 0b00000100		;разрешить прерываение компаратора B
	out TIMSK, T0
	OUT	TIFR,T0
Аватара пользователя
Evgenij
Мучитель микросхем
Сообщения: 407
Зарегистрирован: Чт авг 13, 2009 12:17:49

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение Evgenij »

Действительно, программа теперь заработала, но как-то странно: начинает гореть второй светодиод, доходит до 6, а затем снова на 2...
Золотое правило химика: Серная кислота не отстирывается!
Каким тупым бы угол не был, косинусу единицу не победить!
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение akl »

Вроде по программе всё правильно. Начинается со второго и далее по кругу. Возможно в монтаже косяк.
Аватара пользователя
Evgenij
Мучитель микросхем
Сообщения: 407
Зарегистрирован: Чт авг 13, 2009 12:17:49

Re: Таймеры и каунтеры. Бегущий огонек v2.0

Сообщение Evgenij »

Не, в монтаже все правильно, потому что предыдущие версии бегущего огня работали нормально.
Возникает такое предположение, что это связано с неправильной инициализацией таймера. Если убрать все прерывания кроме таймера и Reset, то программа вообще не работает. Я уже пробовал даже свою программу написать, но все равно не работает.
Может это связано с предысторией контроллера, потому что я раньше прошивал его под паяльную станцию...
Я смотрел другую ветку по этой статье с ATMega8. Там таймер Timer1 обозначался по-другому в прерываниях. Я поменял и программа не работала.
Я бы перешел к следующему шагу, но ведь не разобравшись на данном этапе, я не смогу изучать программирование контроллеров дальше...
Золотое правило химика: Серная кислота не отстирывается!
Каким тупым бы угол не был, косинусу единицу не победить!
Ответить

Вернуться в «Статьи»