AVR attiny 261
Добавлено: Чт май 29, 2014 21:35:59
Ребят, нужна помощь. В программе выполняется задержка по прерыванию таймера, осуществляется 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 ; Завершаем обработку прерывания
буду благодарен любому совету
Код для 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 ; Завершаем обработку прерывания
буду благодарен любому совету