таймер в AVR (пара вопросов)

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Сообщение foton6 »

Доброго времени суток.
Еще вчера начал собирать секундомер(просто для практики в AVR и электронике).
Соответственно понадобились прерывания по таймеру.
Все прочитал и разобрался, кроме 1 вещи:
есть регистры в которые записываться значения для сравнения или старта с определенного "места".
Эти регистры состоят из двух байт: младшего и старшего.
Вот я не понимаю как ими пользоваться.
В моем случаи это регистр OCR1A состоящий из OCR1AH и OCR1AL.

Нужно чтобы прерывание выскакивало при достижении таймера 7813(1 сек).
Как это число записать в регистр OCR1A. Или я что-то не так понял в работе таймера?

Можно ли как то "снять" текущее состояние таймера?(или осущ. паузу).

Если обрабатывается другое прерывание(внешнее в моем случаи) таймер прерывается или продолжает тикать ?

P.S.

Чтобы не создавать лишнего мусора вопрос в данной темы:
Купил вот такую шутку http://chip-cont.ru/details.aspx?ProductID=IDP0018514
Чтобы отображать разные цифры нужно гасить и зажигать их поочередно с такой частотой чтобы не видел чел. глаз? или есть другие способы корректного отображения?
Реклама
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Эти регистры состоят из двух байт: младшего и старшего.
Вот я не понимаю как ими пользоваться.

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

LDI R20,HIGH(7813)
LDI R2,LOW(7813)
OUT OCR1AH,R20
OUT OCR1AL,R21  ;занести в 16-разрядный регистр периферии

IN R22,TCNT1L
IN R23,TCNT1H   ; чтение 16-разрядного регистра периферии
Изображение

Таймер не запускается, не останавливается без команды и все остальные действия контроллера на него влияния не оказывают.
По индикации - здесь, в обучалке, есть прекрасная статья о динамической индикации
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 126
Зарегистрирован: Пн ноя 05, 2012 22:23:32
Откуда: Санкт-Петербург

Сообщение VanyaSV »

а какой контроллер используете?
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Грубо говоря число переводишь в двоичный вид потом старшую часть из 16 бит заносишь в регистр с индексом H, а младшую часть в L. Чтобы число не разбивать на части препроцессор понимает такие вещи как HIGH() и LOW() которые в качестве реультата оставляют старшую и младшую часть числа соответственно.

И потом, при работе с 16-битными регистрами имеется одна особенность обусловленная тем что они разбиты на две половинки и не могут быть прочитаны за один раз. Особенность заключается в последовательности записи в регистры и чтения из регистров. Что собственно озвучено в предыдущем комментарии.

Таймер никогда НЕ ОСТАНАВЛИВАЕТСЯ если его не остановить дополнительными условиями - например в синхронном режиме, счет таймера может управляться внешним сигналом и т.п.

Надо при этом понимать, что изменение содержимого таймера может сменится во время чтения - последовательность считывания регистров гарантирует(гарантия аппаратная в виде регистра-защелки) что прочитается значение актуальное на конкретный момент времени, а не старшая часть от одного момента, а младшая от другого.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

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