Таймеры/счётчики в AVR
Объясните мне, никак не могу взять в толк, TCCR1A и TCCR1B в чём прикол?
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
- Реклама
Все приколы расписаны со стр. 96
http://www.atmel.com/images/atmel-2486- ... asheet.pdf
еще приколы
тут http://easyelectronics.ru/avr-uchebnyj- ... jmery.html
и
тут http://easyelectronics.ru/avr-uchebnyj- ... -shim.html
http://www.atmel.com/images/atmel-2486- ... asheet.pdf
еще приколы
тут http://easyelectronics.ru/avr-uchebnyj- ... jmery.html
и
тут http://easyelectronics.ru/avr-uchebnyj- ... -shim.html
only pure true norwegian blackx 
А в двух словах не можете объяснить? Что-то не вкуриваю...... 
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Два слова: не могу.
Читайте, разбирайтесь и задавайте конкретные вопросы.
Читайте, разбирайтесь и задавайте конкретные вопросы.
only pure true norwegian blackx 
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
- Реклама
Я просто не могу понять разницы между TCCR1A и TCCR1B..... Просто во многих примерах TCCR1A=0х00; НО, в некоторых какому-то числу.....
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Ну так вот, есть два регистра, в каждом по восемь битов. У каждого бита может быть своя задача, некоторые могут быть объединены.
Открываем датащит, смотрим регистр TCCR1A:
COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
1) COM1A1 COM1A0 COM1B1 COM1B0: для выводов OC1A and OC1B выбран Normal port operation, OC1A/OC1B disconnected.
2) FOC1A FOC1B: просто выключены, можно не заморачиваться пытаясь понять что такое Force Output Compare (я и сам не знаю
3) WGM11 WGM10 - тут уже половина битов в другом регистре определена (который B). Смотрим таблицу 39 меги8 - там каждый режим описан.
Точно так же с TCCR1B.
Последний раз редактировалось blackx Пт авг 30, 2013 21:34:41, всего редактировалось 1 раз.
only pure true norwegian blackx 
Теперь стало яснее, но, получается они под одним таймером?
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Ага, это все к таймеру 1 относится, который 16-битный
only pure true norwegian blackx 
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Да я догадывался, но решил спросить у старших братьев.... А меня сразу в штыки

Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Так спросили.
Старайтесь задавать вопросы более ясно
Старайтесь задавать вопросы более ясно
only pure true norwegian blackx 
На самом деле, тема с таймерами и ШИМ не такая уж простая, без поллитра не разберёшся. Тему прилепил.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Да, действительно, по таймерам в АВР больше всего новых тем. Это, пожалуй, самое нужное устройство МК и самое сложное в освоении.
only pure true norwegian blackx 
Вот как не ругайте, а вот именно с таймерами разобраться, имея в руках генератор кода- проще простого.
I'm on a huge rock, flying through space!
Eugene.Negrobov, нечего тут приучать людей "писать" код с помощью мышки 
only pure true norwegian blackx 
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Самое нужное может быть, самое сложное - едва ли. ИМХО с интерфейсами гораздо больше возни, особенно если все делать как положено а не как всегда. То есть проверять ошибки приема-передачи, например
Ну что ж... Может, получится сделать что-то вроде FAQ по таймерам/счётчикам AVR в режиме диалога, поправьте меня если я где не прав.
Для начала возьмём простой как резистор 8-битный таймер/счётчик0 8-й Меги:

Считает только вперёд, флаг и прерывание выставляется когда переваливается через 255 ($FF) на 0 ($00). Соответственно, в режиме таймера чтобы отмерить определённый временной интервал Т, надо заслать соответсвующее число в TCNT0, заранее вычислив его по формуле
TCNT0 = (256 - T/clkТ0), где clkТ0 — частота тактирования таймера/счётчика0.
Источник тактовых импульсов может быть как внешним (через пин Т0), так и внутренним — тот что тактирует МК clkI/O, с предделителем или без:

Предделитель (прескалер) считает постоянно, поэтому используя в качестве тактов СК/8, СК/64, СК/256 или СК/1024 перед запуском таймера хорошо бы его сбрасывать (ресетить) для получения точных временных интервалов. Однако, таймер/счётчик0 и таймер/счётчик1 используют один и тот же предделитель, так что сбрасывать надо осторожно чтобы не сбить работу другого таймера.
Таким образом, лучше использовать максимально возможную частоту счёта clkТ0. Например, отсчитать 256 мкс при тактовой clkI/O = 1 МГц (встроенный RC-генератор, заводские фьюзы для 8-й Меги). Возможные комбинации (без сброса предделителя):
1. clkТ0 = clkI/O, TCNT0 = 0. Итог: 256 мкс;
2. clkТ0 = СК/8, TCNT0 = 224. Итог: 248...256 мкс;
3. clkТ0 = СК/64, TCNT0 = 252. Итог: 192...256 мкс;
4. clkТ0 = СК/256, TCNT0 = 255. Итог: 1...256 мкс.
Управляется сие чудо, по сути, всего тремя значащими (младшими) битами регистра TCCR0, которые указывают источник тактового сигнала. Его отсутствие (комбинация "000") стопорит таймер/счётчик. Ну, плюс ещё по биту флаг, маска прерывания и сброс прескалера.
Для начала возьмём простой как резистор 8-битный таймер/счётчик0 8-й Меги:
Считает только вперёд, флаг и прерывание выставляется когда переваливается через 255 ($FF) на 0 ($00). Соответственно, в режиме таймера чтобы отмерить определённый временной интервал Т, надо заслать соответсвующее число в TCNT0, заранее вычислив его по формуле
TCNT0 = (256 - T/clkТ0), где clkТ0 — частота тактирования таймера/счётчика0.
Источник тактовых импульсов может быть как внешним (через пин Т0), так и внутренним — тот что тактирует МК clkI/O, с предделителем или без:
Предделитель (прескалер) считает постоянно, поэтому используя в качестве тактов СК/8, СК/64, СК/256 или СК/1024 перед запуском таймера хорошо бы его сбрасывать (ресетить) для получения точных временных интервалов. Однако, таймер/счётчик0 и таймер/счётчик1 используют один и тот же предделитель, так что сбрасывать надо осторожно чтобы не сбить работу другого таймера.
Таким образом, лучше использовать максимально возможную частоту счёта clkТ0. Например, отсчитать 256 мкс при тактовой clkI/O = 1 МГц (встроенный RC-генератор, заводские фьюзы для 8-й Меги). Возможные комбинации (без сброса предделителя):
1. clkТ0 = clkI/O, TCNT0 = 0. Итог: 256 мкс;
2. clkТ0 = СК/8, TCNT0 = 224. Итог: 248...256 мкс;
3. clkТ0 = СК/64, TCNT0 = 252. Итог: 192...256 мкс;
4. clkТ0 = СК/256, TCNT0 = 255. Итог: 1...256 мкс.
Управляется сие чудо, по сути, всего тремя значащими (младшими) битами регистра TCCR0, которые указывают источник тактового сигнала. Его отсутствие (комбинация "000") стопорит таймер/счётчик. Ну, плюс ещё по биту флаг, маска прерывания и сброс прескалера.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Хм... Теперь стало более-менее яснее... Спасибо, но есть ещё некоторые ньюансы, спрошу попозже.
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...


