Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 26.05.2021
Сообщений: 6
1

Таймер в Atmega 328 не хочет считать до ICR1 (Toggle OC1A)

26.05.2021, 21:42. Показов 1597. Ответов 16
Метки avr, pwm (Все метки)

Всем привет. Столкнулся с непониманием почему таймер не хочет работать в следующем режиме. Выставляю быстрый шим, далее выбираю изменение состояния пина при совпадении. А в WGM выбираю 14 режим, в котором таймер должен считать до значения записанного в регистр ICR1. Но ничего не происходит. Если же я ставлю режим 15 изменяя всего один бит, то все начинает работать, но тогда я пользуюсь регистром OC1A, а я хочу понять почему же не работает с ICR1.
Есть идеи?
0
Вложения
Тип файла: txt ICR1.txt (428 байт, 11 просмотров)
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2021, 21:42
Ответы с готовыми решениями:

WDT таймер срабатывает без задержки ATmega 328
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) |...

Не хочет работать таймер ATMega 2560
Здравствуйте! Занимаюсь разработкой девайса обменивающегося с периферией по RS485. Работает в...

Atmega 328 + кварц NX3225SA-16.000000MHZ-T1
Помогите пожалуйста. Собираю частичный клон Arduino/ Все компоненты smd. Использую кварц...

Обращение к 16 -ричным регистрам ATmega 328
Смутно помню, что на asm к I/O регистрам (с "большими адресами) можно было обращаться через хитрые...

16
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
27.05.2021, 15:21 2
Лучший ответ Сообщение было отмечено Ramzess1488 как решение

Решение

Ramzess1488 , для удобства тех, кто будет вам отвечать -(1) код лучше вставлять непосредственно в сообщение, благо для этого есть специальная возможность.(2) запись типа TCCR1B = 0x1A; очень не удобна для проверки, лучше расписать все установленные биты по типу
Код
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11);//  Mode 14 FastPWM
По сути дела -режим toggle OC1A && FastPWM Mode14 по-моему просто ошибка даташита. В меге 16 например его нету. Я тоже попробовал на меге328 -не работает. Только обычный Set/Clear
Таймер в Atmega 328 не хочет считать до ICR1 (Toggle OC1A)
1
1599 / 823 / 341
Регистрация: 11.10.2018
Сообщений: 4,325
27.05.2021, 15:50 3
На 2 режима, я думаю, не имеет смысла распаляться. Выберите 1 режим(14) и настраивайте его. Смотрите отладчик. В какой среде работаете?

Добавлено через 29 секунд
Цитата Сообщение от dimkra Посмотреть сообщение
ошибка даташита.
- есть старый даташит, есть новый. У Вас какой?

Добавлено через 12 минут
C
1
2
3
4
        PORTB = 0xFF;
        _delay_ms(1000);
        PORTB = 0x00;
        _delay_ms(1000);
- в PortB не надо самому выводить, есил Вы ШИМ используете. Удалите это.
0
0 / 0 / 0
Регистрация: 26.05.2021
Сообщений: 6
27.05.2021, 21:18  [ТС] 4
Цитата Сообщение от dimkra Посмотреть сообщение
По сути дела -режим toggle OC1A && FastPWM Mode14 по-моему просто ошибка даташита. В меге 16 например его нету. Я тоже попробовал на меге328 -не работает. Только обычный Set/Clear
вот и я уже себе голову сломал почему оно не работает. спасибо за отзыв.
Цитата Сообщение от FFPowerMan Посмотреть сообщение
в PortB не надо самому выводить, есил Вы ШИМ используете. Удалите это.
я знаю что не нужно, шим то аппаратный. я это делал для того чтоб дергнуть пин, так как в режиме когда пин переключается из одного состояния в другое нужно дать стартовый импульс.
0
11 / 9 / 4
Регистрация: 26.06.2020
Сообщений: 37
28.05.2021, 10:33 5
Здравствуйте!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <avr/io.h>
void init (void);
int main (void){
    init();
    ICR1 = 50000; 
    OCR1A = 25000; 
    while (1); 
}
 
