Страница 1 из 1

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

Добавлено: Пт июл 05, 2013 19:20:49
halisi
Доброго времени суток.Решил заняться изучением микроконтроллеров AVR.
Начал читать статьи в обучалке и параллельно моделировать все то что там приводится в PROTEUS(нет возможности спаять схемку).
Дошел до примеров работы с таймерами/счетчиками http://radiokot.ru/start/mcu_fpga/avr/11/

Собственно все вроде понятно и дай думаю сделаю задержку на переключение между светодиодами в 1 секунду при работе контроллера на частоте 4 МГц.Расчеты под спойлером
СпойлерПри работе МК с частотой 4 МГц, период будет равняться 250 нс
Надо подобрать частоту таймера что бы он считал 65536 чуть дольше чем 1 секунда.
65536*250 нс=16,384 мс
16,384 * 8= 131,072 мс не подходит
16,384 *64=1048,576 мс Вот оно=)
Значит 4 МГц будем делить на 64

Тактовая частота таймера в 64 раза меньше частоты кварца. Значит ее период - в 64 раза больше:
250 нс * 64 = 16 мкс.
Нам нужно, чтобы сравнение происходило в момент времени, отстоящий от запуска таймера на 1 сек.
Считаем количество тактовых импульсов, которое пройдет за это время:
1 сек /16 мкс = 62500 (10) имп. = F424 (16)


Программу переписал,числа по регистрам "разложил"
Спойлер

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

.include "2313def.inc"

.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
          reti

reset:

ldi r17,255; настройка портов
out DDRB,R17

ldi r17,0b01000000;разрешить прерывание комаратора
out TIMSK,R17

ldi r17,0b00000011;тактовый сигнал СК/64
out TCCR1B,r17

;настройка компаратора 62500
ldi r17,0xF4
out OCR1AH,r17
ldi r17,24
out OCR1AL,r17

ldi R25,RamEnd  ;загрузить в регистр адрес последней ячейки ОЗУ
out SPL,R25    ;вывести в SPL значение из Temp


ldi R18,0b00000001

ldi r17,0
out tcnt1h,r17
out tcnt1h,r17
sei

inf:
rjmp inf



Timer1_comp1:
ldi r17,0
out TCNT1H,r17
out TCNT1L,r17


cpi r18,0b00000001
breq Zagruzka
lsr r18
rjmp outputport

zagruzka:
ldi r18,0b10000000

outputport:
out portB,r18
reti


Программу засунул в МК, включаю моделирование и...
диоды мигают, но с задержкой ~ 8 секунд.

Хотелось бы узнать где я допустил ошибку или идти на форум по работе с протеусом!

Настройка МК и Моделирование на картинках
задержка.png
(160.31 КБ) 312 скачиваний

настройки.jpg
(205.57 КБ) 331 скачивание

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

Добавлено: Пт июл 05, 2013 19:24:20
pcb
CKDIV поставь унпрограммед :idea:

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

Добавлено: Пт июл 05, 2013 20:15:54
halisi
Спасибо. Заработало. Пошел читать как работает протеус=)

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

Добавлено: Пт июл 05, 2013 22:27:43
zero648
Включи режим СТС таймера и тогда при совпадении TCNT1 сам сбросится в "0", и тогда вот этого не надо в обработчике:

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

ldi r17,0
out TCNT1H,r17
out TCNT1L,r17

во-вторых, не забывай что "0" для таймера тоже число, по-этому правильно будет загрузить в OCR1 не 62500, а 62500-1.

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

Добавлено: Сб июл 06, 2013 00:31:28
halisi
zero648 писал(а):Включи режим СТС таймера и тогда при совпадении TCNT1 сам сбросится в "0", и тогда вот этого не надо в обработчике:

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

ldi r17,0
out TCNT1H,r17
out TCNT1L,r17

во-вторых, не забывай что "0" для таймера тоже число, по-этому правильно будет загрузить в OCR1 не 62500, а 62500-1.


Спасибо!Учту.