Если счётчик настроен на прерывание по переполнению, то записывать предварительное значение нужно в регистр TCNT0.
Программирование ATtiny13
[uquote="olegue",url="/forum/viewtopic.php?p=3757422#p3757422"]Например я бы мог запсать в OCR0A 1172 и тогда у меня получился бы 1 гц[/uquote]
Если счётчик настроен на прерывание по переполнению, то записывать предварительное значение нужно в регистр TCNT0.
Если счётчик настроен на прерывание по переполнению, то записывать предварительное значение нужно в регистр TCNT0.
- Реклама
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
olegue, либо снижать частоту самой avr, либо считать вручную дополнительно в прерывании. Еще есть AVRки с 16-битными таймерами.
Кстати OCR0A = 0xFF не имеет смысла. Можно запустить таймер не по совпадению с OCR, а просто по переполнению и разрешить прерывание по переполнению. Вектор TIM0_OVF_vect.
Кстати OCR0A = 0xFF не имеет смысла. Можно запустить таймер не по совпадению с OCR, а просто по переполнению и разрешить прерывание по переполнению. Вектор TIM0_OVF_vect.
Ёжли уж оченно хочется ВСЮ начинку ПО МАКСИМУМУ выпотрошить (тем более для таких "микробов" типа тини13) - идем работать под ассемблером!

NStorm,
типа такого наверно
просто целое число подобрать
типа такого наверно
Код: Выделить всё
ISR(TIM0_COMPA_vect)
{
j=j+1;
if (j==4)
{
PORTB ^= (1<<LED2);
j=0;
TCNT0=0x00;
}
}просто целое число подобрать
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Как считать "вручную" для 1 Гц:
Добавлено after 2 minutes 27 seconds:
olegue, или так, как вы написали, но "просто целое число подобрать".
Не забывайте все переменные, которые будут меняться в прерывании объявлять как volatile. Это ключевое слово подсказывает компилятору "аккуратнее быть" с переменной, что она может меняться в прерывании и не надо её оптимизировать так, что это может помешать.
Код: Выделить всё
volatile uint8_t t0_ovf_cnt, t0_1hz_flag;
ISR(TIM0_COMPA_vect) {
t0_ovf_cnt++; // Увеличием свою переменную, отмечая кол-во входов в прерывание по совпадаению.
if (t0_ovf_cnt == 4) // если это был 4ый вход, пора изменить OCR0A, чтобы дальше получился 1 Гц
OCR0A = 148; // 1172 вы сами посчитали, 4 раза по 256 уже прошло, осталось 148 (256*4 + 148 = 1172)
else if (t0_ovf_cnt >= 5) { // И вот следующий раз натикало 1172 тика вот тут уже
OCR0A = 255; // вернем регистр сравнения назад к 0xFF
t0_ovf_cnt = 0; // сбросим нашу переменную с кол-ом переполнений
t0_1hz_flag = 1; // установим переменную с флагом переполнения. Мы можем в main() потом проверить его и если он 1 - значит пора что-то делать. Или вместо этой строки сразу можем написать скажем переключения пина со светодиодом и будет мерцание в 1 Гц.
}
}
olegue, или так, как вы написали, но "просто целое число подобрать".
Не забывайте все переменные, которые будут меняться в прерывании объявлять как volatile. Это ключевое слово подсказывает компилятору "аккуратнее быть" с переменной, что она может меняться в прерывании и не надо её оптимизировать так, что это может помешать.
- Реклама
да мне хоть бы базу какую-то освоить, как и что пишется и работает.BOB51 писал(а):ВСЮ начинку ПО МАКСИМУМУ выпотрошить
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Ассемеблер не нужен. Прекрасно вся периферия изучается и с помощью C. Регистры одинаковые что там, что сям.
Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
здесь прочитал, что define f_cpu лишь указывает компилятору , с какой часторой работает процссор
https://qna.habr.com/q/449147
Добавлено after 3 minutes 56 seconds:
и еще 2й вопрос.
Как можно выводить отладочную информацию , допустим смотреть какую-то переменню в динамике
Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета?
Конечно, можно было приделать 1602, но допустим в тиньке на так много выходов для этого. Ну как-то так.
Добавлено after 17 minutes 9 seconds:
И еще 3-и грабли
В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде.
И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'
А как нужно поделить?
здесь прочитал, что define f_cpu лишь указывает компилятору , с какой часторой работает процссор
https://qna.habr.com/q/449147
Добавлено after 3 minutes 56 seconds:
и еще 2й вопрос.
Как можно выводить отладочную информацию , допустим смотреть какую-то переменню в динамике
Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета?
Конечно, можно было приделать 1602, но допустим в тиньке на так много выходов для этого. Ну как-то так.
Добавлено after 17 minutes 9 seconds:
И еще 3-и грабли
В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде.
И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'
А как нужно поделить?
Что вы там постоянно гуглите... )) Даташит же есть !olegue писал(а):в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
https://docviewer.yandex.ua/view/0/?pag ... J9&lang=en
От таких источников синхронизации работает тини... внутренний RC генератор , внешний генератор.... полный список)) К примеру частоты внутреннего RC генератора. Частота устанавливается фьюзами. Есть делитель частоты.... Ещё можно подключить внешний генератор... и даже нарисовали как)) Добавлено after 7 minutes 33 seconds:
В нормальный аврках (типа мега48 и выше) есть ещё и кварцевый генератор... И даже есть внешний RC генератор.
Можно припаять обычный подстроечный резистор и менять частоту МК плавно !
Я так и делал)) ...
и т.д. и т.п.))
Короче , МК можно подключать к любому тактовому генератору... к внутреннему... к внешнему... и плавно менять частоту... и вообще как угодно)) Для этого не нужно ничего гуглить , достаточно просто открыть даташит и прочитать))
Даташит пока не научился читать.
Поэтому гуглю где простыми словами написано.
Поэтому гуглю где простыми словами написано.
Осталось только написать свой код для таймера 0, как нас просит компилятор (отмечено синим), остальное за нас уже сделал компилятор)).
Всё))
Всё))
roman.com, дайте даташит на русском. Мне на английском его читать пока проблематично.
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Если не трогать регистр OSCCAL, то по-умолчанию он откалиброван на 4.8/9.6 МГц. Фьюзами CKSEL + CKDIV8 по-умолчанию выставлено 9.6 МГц / 8, т.е. 1.2 МГц. Фьюзы меняются только во время прошивки.Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
Записывая в регистр CLKPR можно на ходу менять делитель и изменять Fclk от 1 до 256 (как степень 2):

