Страница 1 из 2
ATTiny13 работа с таймером
Добавлено: Чт дек 04, 2025 16:34:33
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()
{}
Re: ATTiny13 работа с таймером
Добавлено: Чт дек 04, 2025 17:03:26
smacorp
alsav22, переменная а должна быть volatile.
Re: ATTiny13 работа с таймером
Добавлено: Чт дек 04, 2025 17:08:32
alsav22
Вопрос снимается. Нашёл ошибку в коде: значение режима задал не в тех единицах. Нужно было или 2 (в десятичной), или 0b10 (в двоичной), или 0x02 (в шестнадцатиричной), или так: TCCR0A |= (2 << WGM00);
То есть, в коде я выставил режим просто счётчика. Непонятно только: почему этот обработчик прерывания срабатывал?
Re: ATTiny13 работа с таймером
Добавлено: Чт дек 04, 2025 17:14:02
VNS
Я не понимаю Си, но в каком месте вы изменяете значение регистра OCR0A?
Вот прошивка для проверки МК, тактируется на заводских установках (1,2 МГц).
На выводе РВ3 светодиод. При старте значение регистра OCR0A = 200. При замыкании вывода РВ4 на GND, в данный регистр запишется значение 100. По миганию светодиода это хорошо будет видно.
Re: ATTiny13 работа с таймером
Добавлено: Чт дек 04, 2025 20:20:25
BOB51
alsav22
Гибрид ардуино - стиля (возможно и самой ардуиноIDE) и Си???
Так в варианте ардуинки второй генератор таймерной сетки на Т0 совсем иначе делается.

Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 00:05:34
alsav22
[uquote="VNS",url="/forum/viewtopic.php?p=4769919#p4769919"]Я не понимаю Си, но в каком месте вы изменяете значение регистра OCR0A?[/uquote]
А зачем мне его изменять (при работе кода я его не меняю, менял в тексте,перед сборкой)?.Цели такой не было. Просто разбирался с регистрами таймера: куда, что, и как нужно прописывать. Результат работы смотрел логическим анализатором на пине вывода.
Добавлено after 6 minutes 4 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=4769957#p4769957"]
alsav22
Гибрид ардуино - стиля (возможно и самой ардуиноIDE) и Си???
Так в варианте ардуинки второй генератор таймерной сетки на Т0 совсем иначе делается.

[/uquote]
Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()). Долго не мог понять: делаю настройки таймера, потом использую analogWrite(), мои настройки не работают. А с таким синтаксисом всё видно. В общем, разбираюсь (как могу).
Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 04:28:15
VNS
[uquote="alsav22",url="/forum/viewtopic.php?p=4770014#p4770014"]Цели такой не было. Просто разбирался с регистрами таймера[/uquote]
Теперь ясно, в начале я не верно вас понял.

Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 07:34:34
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
Спойлер
Цэ не знаю и знать не хочу.
Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 09:41:54
BOB51
[uquote="alsav22",url="/forum/viewtopic.php?p=4770014#p4770014"]...
Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()). Долго не мог понять: делаю настройки таймера, потом использую analogWrite(), мои настройки не работают. А с таким синтаксисом всё видно. В общем, разбираюсь (как могу).[/uquote]
Ежли работаете с ардуино - извольте соблюдать правила "референса".
Надо хоть немножко понимания иметь о том, что автоматически добавляется к каждому "СКОТчу" в качестве "системных функций" самой средой по умолчанию.
Иначе будет достаточно много всякого рода "непонятных ошибок".
Таймер Т0 используется в адуринках на АВРках в качестве "генератора системных часов" - по факту 1 миллисекундного интервала.
Можно и свой добавочный генератор добавить (для "параллельного процесса" на основе прерывания по OCR0A, но то прерывание также будет с интервалом 1 миллисекунда, единственно смещено относительно основного (обычно ставится 0х127).
А уже на его основе строятся свои программные счетчики.

Насчет работ с адуриньями рекомендую посмотреть раскиданные по
https://radiokot.ru/forum/viewtopic.php?f=62&t=156720
заметки и раздел "уроков" у Гайвера:
https://alexgyver.ru/

Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 10:13:23
OKF
[uquote="alsav22",url="/forum/viewtopic.php?p=4770014#p4770014"]Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()).[/uquote]
Добавь, что бы Ардуино core не оказывало влияния.
Код: Выделить всё
int main() {
setup();
while (true)
loop();
}
Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 10:30:28
BOB51
Для того, чтобы совсем "влияния не оказывалось" надо программу писать "за пределами ардуиноIDE" - в любой другой IDE.
Максимум что можно "нейтрализовать" изменяя основную страничку исходника - это убрать работу уарт (и то там проще делается).
Да и зачем?
Неуж то "в рамках референса" средств недостаточно?

