Таймеры в AVR
| |
uwrtey | Дата: Четверг, 18.04.2013, 22:07 | Сообщение # 1 |
 Генерал-майор
Группа: Администраторы
Сообщений: 3362
Статус: Offline
| хорошая статья
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Пятница, 19.04.2013, 11:25 | Сообщение # 2 |
 Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| да, неплохо рассказано ! спасибо за ссылку !
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 07.11.2015, 23:16 | Сообщение # 3 |
 Генерал-майор
Группа: Администраторы
Сообщений: 3362
Статус: Offline
| памятка http://www.rtcs.ru/comp/html/txt/doc/micros/avr/arh/mega103_40.htm
TCNT1 - таймер/счетчик_1
запись в таймер/счетчик - сначала в старший а потом в младший
чтение таймера счетчика - сначала младшего а затем старшего
---------------------------------------------
Еще одна полезная статья http://easyelectronics.ru/avr-uchebnyj-kurs-tajmery.html Читаем про асинхронный режим
Цитата Т/С2 способен работать в асинхронном режиме. То есть Т/С считает не тактовые импульсы процессора, не входящие импульсы на ножки, а импульсы своего собственного генератора, работающего от отдельного кварца. Для этого у Т/С2 есть входы TOSC1 и TOSC2, на которые можно повесить кварцевый резонатор.
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Вторник, 03.06.2025, 01:05 | Сообщение # 4 |
 Генерал-майор
Группа: Администраторы
Сообщений: 3362
Статус: Offline
| 1. Программы записи и чтения данных таймера должны быть атомарными, т.е. перед чтением или записью мы запрещаем прерывания, а по окончании процесса вновь разрешаем. 2. При записи сначала записывается старший байт H а затем младший L. 3. При чтении сначала считывается младший байт L затем старший H. Например: Запись данных в счетный регистр.
Код CLI ; Запрещаем прерывания OUT TCNT1H, R16 ; Запись старшего байта OUT TCNT1L, R17 ; Запись младшего байта SEI ; Разрешаем прерывания
. Чтение данных из счетного регистра
Код CLI ; Запрещаем прерывания IN TCNT1L, R16 ; Считывание младшего байта IN TCNT1H, R17 ; Считывание старшего байта SEI ; Разрешаем прерывания
Такие правила для того, чтобы не исказились данные за то время, которое уйдет на процесс считывания из каждого регистра. Если использовать прямое чтение 8-битных регистров TCNT1H и TCNT1L, то эти регистры не прочитаются одновременно. Может произойти следующая ситуация: Счетчик содержал значение 0x01FF, Вы считали TCNT1H (содержащий значение 0x01 в какую-то переменную). За это время пришел счетный импульс, и содержимое TCNT1L стало равно $00.
16-битное значение этих переменных получилось 0x0100 вместо 0x01FF
Для предотвращения такой ситуации существует временный регистр, содержащийся в блоке таймера/счетчика. Этот регистр прозрачный, т.е. действует автоматически. При считывании значения регистра TCNT1L в переменную, содержимое TCNT1H попадает в этот регистр ( имя этого регистра - TEMP - временный работник ). Затем при чтении старшего байта в переменную, считывается значение временного регистра. Временный регистр абсолютно прозрачен для пользователя, но для его корректной работы необходимо соблюдать указанную выше последовательность действий. Обращение к регистрам через дополнительный (буферный) регистр называется двойной буферизацией
Регистр ICR1 не имеет двойной буферизации !!!! Речь о режиме ШИМ когда в TOP ( в вершине ШИМ ) установлен регистр ICR1
Использование регистра ICR1 для определения TOP хорошо работает при использовании фиксированных значений TOP ( ШИМ с неизменной частотой ) При использовании ICR1 регистр OCR1A может свободно использоваться для генерации выходного сигнала ШИМ на OC1A.
Однако, если базовая частота ШИМ активно изменяется (изменяя значение TOP), использование OCR1A в качестве TOP явно является лучшим выбором из-за его функции двойного буфера ( для ШИМа с изменяемой частотой нужно использовать OCR1A в качестве TOP )
Когда ICR1 используется как значение TOP то ICP1 отключается и, функция входного захвата отключается.
ICR1 - это Регистр захвата входов ( Это его прямое назначение ) ICR1 обновляется значением счетчика (TCNT1) каждый раз, когда на ножке ICP1 (или опционально на выходе аналогового компаратора для Timer/Counter1) происходит событие.
Чтобы гарантировать, что старший и младший байты считываются одновременно, когда ЦП обращается к этим регистрам, доступ выполняется с использованием 8-битного временного регистра старшего байта (TEMP). о чем говорилось выше...
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Вторник, 03.06.2025, 01:17 | Сообщение # 5 |
 Генерал-майор
