Страница 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) - идем работать под ассемблером!
:beer:

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 генератор , внешний генератор.... полный список))
источник синхронизации.jpg
(64.63 КБ) 417 скачиваний
К примеру частоты внутреннего RC генератора. Частота устанавливается фьюзами.
внутренний RC генератор.jpg
(170.74 КБ) 429 скачиваний
Есть делитель частоты....
делитель частоты.jpg
(147.07 КБ) 429 скачиваний
Ещё можно подключить внешний генератор... и даже нарисовали как)) Добавлено after 7 minutes 33 seconds:
В нормальный аврках (типа мега48 и выше) есть ещё и кварцевый генератор...
кв.jpg
(209.04 КБ) 417 скачиваний
И даже есть внешний RC генератор.
Можно припаять обычный подстроечный резистор и менять частоту МК плавно !
Я так и делал))
внешний RC генератор.jpg
(140.64 КБ) 415 скачиваний
...
и т.д. и т.п.))
Короче , МК можно подключать к любому тактовому генератору... к внутреннему... к внешнему... и плавно менять частоту... и вообще как угодно)) Для этого не нужно ничего гуглить , достаточно просто открыть даташит и прочитать))

Re: Программирование ATtiny13

Добавлено: Вт дек 17, 2019 12:42:53
olegue
Даташит пока не научился читать.

Поэтому гуглю где простыми словами написано.

Re: Программирование ATtiny13

Добавлено: Вт дек 17, 2019 13:22:54
roman.com

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:

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

TCCR0A = (1 << WGM01);
Режим называется 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 писал(а):не готов пока по даташиту работать,
нет общего понимания системы,
так ничего не получится... надо всё разбирать подробно. Иначе пустая трата времени.
Даташита на русском нет... надо искать. я тини вообще не использую... (для моих проектов мало выводов и памяти и т.д.).
Чтоб понять сам принцип работы можно читать даташит из другой авр)) Принцип работы всех таймеров авр одинаковый.

Для начала общая схема таймера.
схема.jpg
(106.27 КБ) 389 скачиваний
1. есть два "главных" регистра TCR0A и TCR0B. Они задают режим работы таймера:
-управление выводами (COM0A1:0) - включить/выключить/переключить. Ничего не выбираем.
Можно пока выводы тини 13 не трогать.))
-режим работы таймера (WGM01:0). Всего 7 режимов. Смотрим таблицу и выбираем нужный нам режим работы.
Например выбрали нормальный режим. Пишем (WGM01:0) все нули... таймер будет 'тикать' от 0 до 255.
режим таймера.jpg
(85.12 КБ) 440 скачиваний
-настраиваем делитель частоты для таймера. Тоже по таблице.
Например выбрали делитель 1. На входе получим: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам).
делитель частоты.jpg
(49.56 КБ) 316 скачиваний
Всё)) Всего три параметра. Режим таймера задан.

2. дальше прерывание. Настраиваем маску прерывания в регистре TIMSK: по переполнению/по совпадению.
Выбираем по переполнению (TOV0).
Всё)) Всего два параметра. Прерывание таймера задали.

Включаем тини 13... смотрим как таймер вызывает прерывание каждые: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам).

Сидим и радуемся.))

Re: Программирование ATtiny13

Добавлено: Вт дек 17, 2019 19:35:45
BOB51
Даташиты читать влом...(или проблемы языковые)...
http://publ.lib.ru/ARCHIVES/B/BELOV_Ale ... _A.V..html
https://sunduk.radiokot.ru/view/?id=1287391092
ГРЫЗЕМССссс!
8)

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

Думаю на первое время хватит. :)