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

Обсуждаем контроллеры компании Atmel.
Ответить
Самсусамыч

Сообщение Самсусамыч »

[uquote="olegue",url="/forum/viewtopic.php?p=3757422#p3757422"]Например я бы мог запсать в OCR0A 1172 и тогда у меня получился бы 1 гц[/uquote]
Если счётчик настроен на прерывание по переполнению, то записывать предварительное значение нужно в регистр TCNT0.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

olegue, либо снижать частоту самой avr, либо считать вручную дополнительно в прерывании. Еще есть AVRки с 16-битными таймерами.
Кстати OCR0A = 0xFF не имеет смысла. Можно запустить таймер не по совпадению с OCR, а просто по переполнению и разрешить прерывание по переполнению. Вектор TIM0_OVF_vect.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15593
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ёжли уж оченно хочется ВСЮ начинку ПО МАКСИМУМУ выпотрошить (тем более для таких "микробов" типа тини13) - идем работать под ассемблером!
:beer:
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

NStorm,

типа такого наверно

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

 ISR(TIM0_COMPA_vect)
   {
      
       j=j+1;
      if (j==4)
	 { 
	    PORTB ^= (1<<LED2);
	    j=0;
	    TCNT0=0x00;
	 }
      
      }

просто целое число подобрать
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение 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. Это ключевое слово подсказывает компилятору "аккуратнее быть" с переменной, что она может меняться в прерывании и не надо её оптимизировать так, что это может помешать.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

BOB51 писал(а):ВСЮ начинку ПО МАКСИМУМУ выпотрошить
да мне хоть бы базу какую-то освоить, как и что пишется и работает.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Ассемеблер не нужен. Прекрасно вся периферия изучается и с помощью C. Регистры одинаковые что там, что сям.
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
здесь прочитал, что define f_cpu лишь указывает компилятору , с какой часторой работает процссор
https://qna.habr.com/q/449147

Добавлено after 3 minutes 56 seconds:
и еще 2й вопрос.
Как можно выводить отладочную информацию , допустим смотреть какую-то переменню в динамике

Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета?
Конечно, можно было приделать 1602, но допустим в тиньке на так много выходов для этого. Ну как-то так.

Добавлено after 17 minutes 9 seconds:
И еще 3-и грабли

В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде.
И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'

А как нужно поделить?
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

olegue писал(а):в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
Что вы там постоянно гуглите... )) Даташит же есть !
https://docviewer.yandex.ua/view/0/?pag ... J9&lang=en

От таких источников синхронизации работает тини... внутренний RC генератор , внешний генератор.... полный список))
источник синхронизации.jpg
(64.63 КБ) 403 скачивания
К примеру частоты внутреннего RC генератора. Частота устанавливается фьюзами.
внутренний RC генератор.jpg
(170.74 КБ) 414 скачиваний
Есть делитель частоты....
делитель частоты.jpg
(147.07 КБ) 414 скачиваний
Ещё можно подключить внешний генератор... и даже нарисовали как)) Добавлено after 7 minutes 33 seconds:
В нормальный аврках (типа мега48 и выше) есть ещё и кварцевый генератор...
кв.jpg
(209.04 КБ) 404 скачивания
И даже есть внешний RC генератор.
Можно припаять обычный подстроечный резистор и менять частоту МК плавно !
Я так и делал))
внешний RC генератор.jpg
(140.64 КБ) 400 скачиваний
...
и т.д. и т.п.))
Короче , МК можно подключать к любому тактовому генератору... к внутреннему... к внешнему... и плавно менять частоту... и вообще как угодно)) Для этого не нужно ничего гуглить , достаточно просто открыть даташит и прочитать))
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

Даташит пока не научился читать.

Поэтому гуглю где простыми словами написано.
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

roman.com, дайте даташит на русском. Мне на английском его читать пока проблематично.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение 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ричный вид?
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение 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, то вообще в функцию не заходит.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение 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.
Последний раз редактировалось NStorm Вт дек 17, 2019 19:13:35, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

NStorm писал(а): вообще плохая практика писать "магические числа" - код потом нечитаем без постоянного заглядывания в ДШ совсем. П
не готов пока по даташиту работать,
нет общего понимания системы,
поэтому выдерну код Гденить в интернетах, запущу, пытаюсь выйти на даташитские настройки, ну и так вот получается
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Ну с таким подходом понимания может и не возникнуть. Откуда ж оно будет, если смысл цифр неизвестен?
Так-то в сети полно нормальных примеров. Почитайте те же курсы от DiHalt - нормальным языком написано по-русски, без заумностей.
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

olegue писал(а):не готов пока по даташиту работать,
нет общего понимания системы,
так ничего не получится... надо всё разбирать подробно. Иначе пустая трата времени.
Даташита на русском нет... надо искать. я тини вообще не использую... (для моих проектов мало выводов и памяти и т.д.).
Чтоб понять сам принцип работы можно читать даташит из другой авр)) Принцип работы всех таймеров авр одинаковый.

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

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

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

Сидим и радуемся.))
Друг Кота
Аватара пользователя
Сообщения: 15593
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение Самсусамыч »

[uquote="olegue",url="/forum/viewtopic.php?p=3757614#p3757614"]На русском самой собой сподручнее.[/uquote]
Согласен, сам из таких… :)
Вот тебе описание на русском:
ATtiny2313
ATmega8
Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel
ATmega128
И в сети по меге128

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

Вернуться в «AVR»