Суббота, 14.06.2025, 07:58
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Таймеры в AVR - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ВитГо  
Таймеры в AVR
uwrteyДата: Четверг, 18.04.2013, 22:07 | Сообщение # 1
Генерал-майор
Группа: Администраторы
Сообщений: 3362
Репутация: 11
Статус: Offline
хорошая статья

не успеваю за своими мыслями......
 
ВитГоДата: Пятница, 19.04.2013, 11:25 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
да, неплохо рассказано ! спасибо за ссылку !

Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 07.11.2015, 23:16 | Сообщение # 3
Генерал-майор
Группа: Администраторы
Сообщений: 3362
Репутация: 11
Статус: 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
Репутация: 11
Статус: 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
Репутация: 11
Статус: 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


не успеваю за своими мыслями......
 
  • Страница 1 из 1
  • 1
Поиск:


Copyright MyCorp © 2025
Сделать бесплатный сайт с uCoz