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

Обсуждаем контроллеры компании Atmel.
Ответить
halisi
Родился
Сообщения: 19
Зарегистрирован: Пн мар 11, 2013 01:46:59

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

Сообщение 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 скачивание
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

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

Сообщение pcb »

CKDIV поставь унпрограммед :idea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
halisi
Родился
Сообщения: 19
Зарегистрирован: Пн мар 11, 2013 01:46:59

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

Сообщение halisi »

Спасибо. Заработало. Пошел читать как работает протеус=)
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Включи режим СТС таймера и тогда при совпадении TCNT1 сам сбросится в "0", и тогда вот этого не надо в обработчике:

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

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

во-вторых, не забывай что "0" для таймера тоже число, по-этому правильно будет загрузить в OCR1 не 62500, а 62500-1.
halisi
Родился
Сообщения: 19
Зарегистрирован: Пн мар 11, 2013 01:46:59

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

Сообщение halisi »

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

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

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

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


Спасибо!Учту.
Ответить

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