ATTiny13 работа с таймером

Обсуждаем контроллеры компании Atmel.
alsav22
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср янв 20, 2021 05:39:28

ATTiny13 работа с таймером

Сообщение alsav22 »

Разбираюсь с работой таймера ATTiny13. Написал код, но работает не так, как задумывалось. Не могу понять - почему. Режим работы таймера CTC, но продолжительность импульсов на PB3 не изменяется при изменении начального значения OCR0A. Получается, что прерывание срабатывает не при достижении равенства значения счётчика и значения OCR0A, а при переполнении счётчика (т.е. счёт идёт постоянно до 255). Заход, в функцию обработки прерываний, происходит. Что-то не так написал в коде, или что-то не дописал? Помогите, пожалуйста, разобраться.

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

#include <avr/io.h>
#include <avr/interrupt.h>
 
void setup()
{
    TCCR0A = 0x10; // режим CTC
    TCCR0B = 0x01; //предделитель тактовой частоты CLK/1
    TCNT0 = 0;     // начальное значение счётчика
    OCR0A = 100;   // начальное значение регистра совпадения A
   
    DDRB |= (1 << PB3); // output на PB3
    PORTB &= ~(1 << PB3); // низкий уровень на PB3
   
    //устанавливаем бит разрешения прерывания 0-ого счетчика по совпадению с OCR0A
    TIMSK0 |= (1 << OCIE0A);
 
    sei();// Разрешаем прерывания глобально
}
 
byte a = 0;
 
ISR(TIM0_COMPA_vect) // обработка прерывания при совпадении счётчика с OCR0A
{
   
    if (a == 0)
    {
        PORTB |= (1 << PB3); // высокий на PB3
        ++a;
    }
    else
    {
        PORTB &= ~(1 << PB3); // низкий на PB3
        a = 0;
    }
}
 
void loop()
{}
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3471
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: ATTiny13 работа с таймером

Сообщение smacorp »

alsav22, переменная а должна быть volatile.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
alsav22
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср янв 20, 2021 05:39:28

Re: ATTiny13 работа с таймером

Сообщение alsav22 »

Вопрос снимается. Нашёл ошибку в коде: значение режима задал не в тех единицах. Нужно было или 2 (в десятичной), или 0b10 (в двоичной), или 0x02 (в шестнадцатиричной), или так: TCCR0A |= (2 << WGM00);
То есть, в коде я выставил режим просто счётчика. Непонятно только: почему этот обработчик прерывания срабатывал?
Последний раз редактировалось alsav22 Чт дек 04, 2025 17:25:34, всего редактировалось 1 раз.
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1614
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Re: ATTiny13 работа с таймером

Сообщение VNS »

Я не понимаю Си, но в каком месте вы изменяете значение регистра OCR0A?

Вот прошивка для проверки МК, тактируется на заводских установках (1,2 МГц).
Test_pin.hex
(263 байт) 112 скачиваний


На выводе РВ3 светодиод. При старте значение регистра OCR0A = 200. При замыкании вывода РВ4 на GND, в данный регистр запишется значение 100. По миганию светодиода это хорошо будет видно.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ATTiny13 работа с таймером

Сообщение BOB51 »

alsav22
Гибрид ардуино - стиля (возможно и самой ардуиноIDE) и Си???
:shock:
Так в варианте ардуинки второй генератор таймерной сетки на Т0 совсем иначе делается.
:roll:
alsav22
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср янв 20, 2021 05:39:28

Re: ATTiny13 работа с таймером

Сообщение alsav22 »

Я не понимаю Си, но в каком месте вы изменяете значение регистра OCR0A?

А зачем мне его изменять (при работе кода я его не меняю, менял в тексте,перед сборкой)?.Цели такой не было. Просто разбирался с регистрами таймера: куда, что, и как нужно прописывать. Результат работы смотрел логическим анализатором на пине вывода.

Добавлено after 6 minutes 4 seconds:
alsav22
Гибрид ардуино - стиля (возможно и самой ардуиноIDE) и Си???
:shock:
Так в варианте ардуинки второй генератор таймерной сетки на Т0 совсем иначе делается.
:roll:

Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()). Долго не мог понять: делаю настройки таймера, потом использую analogWrite(), мои настройки не работают. А с таким синтаксисом всё видно. В общем, разбираюсь (как могу).
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1614
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Re: ATTiny13 работа с таймером