Группа: Администраторы
Сообщений: 3362
Статус: Offline
| FAST PWM
рассмотрю два варианта: С вершиной в OCR1A и ICR1
Регистры OCR1A и OCR1B - это регистры для генерации наружу - OUT ( вывод ШИМ ) ICR1 - регистр для генерации из вне ( по захвату например ) ICR1 используется как TOP в виде исключения ( сэкономили наверное регистр ) - это не прямое его назначение. прямое назначение использовать как самостоятельный регистр захвата.
С вершиной в OCR1A ( код написан для тини2313 ) Длина импульса ( скважности ) задается регистром OCR1B Генерация точно есть на OC1B
Код ldi Temp,(1<<COM1A1)|(1<<COM1B1)|(1<<wgm11)|(1<<wgm10) ; быстрый ШИМ с вершиной в OCR1A out TCCR1A,Temp ; *1 ( ШИМ с регулируемой частотой ) ; Генерация на ножках OC1A и OC1B ( сразу на двух ??? ) ; Я лично брал генерацию всегда с ножки OC1B ; Мне кажется генерации на OC1A быть не должно, даже если ее настроить... По моему я смотрел осциллографом и там не ШИМ а генерация коротких импульсов при достижении TOP (Вершины) ; в любом случае в этом режиме нет смысла настраивать генерацию на этой ножке и занимать ее. Ее можно будет использовать под другие задачи.. ldi Temp,(1<<wgm13)|(1<<wgm12)|(1<<CS10) ; установили тактовый сигнал = CK 1:1 out TCCR1B,Temp ; таймер начал считать!
LDI Temp,high(Chastota) ; зададим Частоту ШИМ 20000 тиков ( частота ШИМ 50Гц ) OUT OCR1AH,Temp ; и выведем ее в порт сравнения LDI Temp,low(Chastota) OUT OCR1AL,Temp
LDI Temp,high(NylImp) ; зададим длину импульса 1400 тиков ( 1400 мкс ) OUT OCR1BH,Temp ; и выведем ее в порт сравнения LDI Temp,low(NylImp) OUT OCR1BL,Temp
ldi Temp,0 ; обнуление таймера out TCNT1H,Temp out TCNT1L,Temp
*****************************
С вершиной в ICR1 тут можно задать сразу два ШИМ с разной скважностью но с одинаковой частотой Генерацию можно настроить на двух разных ножках: OC1A и OC1B В регистр OCR1A - укажем длину импульса ( скважности ) для ножки OC1A В регистр OCR1B - укажем длину импульса ( скважности ) для ножки OC1B
Код Timer1_Init:
LDI Temp,high(NylImp) ; зададим длину импульса 1400 тиков ( 1400 мкс ) OUT OCR1AH,Temp ; и выведем ее в порт сравнения LDI Temp,low(NylImp) OUT OCR1AL,Temp
LDI Temp,high(NylImp) ; зададим длину импульса 1400 тиков ( 1400 мкс ) OUT OCR1BH,Temp ; и выведем ее в порт сравнения LDI Temp,low(NylImp) OUT OCR1BL,Temp
ldi Temp,(1<<COM1A1)|(1<<COM1B1)|(1<<wgm11) ; быстрый ШИМ с вершиной в ICR1 out TCCR1A,Temp ; *1 ( ШИМ с регулируемой частотой )
ldi Temp,(1<<wgm13)|(1<<wgm12)|(1<<CS10) ; установили тактовый сигнал = CK 1:1 out TCCR1B,Temp ; таймер начал считать!
LDI Temp,high(Chastota) ; зададим Частоту ШИМ 20000 тиков ( частота ШИМ 50Гц ) OUT ICR1H,Temp ; и выведем ее в порт сравнения LDI Temp,low(Chastota) OUT ICR1L,Temp
ldi Temp,0 ; обнуление таймера out TCNT1H,Temp out TCNT1L,Temp
не успеваю за своими мыслями......
|
|
| |
|