AVR attiny 261

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Чт май 29, 2014 21:16:21

Сообщение arugon »

Ребят, нужна помощь. В программе выполняется задержка по прерыванию таймера, осуществляется 2 режимами: переполнение и достижение "потолка"(регистр OCR1A). Задержка написана для attiny 2313, надо переписать на attiny 261, однако проблема, регистр OCR1A в 261 стал 8-битным вместо 16-битного в 2313. В итоге надо использовать другой режим работы таймера или другой таймер. Попробовал сделать на таймере 0, но прерывание не происходит(флаг прерывания не устанавливается вроде бы). Добавлю код исходного фрагмента под 2313 и того что я сделал, может быть подскажите где ошибка или поможете с установкой таймера 1, там совсем беда, совсем голову поломал.Спасибо

Код для 2313
;-------------------------Инициализация таймера

ldi temp, high(kzad ) ; Записываем коэффициент задержки
out OCR1AH, temp
ldi temp, low(kzad )
out OCR1AL, temp
ldi temp, 0x03 ; Выбор режима работы таймера
out TCCR1B, temp

;---------------------------Подпрограмма задержки

wait: cpi data, 1 ; Проверяем код задержки
brne w1
ldi temp, 0x40 ; Разрешаем прерывание по совпадению
rjmp w2
w1: ldi temp, 0x80 ; Разрешаем прерывания no переполнению
w2: out TIMSK, temp
clr temp
out TCNT1H,temp ; Обнуляем таймер
out TCNT1L,temp
ldi flz,0 ; Сбрасываем флаг задержки
sei ; Разрешаем прерывания
cpi data, 2 ; Если это задержка 2-го типа
breq w4 ; Переходим к концу подпрограммы
w3: cpi flz, 1 ; Ожидание окончания задержки
brne w3
w4: ret ; Завершаем подпрограмму

;------------------При срабатывании прерывания выполняется
progr: ldi flz,1 ; Установка флага задержки
reti ; Завершаем обработку прерывания


Мой код под 261(таймер 0):
;-------------------------Инициализация таймера

ldi temp, high(kzad ) ; Записываем коэффициент задержки
out OCR0B, temp
ldi temp, low(kzad )
out OCR0A, temp
ldi temp, 0x03 ; Выбор режима работы таймера
out TCCR0B, temp


;---------------------------Подпрограмма задержки
wait: cpi data, 1 ; Проверяем код задержки
brne w1
ldi temp, 0xC0 ; Разрешаем прерывание по совпадению
out TCCR0A, temp
ldi temp,0x19 ; Тут разрешил все возможные прерывания кроме переполнения(ничего другого не пришло в голову)
sts TIMSK, temp
rjmp w2
w1: ldi temp, 0x80 ; Разрешаем прерывания no переполнению
out TCCR0A, temp
ldi temp,0x02
sts TIMSK, temp
w2: clr temp
out TCNT0H,temp ; Обнуляем таймер
out TCNT0L,temp
ldi flz,0 ; Сбрасываем флаг задержки
sei ; Разрешаем прерывания
cpi data, 2 ; Если это задержка 2-го типа
breq w4 ; Переходим к концу подпрограммы
w3: cpi flz, 1 ; Ожидание окончания задержки
brne w3
w4: ret ; Завершаем подпрограмму

;-----------------------Прерывание

progr: ldi flz,1 ; Установка флага задержки
reti ; Завершаем обработку прерывания


буду благодарен любому совету
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15776
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Однако даташит 261-й курить досконально надо...
Установка конфигурации таймера несомненно другая будет - Т0 в 261й гораздо навороченнее, чем Т1 в 2313.
:cry:
Реклама
Родился
Сообщения: 3
Зарегистрирован: Чт май 29, 2014 21:16:21

Сообщение arugon »

да знаю, только голову поломал уже, как в 16-битном варианте таймер 0 сконфигурировать с "потолком"?
может ещё варианты будут? надо курсовой доделывать
Родился
Сообщения: 3
Зарегистрирован: Чт май 29, 2014 21:16:21

Сообщение arugon »

Нашел решение. Таймер 1 в 261 может быть только 8 и 10 битным, его брать не будем. Таймер 0 в 16-битном режиме может работать только в normal моде(переполнение). Чтобы создать задержку меньшую, чем полное переполнению таймера(полное переполнение при делителе 64 и частоте 4 МГц - 1 с), например, 48мс, задаем начальное значение TCNT0H = 0xF8. Тогда получается что таймер переполняется примерно за 47.6мс, что нам и нужно.
Таким образом имеем существенное упрощение жизни, так как по сравнению с предыдущим вариантом режим работы таймера остался один - переполнение(работы с "потолком" теперь не нужно), соответственно и прерывание одно, чтобы изменить время задержки играемся начальным значением регистров TCNT0H и TCNT0L.
BOB51 спасибо, что откликнулся.
Всем удачи!
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»