Сообщение VNS »

Цели такой не было. Просто разбирался с регистрами таймера

Теперь ясно, в начале я не верно вас понял. :)
akl
Друг Кота
Сообщения: 4443
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: ATTiny13 работа с таймером

Сообщение akl »

alsav22 писал(а):...почему этот обработчик прерывания срабатывал?
По мне, нарушен порядок инициализации таймера.

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

   TCCR0A = 0x10; // режим CTC
    TCCR0B = 0x01; //предделитель тактовой частоты CLK/1
    TCNT0 = 0;     // начальное значение счётчика
    OCR0A = 100;   // начальное значение регистра совпадения A

Сделал бы (в мнемокодах)
TCCR0B <- 0 //стоп таймера
TCNT0 <- 0 // начальное значение счётчика
TCCR0A <- 1<<WGM01 // режим CTC
OCR0A <- 100 // начальное значение регистра совпадения A

TIMSK0 <- 1 << OCIE0A
TIFR0 <- 1 << OCF0A
TCCR0B <- 1<<CS00 //старт с тактовой частотой CLK/1
SEI

СпойлерЦэ не знаю и знать не хочу.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ATTiny13 работа с таймером

Сообщение BOB51 »

...
Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()). Долго не мог понять: делаю настройки таймера, потом использую analogWrite(), мои настройки не работают. А с таким синтаксисом всё видно. В общем, разбираюсь (как могу).

Ежли работаете с ардуино - извольте соблюдать правила "референса".
Надо хоть немножко понимания иметь о том, что автоматически добавляется к каждому "СКОТчу" в качестве "системных функций" самой средой по умолчанию.
Иначе будет достаточно много всякого рода "непонятных ошибок".
8)
Таймер Т0 используется в адуринках на АВРках в качестве "генератора системных часов" - по факту 1 миллисекундного интервала.
Можно и свой добавочный генератор добавить (для "параллельного процесса" на основе прерывания по OCR0A, но то прерывание также будет с интервалом 1 миллисекунда, единственно смещено относительно основного (обычно ставится 0х127).
А уже на его основе строятся свои программные счетчики.
8)
Насчет работ с адуриньями рекомендую посмотреть раскиданные по
viewtopic.php?f=62&t=156720
заметки и раздел "уроков" у Гайвера:
https://alexgyver.ru/
:tea:
OKF
Это не хвост, это антенна
Сообщения: 1379
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: ATTiny13 работа с таймером

Сообщение OKF »

Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()).

Добавь, что бы Ардуино core не оказывало влияния.

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

int main() {
  setup();
  while (true)
    loop();
}
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ATTiny13 работа с таймером

Сообщение BOB51 »

Для того, чтобы совсем "влияния не оказывалось" надо программу писать "за пределами ардуиноIDE" - в любой другой IDE.
Максимум что можно "нейтрализовать" изменяя основную страничку исходника - это убрать работу уарт (и то там проще делается).
:wink:
Да и зачем?
Неуж то "в рамках референса" средств недостаточно?
:dont_know:
Собственно вариант окна симулятора к примеру:
СпойлерИзображение

зачем еще раз то же самое дублировать?
8)
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: ATTiny13 работа с таймером

Сообщение veso74 »

не
ISR(TIM0_COMPA_vect)
а
ISR(TIMER0_COMPA_vect)

Прерывание не будет правильно подключено и будет казаться, что таймер срабатывает только при переполнении

---

не
TCCR0A = 0x10; // режим CTC - ето бит COM0B0, а не бит WGM01
а
TCCR0A = (1 << WGM01); // режим CTC

Поскольку режим CTC включен неправильно, таймер работает в Normal Mode. В Normal Mode прерывание OCR0A не возникает, но прерывание по переполнению может быть вызвано.
Последний раз редактировалось veso74 Пт дек 05, 2025 11:14:42, всего редактировалось 2 раза.
akl
Друг Кота
Сообщения: 4443
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: ATTiny13 работа с таймером

Сообщение akl »

veso74 писал(а):...В Normal Mode прерывание OCR0A не возникает, но прерывание по переполнению может быть вызвано. Похоже, что ISR вызывается при переполнении.
Возникают и обрабатываются разрешенные TIMSK0 прерывания. Интервалы не будут соответствовать. Вместо 100 тактов будет 256.
veso74
Поставщик валерьянки для Кота
Сообщения: 1902
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: ATTiny13 работа с таймером

