| Форум РадиоКот https://radiokot.ru/forum/ |
|
| ATTiny13 работа с таймером https://radiokot.ru/forum/viewtopic.php?f=57&t=199933 |
Страница 1 из 2 |
| Автор: | alsav22 [ Чт дек 04, 2025 16:34:33 ] |
| Заголовок сообщения: | ATTiny13 работа с таймером |
Разбираюсь с работой таймера 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 [ Чт дек 04, 2025 17:03:26 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
alsav22, переменная а должна быть volatile. |
|
| Автор: | alsav22 [ Чт дек 04, 2025 17:08:32 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Вопрос снимается. Нашёл ошибку в коде: значение режима задал не в тех единицах. Нужно было или 2 (в десятичной), или 0b10 (в двоичной), или 0x02 (в шестнадцатиричной), или так: TCCR0A |= (2 << WGM00); То есть, в коде я выставил режим просто счётчика. Непонятно только: почему этот обработчик прерывания срабатывал? |
|
| Автор: | VNS [ Чт дек 04, 2025 17:14:02 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Я не понимаю Си, но в каком месте вы изменяете значение регистра OCR0A? Вот прошивка для проверки МК, тактируется на заводских установках (1,2 МГц). Вложение: На выводе РВ3 светодиод. При старте значение регистра OCR0A = 200. При замыкании вывода РВ4 на GND, в данный регистр запишется значение 100. По миганию светодиода это хорошо будет видно. |
|
| Автор: | BOB51 [ Чт дек 04, 2025 20:20:25 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
alsav22 Гибрид ардуино - стиля (возможно и самой ардуиноIDE) и Си??? Так в варианте ардуинки второй генератор таймерной сетки на Т0 совсем иначе делается. |
|
| Автор: | alsav22 [ Пт дек 05, 2025 00:05:34 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Я не понимаю Си, но в каком месте вы изменяете значение регистра OCR0A? А зачем мне его изменять (при работе кода я его не меняю, менял в тексте,перед сборкой)?.Цели такой не было. Просто разбирался с регистрами таймера: куда, что, и как нужно прописывать. Результат работы смотрел логическим анализатором на пине вывода. Добавлено after 6 minutes 4 seconds: alsav22 Гибрид ардуино - стиля (возможно и самой ардуиноIDE) и Си??? Так в варианте ардуинки второй генератор таймерной сетки на Т0 совсем иначе делается. Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()). Долго не мог понять: делаю настройки таймера, потом использую analogWrite(), мои настройки не работают. А с таким синтаксисом всё видно. В общем, разбираюсь (как могу). |
|
| Автор: | VNS [ Пт дек 05, 2025 04:28:15 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Цели такой не было. Просто разбирался с регистрами таймера Теперь ясно, в начале я не верно вас понял. |
|
| Автор: | akl [ Пт дек 05, 2025 07:34:34 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
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 [ Пт дек 05, 2025 09:41:54 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
... Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()). Долго не мог понять: делаю настройки таймера, потом использую analogWrite(), мои настройки не работают. А с таким синтаксисом всё видно. В общем, разбираюсь (как могу). Ежли работаете с ардуино - извольте соблюдать правила "референса". Надо хоть немножко понимания иметь о том, что автоматически добавляется к каждому "СКОТчу" в качестве "системных функций" самой средой по умолчанию. Иначе будет достаточно много всякого рода "непонятных ошибок". Таймер Т0 используется в адуринках на АВРках в качестве "генератора системных часов" - по факту 1 миллисекундного интервала. Можно и свой добавочный генератор добавить (для "параллельного процесса" на основе прерывания по OCR0A, но то прерывание также будет с интервалом 1 миллисекунда, единственно смещено относительно основного (обычно ставится 0х127). А уже на его основе строятся свои программные счетчики. Насчет работ с адуриньями рекомендую посмотреть раскиданные по viewtopic.php?f=62&t=156720 заметки и раздел "уроков" у Гайвера: https://alexgyver.ru/
|
|
| Автор: | OKF [ Пт дек 05, 2025 10:13:23 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Ардуинка, насколько понял, свои настройки таймера автоматом может прописывать (например, при вызове analogWrite()). Добавь, что бы Ардуино core не оказывало влияния. Код: int main() {
setup(); while (true) loop(); } |
|
| Автор: | BOB51 [ Пт дек 05, 2025 10:30:28 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Для того, чтобы совсем "влияния не оказывалось" надо программу писать "за пределами ардуиноIDE" - в любой другой IDE. Максимум что можно "нейтрализовать" изменяя основную страничку исходника - это убрать работу уарт (и то там проще делается). Да и зачем? Неуж то "в рамках референса" средств недостаточно? ![]() Собственно вариант окна симулятора к примеру: Спойлер![]() зачем еще раз то же самое дублировать? |
|
| Автор: | veso74 [ Пт дек 05, 2025 10:49:46 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
не ISR(TIM0_COMPA_vect) а ISR(TIMER0_COMPA_vect) Прерывание не будет правильно подключено и будет казаться, что таймер срабатывает только при переполнении --- не TCCR0A = 0x10; // режим CTC - ето бит COM0B0, а не бит WGM01 а TCCR0A = (1 << WGM01); // режим CTC Поскольку режим CTC включен неправильно, таймер работает в Normal Mode. В Normal Mode прерывание OCR0A не возникает, но прерывание по переполнению может быть вызвано. |
|
| Автор: | akl [ Пт дек 05, 2025 11:04:00 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
veso74 писал(а): ...В Normal Mode прерывание OCR0A не возникает, но прерывание по переполнению может быть вызвано. Похоже, что ISR вызывается при переполнении. Возникают и обрабатываются разрешенные TIMSK0 прерывания. Интервалы не будут соответствовать. Вместо 100 тактов будет 256.
|
|
| Автор: | veso74 [ Пт дек 05, 2025 11:05:43 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Да, именно так. |
|
| Автор: | OKF [ Пт дек 05, 2025 11:07:33 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
зачем еще раз то же самое дублировать? "Референсы" внимательнее читай.) |
|
| Автор: | BOB51 [ Пт дек 05, 2025 11:12:53 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Пока что не совсем понятно с какой средой разработки топикстартер дело имеет. Он же не объявлял, что под ардуино IDE работает. Да и в самой IDE платформ с Тинькой 13ой минимум 2 - их ещё и устанавливать дополнительно надо (в списке "по умолчанию" их нет- надо вручную добавлять). Может топикстартер пытается копировать "стиль ардуино" в АВРстудио (микрочип студио)... Так что подождем уточнений... OKF, ну не "матрешки" же делать - вкладывать повторно то же самое в то же самое. Обычно достаточно от loop избавиться. И то лишь для гурманов (изврата). Да и авр студии никто не отменял... |
|
| Автор: | OKF [ Сб дек 06, 2025 08:18:33 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
OKF, ну не "матрешки" же делать - вкладывать повторно то же самое в то же самое. Ну да, тоже самое, только без Ардуино. Или же таймер на миллис сам настраивается? Чего там в "референсах" пишут? |
|
| Автор: | BOB51 [ Сб дек 06, 2025 09:20:40 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Если для АВР студии или чистого GCC это одно, а ежли в ардуино IDE - то "матрешка". Пока ведь неизвестно в какой среде/IDE топикстартер программку делает. Я принял исходник alsav22 за работу в ардуиноIDE поскольку его программа не имеет по факту явно объявленного зацикливания в loop(){} как обычно только для ардуино скотчей (в loop зацикливание установлено средствами IDE, также самой IDE выполняется и инициализация Т0, правда не во всех платформах - у некоторых имеются опционные вкладки для разрешения/запрета работы функций времени у "малолапых" АВРок). Собственно с такой точки зрения и все мои ответы были. |
|
| Автор: | alsav22 [ Вт дек 09, 2025 22:40:36 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Продолжение. 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 |
|
| Автор: | BOB51 [ Вт дек 09, 2025 22:51:28 ] |
| Заголовок сообщения: | Re: ATTiny13 работа с таймером |
Смотри ограничения/документацию по симулятору IDE для данного МК. Симулятор имеет версии и отличия/ограничения в зависимости от того, какая версия указана активной для проекта. С меня под ассемблером и АВР студио 4.19 хватает... более старшие увы... не ставил. |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|




