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

Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 11:23:48
olegue
NStorm,
типа такого наверно
Код: Выделить всё
ISR(TIM0_COMPA_vect)
{
j=j+1;
if (j==4)
{
PORTB ^= (1<<LED2);
j=0;
TCNT0=0x00;
}
}
просто целое число подобрать
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 11:27:12
NStorm
Как считать "вручную" для 1 Гц:
Код: Выделить всё
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 Гц.
}
}
Добавлено after 2 minutes 27 seconds:
olegue, или так, как вы написали, но "просто целое число подобрать".
Не забывайте все переменные, которые будут меняться в прерывании объявлять как volatile. Это ключевое слово подсказывает компилятору "аккуратнее быть" с переменной, что она может меняться в прерывании и не надо её оптимизировать так, что это может помешать.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 11:27:14
olegue
BOB51 писал(а):ВСЮ начинку ПО МАКСИМУМУ выпотрошить
да мне хоть бы базу какую-то освоить, как и что пишется и работает.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 11:28:46
NStorm
Ассемеблер не нужен. Прекрасно вся периферия изучается и с помощью C. Регистры одинаковые что там, что сям.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 12:31:00
olegue
Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
здесь прочитал, что define f_cpu лишь указывает компилятору , с какой часторой работает процссор
https://qna.habr.com/q/449147
Добавлено after 3 minutes 56 seconds:
и еще 2й вопрос.
Как можно выводить отладочную информацию , допустим смотреть какую-то переменню в динамике
Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета?
Конечно, можно было приделать 1602, но допустим в тиньке на так много выходов для этого. Ну как-то так.
Добавлено after 17 minutes 9 seconds:
И еще 3-и грабли
В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде.
И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'
А как нужно поделить?
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 12:39:37
roman.com
olegue писал(а):в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
Что вы там постоянно гуглите... )) Даташит же есть !
https://docviewer.yandex.ua/view/0/?pag ... J9&lang=en
От таких источников синхронизации работает тини... внутренний RC генератор , внешний генератор.... полный список))
К примеру частоты внутреннего RC генератора. Частота устанавливается фьюзами.
Есть делитель частоты....
Ещё можно подключить внешний генератор... и даже нарисовали как))
Добавлено after 7 minutes 33 seconds:
В нормальный аврках (типа мега48 и выше) есть ещё и кварцевый генератор...
- кв.jpg
- (209.04 КБ) 417 скачиваний
И даже есть внешний RC генератор.
Можно припаять обычный подстроечный резистор и менять частоту МК
плавно !
Я так и делал))
...
и т.д. и т.п.))
Короче , МК можно подключать к любому тактовому генератору... к внутреннему... к внешнему... и плавно менять частоту... и вообще как угодно)) Для этого не нужно ничего гуглить , достаточно просто открыть даташит и прочитать))
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 12:42:53
olegue
Даташит пока не научился читать.
Поэтому гуглю где простыми словами написано.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 13:22:54
roman.com
Осталось только написать свой код для таймера 0, как нас просит компилятор (отмечено синим), остальное за нас уже сделал компилятор)).
Всё))
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 13:57:28
olegue
roman.com, дайте даташит на русском. Мне на английском его читать пока проблематично.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 15:02:44
NStorm
Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
Если не трогать регистр 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 1 minute 17 seconds:
Мне на английском его читать пока проблематично.
Без этого будет тяжко. Надо учиться читать ДШ на английском, хотя бы с переводчиком для начала. Благо они по главам написаны, целиком читать не обязательно, но ответы на одиночны вопросы можно находить.
Добавлено after 2 minutes 41 second:
Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета?
В протеусе - тормознули программу, Debug->AVR->Variables там будут переменные текущие и их значения.
Добавлено after 2 minutes 36 seconds:
В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде.
И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'
Нужен код. Что на что делится непонятно. Почему 0 и при чем здесь 16ричный вид?
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 16:54:23
olegue
NStorm писал(а):Без этого будет тяжко. Надо учиться читать ДШ на английском,
нет , я и без словаря все понимаю, но тяжко, иногда нужно 2-3 раза прочитать. На русском самой собой сподручнее.
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.
кАКОЙ БЫ число в OCR0A не писал, все равно делит на 255 и дает 4.5 срабатываний в секунду.
а если ставлю TIMSK0=0X02, то вообще в функцию не заходит.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 17:23:54
NStorm
у меня вот эти настройки таймера работают по переполнению,а не по сравнению с OCR0A.
Потому, чтобы он работал в таком режиме, надо ему такой режим установить в TCCR0A:
Режим называется Clear Timer on Compare Match (CTC). Чтобы он считал до OCR0A, а НЕ до 0xFF.
а если ставлю TIMSK0=0X02, то вообще в функцию не заходит.
Потому что небось остается ISR(TIM0_COMPA_vect), а надо ISR(TIM0_OVF_vect) - я ведь писал выше.
И вообще плохая практика писать "магические числа" - код потом нечитаем без постоянного заглядывания в ДШ совсем. Пишите TIMSK = (1 << OCIE0A);, а не 0x04.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 17:43:21
olegue
NStorm писал(а): вообще плохая практика писать "магические числа" - код потом нечитаем без постоянного заглядывания в ДШ совсем. П
не готов пока по даташиту работать,
нет общего понимания системы,
поэтому выдерну код Гденить в интернетах, запущу, пытаюсь выйти на даташитские настройки, ну и так вот получается
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 19:13:17
NStorm
Ну с таким подходом понимания может и не возникнуть. Откуда ж оно будет, если смысл цифр неизвестен?
Так-то в сети полно нормальных примеров. Почитайте те же курсы от DiHalt - нормальным языком написано по-русски, без заумностей.
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 19:14:07
roman.com
olegue писал(а):не готов пока по даташиту работать,
нет общего понимания системы,
так ничего не получится... надо всё разбирать подробно. Иначе пустая трата времени.
Даташита на русском нет... надо искать. я тини вообще не использую... (для моих проектов мало выводов и памяти и т.д.).
Чтоб понять сам принцип работы можно читать даташит из другой авр)) Принцип работы всех таймеров авр одинаковый.
Для начала общая схема таймера.
1. есть два "главных" регистра TCR0A и TCR0B. Они задают режим работы таймера:
-управление выводами (COM0A1:0) - включить/выключить/переключить. Ничего не выбираем.
Можно пока выводы тини 13 не трогать.))
-режим работы таймера (WGM01:0). Всего 7 режимов. Смотрим таблицу и выбираем нужный нам режим работы.
Например выбрали нормальный режим. Пишем (WGM01:0) все нули... таймер будет 'тикать' от 0 до 255.
-настраиваем делитель частоты для таймера. Тоже по таблице.
Например выбрали делитель 1. На входе получим: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам).
Всё)) Всего три параметра. Режим таймера задан.
2. дальше прерывание. Настраиваем маску прерывания в регистре TIMSK: по переполнению/по совпадению.
Выбираем по переполнению (TOV0).
Всё)) Всего два параметра. Прерывание таймера задали.
Включаем тини 13... смотрим как таймер вызывает прерывание каждые: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам).
Сидим и радуемся.))
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 19:35:45
BOB51
Re: Программирование ATtiny13
Добавлено: Вт дек 17, 2019 20:08:16
Самсусамыч
[uquote="olegue",url="/forum/viewtopic.php?p=3757614#p3757614"]На русском самой собой сподручнее.[/uquote]
Согласен, сам из таких…
Вот тебе описание на русском:
ATtiny2313
ATmega8
Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel
ATmega128
И в сети по меге128
Думаю на первое время хватит.