Сообщение veso74 »

Да, именно так.
OKF
Это не хвост, это антенна
Сообщения: 1379
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: ATTiny13 работа с таймером

Сообщение OKF »

зачем еще раз то же самое дублировать?
8)

"Референсы" внимательнее читай.)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ATTiny13 работа с таймером

Сообщение BOB51 »

Пока что не совсем понятно с какой средой разработки топикстартер дело имеет. Он же не объявлял, что под ардуино IDE работает.
Да и в самой IDE платформ с Тинькой 13ой минимум 2 - их ещё и устанавливать дополнительно надо (в списке "по умолчанию" их нет- надо вручную добавлять).
Может топикстартер пытается копировать "стиль ардуино" в АВРстудио (микрочип студио)...
Так что подождем уточнений...
8)
OKF, ну не "матрешки" же делать - вкладывать повторно то же самое в то же самое.
Обычно достаточно от loop избавиться.
И то лишь для гурманов (изврата).
Да и авр студии никто не отменял...
8)
OKF
Это не хвост, это антенна
Сообщения: 1379
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: ATTiny13 работа с таймером

Сообщение OKF »

OKF, ну не "матрешки" же делать - вкладывать повторно то же самое в то же самое.

Ну да, тоже самое, только без Ардуино. Или же таймер на миллис сам настраивается? Чего там в "референсах" пишут?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ATTiny13 работа с таймером

Сообщение BOB51 »

Если для АВР студии или чистого GCC это одно, а ежли в ардуино IDE - то "матрешка".
Пока ведь неизвестно в какой среде/IDE топикстартер программку делает.
8)
Я принял исходник alsav22 за работу в ардуиноIDE поскольку его программа не имеет по факту явно объявленного зацикливания в loop(){} как обычно только для ардуино скотчей (в loop зацикливание установлено средствами IDE, также самой IDE выполняется и инициализация Т0, правда не во всех платформах - у некоторых имеются опционные вкладки для разрешения/запрета работы функций времени у "малолапых" АВРок). Собственно с такой точки зрения и все мои ответы были.
8)
alsav22
Открыл глаза
Сообщения: 50
Зарегистрирован: Ср янв 20, 2021 05:39:28

Re: ATTiny13 работа с таймером

Сообщение alsav22 »

Продолжение. Atmel Studio 7, код на ассемблере, отладка в режиме симулятора. Не заходит в обработчик прерывания в режиме сравнения. Если выставить режим переполнения, то в обработчик прерывания при переполнении заходит. Что не так в коде?

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

.include "tn13def.inc";

.def temp = r16   

.cseg           
.org 0           

; инциализация стека
ldi temp, low(RAMEND);
out SPL, temp ; Set Stack Pointer to top of RAM
   
rjmp Start;

/*; обаработчик прерывания при переполнении счётчика
TIM0_OVF:
    nop;
    reti;*/

; обаработчик прерывания при сравнении
TIM0_COMPA:
   nop
   reti 

Start:
   clr temp
   ; режим сравнения (CTC)
   ldi temp, 0b00000010;
   out TCCR0A, temp

   clr temp;
   out TCNT0, temp; начальное значение счётчика

   ;устанавливаем биты разрешения прерывания 0-ого счетчика
   ldi temp, 0b00000100; прерывание при совпадении с OCR0A
   out TIMSK0, temp;

   ;значение для сравнения
   clr temp;
   ldi temp, 0x1E;
   out OCR0A, temp;

   ;разрешить глобальные прерывания
   sei;
   ;предделитель тактовой частоты (старт таймера)
   ldi temp, 0b00000010;
   out TCCR0B, temp;

Cicle:
   nop
   nop
   nop
   rjmp Cicle
Последний раз редактировалось alsav22 Ср дек 10, 2025 17:51:55, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15539
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ATTiny13 работа с таймером

Сообщение BOB51 »

Смотри ограничения/документацию по симулятору IDE для данного МК.
Симулятор имеет версии и отличия/ограничения в зависимости от того, какая версия указана активной для проекта.
:wink:
С меня под ассемблером и АВР студио 4.19 хватает... более старшие увы... не ставил.
:roll:
Ответить

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