По-умолчанию зашитый фьюз CKDIV8 выставляет при старте МК именно этот регистр в 0b0011, включая делитель на 8.
Чтобы поменять делитель, прежде, чем писать в CLKPS, надо записать 1 в CLKPCE и сразу потом писать нужный делитель. Пример, включить делитель на 32 (300 кГц частота Fclk):
Код: Выделить всё
CLKPR = 1 << CLKPCE;
CLKPR = (1 << CLKPS2) | (1 << CLKPS0);
Без этого будет тяжко. Надо учиться читать ДШ на английском, хотя бы с переводчиком для начала. Благо они по главам написаны, целиком читать не обязательно, но ответы на одиночны вопросы можно находить.Мне на английском его читать пока проблематично.
Добавлено after 2 minutes 41 second:
В протеусе - тормознули программу, Debug->AVR->Variables там будут переменные текущие и их значения.Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета?

Добавлено after 2 minutes 36 seconds:
Нужен код. Что на что делится непонятно. Почему 0 и при чем здесь 16ричный вид?В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде.
И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'
нет , я и без словаря все понимаю, но тяжко, иногда нужно 2-3 раза прочитать. На русском самой собой сподручнее.NStorm писал(а):Без этого будет тяжко. Надо учиться читать ДШ на английском,
разобрался.NStorm писал(а):Нужен код. Что на что делится непонятно. Почему 0 и при чем здесь 16ричный вид?
Добавлено after 1 hour 29 minutes 47 seconds:
Код: Выделить всё
TCCR0B=0x05; //ДЕЛЕНИЕ НА 1024
//TCCR0B|=(1<<CS02); // УСТАНОВИМ ДЕЛИТЕЛЬ 1024
//TCCR0B|=(1<<CS00); // Эти 2 бита в 1
TCCR0A=0x00;
OCR0A=0x00; // 30; 1200000/1024=1172 ГЦ и делим на число 0x1E (30)= 39 гц
TIMSK0=0x04; // разрешаем таймер по совпадению с числом в OCR0A
кАКОЙ БЫ число в OCR0A не писал, все равно делит на 255 и дает 4.5 срабатываний в секунду.
а если ставлю TIMSK0=0X02, то вообще в функцию не заходит.
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Потому, чтобы он работал в таком режиме, надо ему такой режим установить в TCCR0A:у меня вот эти настройки таймера работают по переполнению,а не по сравнению с OCR0A.
Код: Выделить всё
TCCR0A = (1 << WGM01);Потому что небось остается ISR(TIM0_COMPA_vect), а надо ISR(TIM0_OVF_vect) - я ведь писал выше.а если ставлю TIMSK0=0X02, то вообще в функцию не заходит.
И вообще плохая практика писать "магические числа" - код потом нечитаем без постоянного заглядывания в ДШ совсем. Пишите TIMSK = (1 << OCIE0A);, а не 0x04.
Последний раз редактировалось NStorm Вт дек 17, 2019 19:13:35, всего редактировалось 1 раз.
не готов пока по даташиту работать,NStorm писал(а): вообще плохая практика писать "магические числа" - код потом нечитаем без постоянного заглядывания в ДШ совсем. П
нет общего понимания системы,
поэтому выдерну код Гденить в интернетах, запущу, пытаюсь выйти на даташитские настройки, ну и так вот получается
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Ну с таким подходом понимания может и не возникнуть. Откуда ж оно будет, если смысл цифр неизвестен?
Так-то в сети полно нормальных примеров. Почитайте те же курсы от DiHalt - нормальным языком написано по-русски, без заумностей.
Так-то в сети полно нормальных примеров. Почитайте те же курсы от DiHalt - нормальным языком написано по-русски, без заумностей.
так ничего не получится... надо всё разбирать подробно. Иначе пустая трата времени.olegue писал(а):не готов пока по даташиту работать,
нет общего понимания системы,
Даташита на русском нет... надо искать. я тини вообще не использую... (для моих проектов мало выводов и памяти и т.д.).
Чтоб понять сам принцип работы можно читать даташит из другой авр)) Принцип работы всех таймеров авр одинаковый.
Для начала общая схема таймера. 1. есть два "главных" регистра TCR0A и TCR0B. Они задают режим работы таймера:
-управление выводами (COM0A1:0) - включить/выключить/переключить. Ничего не выбираем.
Можно пока выводы тини 13 не трогать.))
-режим работы таймера (WGM01:0). Всего 7 режимов. Смотрим таблицу и выбираем нужный нам режим работы.
Например выбрали нормальный режим. Пишем (WGM01:0) все нули... таймер будет 'тикать' от 0 до 255. -настраиваем делитель частоты для таймера. Тоже по таблице.
Например выбрали делитель 1. На входе получим: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам). Всё)) Всего три параметра. Режим таймера задан.
2. дальше прерывание. Настраиваем маску прерывания в регистре TIMSK: по переполнению/по совпадению.
Выбираем по переполнению (TOV0).
Всё)) Всего два параметра. Прерывание таймера задали.
Включаем тини 13... смотрим как таймер вызывает прерывание каждые: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам).
Сидим и радуемся.))
Даташиты читать влом...(или проблемы языковые)...
http://publ.lib.ru/ARCHIVES/B/BELOV_Ale ... _A.V..html
https://sunduk.radiokot.ru/view/?id=1287391092
ГРЫЗЕМССссс!

http://publ.lib.ru/ARCHIVES/B/BELOV_Ale ... _A.V..html
https://sunduk.radiokot.ru/view/?id=1287391092
ГРЫЗЕМССссс!
[uquote="olegue",url="/forum/viewtopic.php?p=3757614#p3757614"]На русском самой собой сподручнее.[/uquote]
Согласен, сам из таких…
Вот тебе описание на русском:
ATtiny2313
ATmega8
Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel
ATmega128
И в сети по меге128
Думаю на первое время хватит.
Согласен, сам из таких…
Вот тебе описание на русском:
ATtiny2313
ATmega8
Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel
ATmega128
И в сети по меге128
Думаю на первое время хватит.