void init (void){
    DDRB = 0xFF;
    TCCR1A = _BV(CS11) | _BV(WGM12) | _BV(WGM13);
    TCCR1B = _BV(COM1A1) | _BV(WGM10) | _BV(WGM11);
}
Этот код работает только не знаю , подойдет под вашу задачу или нет.
0
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
28.05.2021, 10:55 6
Mane, (1) у вас перепутаны местами все биты и регистры TCCR1x. (2) этот пример не имеет отношения к обсуждаемой проблеме.
0
11 / 9 / 4
Регистрация: 26.06.2020
Сообщений: 37
28.05.2021, 12:28 7
Прошу прощения опечатался.
Режим 14, изменение состояния OC1A при совпадении, как просил автор.
Предлагаю на суд такой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <avr/io.h>
void init (void);
int main (void){
    init();
    ICR1 = 20000; 
    OCR1A = 50; 
    while (1); 
}
void init (void){
    DDRB = 0xFF;
    TCCR1A = _BV(COM1A0) | _BV(WGM11);
    TCCR1B = _BV(CS11) | _BV(WGM12) | _BV(WGM13);
}
Частота 16 МГц, на выходе OC1A меандр 50Гц.
Это соответствует расчетному: 16 000 000 разделить на 8 и разделить на удвоенное значение записанное в регистре ICR1.
0
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
28.05.2021, 13:12 8
Mane, сейчас всё правильно -режим именно тот, о котором шла речь. И что, он у вас работает, или зачем тогда вы его предлагаете?
0
11 / 9 / 4
Регистрация: 26.06.2020
Сообщений: 37
28.05.2021, 15:32 9
dimka, да работает, проверял только в Proteus.
В симуляторе работает, в железе не проверял (нет на работе такого камушка)
Прилагаю скриншот.
Жаль, не откликается Ramzess1488.
Может уже не надо?
0
Миниатюры
Таймер в Atmega 328 не хочет считать до ICR1 (Toggle OC1A)  
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
28.05.2021, 15:46 10
Mane, в железе не работает, в том и дело. Я ещё вчера проверил, когда написал в первый раз. Вообще режим конечно бессмысленный, от CTC отличается только тем, что переключает не в начале или конце счёта, а в указанном регистром месте. Т.е. для очень специфических задач
0
1599 / 823 / 341
Регистрация: 11.10.2018
Сообщений: 4,325
28.05.2021, 15:57 11
Цитата Сообщение от dimkra Посмотреть сообщение
переключает не в начале или конце счёта,
- в начале и в конце(при переполнении) тоже переключает. Посмотрите FastPWM.
0
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
28.05.2021, 16:03 12
FFPowerMan, я тоже так думал -но у Mane на скриншоте меандр, чего бы не могло быть при ICR:20000 и OCR1A:50 -был бы тонкий импульс 0,25% duty
0
0 / 0 / 0
Регистрация: 26.05.2021
Сообщений: 6
28.05.2021, 21:35  [ТС] 13
я делаю ЧИМ для регулировки частоты ультразвуковой ванны. там нужно получить меандр, а частоту менять. сначала я пробовал режим CTC но оказалось что он не имеет двойной буферизации и по этому иногда срывалась работа выхода. в даташите написано что лучше использовать режим FastPWM. ну и я такой записал регистры все на этот режим, так как в коде уже был прописан для сравнения регистр ICR1 то решил оставить его, но код тупо не работал, тогда я все переписал на OC1A и код заработал. вот и начал гуглить почему же оно не работает. и в примере у меня ICR1 и OC1A чисто для проверки.
Камни тоже менял, брал и дип и смд все равно не работало..
0
0 / 0 / 0
Регистрация: 26.05.2021
Сообщений: 6
29.05.2021, 10:03  [ТС] 14
Mane, можно поинтересоваться что за запись такая? _BV(CS11) что означает _BV?
0
464 / 242 / 51
Регистрация: 21.09.2008
Сообщений: 839
29.05.2021, 13:51 15
Ramzess1488, ответ на Ваш вопрос.
1
0 / 0 / 0
Регистрация: 26.05.2021
Сообщений: 6
30.05.2021, 08:56  [ТС] 16
о, спасибо.
0
Модератор
Эксперт по электронике
8402 / 6243 / 840
Регистрация: 14.02.2011
Сообщений: 21,654
30.05.2021, 09:08 17
Цитата Сообщение от Ramzess1488 Посмотреть сообщение
о, спасибо.
правила п 3.6
Если какой-либо пост на форуме показался вам полезным, то вы можете выразить свою благодарность, нажав кнопку "Спасибо" внизу самого поста.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2021, 09:08

Раздельное питание цифровой и аналоговой части ATmega 328
Неожиданно осознал, что на МК есть два входа VCC и AVCC для раздельного питания аналоговой и...

Как правильно размещать таблицу прерываний (в ATmega 328 в частности)?
.cseg ; Выбор сегмента программного кода .org 0 ; Установка текущего адреса на ноль jmp ...

Таймер Atmega 128
Здравствуйте, объясните пожалуйста вот эти строчки поэтапно clr r18 sbi DDRA,1 ldi...

atmega 8 сторожевой таймер
В каких случаях можно полагаться на сторожевой таймер? Столкнулся с тем, что в контроллере для...

Таймер на Atmega 8 с LED дисплеем
Доброго времени суток. Пытаюсь собрать таймер с LED индикатором на восьмой атмеге. Замысел такой в...

Нулевой таймер на срабатывание прерывания раз в сек (Atmega 8515)
Привет народ. Каким образом нужно настроить частоту на таймере 8 битном, чтобы получить прерывание...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.