Собственно вариант окна симулятора к примеру:
Спойлер

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

Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 10:49:46
veso74
не
ISR(TIM0_COMPA_vect)
а
ISR(TIMER0_COMPA_vect)
Прерывание не будет правильно подключено и будет казаться, что таймер срабатывает только при переполнении
---
не
TCCR0A = 0x10; // режим CTC - ето бит COM0B0, а не бит WGM01
а
TCCR0A = (1 << WGM01); // режим CTC
Поскольку режим CTC включен неправильно, таймер работает в Normal Mode. В Normal Mode прерывание OCR0A не возникает, но прерывание по переполнению может быть вызвано.
Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 11:04:00
akl
veso74 писал(а):...В Normal Mode прерывание OCR0A не возникает, но прерывание по переполнению может быть вызвано. Похоже, что ISR вызывается при переполнении.
Возникают и обрабатываются разрешенные TIMSK0 прерывания. Интервалы не будут соответствовать. Вместо 100 тактов будет 256.
Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 11:05:43
veso74
Да, именно так.
Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 11:07:33
OKF
[uquote="BOB51",url="/forum/viewtopic.php?p=4770067#p4770067"]зачем еще раз то же самое дублировать?

[/uquote]
"Референсы" внимательнее читай.)
Re: ATTiny13 работа с таймером
Добавлено: Пт дек 05, 2025 11:12:53
BOB51
Пока что не совсем понятно с какой средой разработки топикстартер дело имеет. Он же не объявлял, что под ардуино IDE работает.
Да и в самой IDE платформ с Тинькой 13ой минимум 2 - их ещё и устанавливать дополнительно надо (в списке "по умолчанию" их нет- надо вручную добавлять).
Может топикстартер пытается копировать "стиль ардуино" в АВРстудио (микрочип студио)...
Так что подождем уточнений...
OKF, ну не "матрешки" же делать - вкладывать повторно то же самое в то же самое.
Обычно достаточно от loop избавиться.
И то лишь для гурманов (изврата).
Да и авр студии никто не отменял...

Re: ATTiny13 работа с таймером
Добавлено: Сб дек 06, 2025 08:18:33
OKF
[uquote="BOB51",url="/forum/viewtopic.php?p=4770078#p4770078"]OKF, ну не "матрешки" же делать - вкладывать повторно то же самое в то же самое.[/uquote]
Ну да, тоже самое, только без Ардуино. Или же таймер на миллис сам настраивается? Чего там в "референсах" пишут?
Re: ATTiny13 работа с таймером
Добавлено: Сб дек 06, 2025 09:20:40
BOB51
Если для АВР студии или чистого GCC это одно, а ежли в ардуино IDE - то "матрешка".
Пока ведь неизвестно в какой среде/IDE топикстартер программку делает.

Я принял исходник
alsav22 за работу в ардуиноIDE поскольку его программа не имеет по факту явно объявленного зацикливания в loop(){} как обычно только для ардуино скотчей (в loop зацикливание установлено средствами IDE, также самой IDE выполняется и инициализация Т0, правда не во всех платформах - у некоторых имеются опционные вкладки для разрешения/запрета работы функций времени у "малолапых" АВРок). Собственно с такой точки зрения и все мои ответы были.

Re: ATTiny13 работа с таймером
Добавлено: Вт дек 09, 2025 22:40:36
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
Re: ATTiny13 работа с таймером
Добавлено: Вт дек 09, 2025 22:51:28
BOB51
Смотри ограничения/документацию по симулятору IDE для данного МК.
Симулятор имеет версии и отличия/ограничения в зависимости от того, какая версия указана активной для проекта.
С меня под ассемблером и АВР студио 4.19 хватает... более старшие увы... не ставил.
