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

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

Вт дек 17, 2019 10:40:53

Например я бы мог запсать в OCR0A 1172 и тогда у меня получился бы 1 гц

Если счётчик настроен на прерывание по переполнению, то записывать предварительное значение нужно в регистр TCNT0.

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

Вт дек 17, 2019 11:12:15

olegue, либо снижать частоту самой avr, либо считать вручную дополнительно в прерывании. Еще есть AVRки с 16-битными таймерами.
Кстати OCR0A = 0xFF не имеет смысла. Можно запустить таймер не по совпадению с OCR, а просто по переполнению и разрешить прерывание по переполнению. Вектор TIM0_OVF_vect.

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

Вт дек 17, 2019 11:22:44

Ёжли уж оченно хочется ВСЮ начинку ПО МАКСИМУМУ выпотрошить (тем более для таких "микробов" типа тини13) - идем работать под ассемблером!
:beer:

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

Вт дек 17, 2019 11:23:48

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

Как считать "вручную" для 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

BOB51 писал(а):ВСЮ начинку ПО МАКСИМУМУ выпотрошить

да мне хоть бы базу какую-то освоить, как и что пишется и работает.

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

Вт дек 17, 2019 11:28:46

Ассемеблер не нужен. Прекрасно вся периферия изучается и с помощью C. Регистры одинаковые что там, что сям.

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

Вт дек 17, 2019 12:31:00

Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
здесь прочитал, что 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

olegue писал(а):в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?

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

От таких источников синхронизации работает тини... внутренний RC генератор , внешний генератор.... полный список))
источник синхронизации.jpg
(64.63 KiB) Скачиваний: 373

К примеру частоты внутреннего RC генератора. Частота устанавливается фьюзами.
внутренний RC генератор.jpg
(170.74 KiB) Скачиваний: 388

Есть делитель частоты....
делитель частоты.jpg
(147.07 KiB) Скачиваний: 388

Ещё можно подключить внешний генератор... и даже нарисовали как))


Добавлено after 7 minutes 33 seconds:
В нормальный аврках (типа мега48 и выше) есть ещё и кварцевый генератор...
кв.jpg
(209.04 KiB) Скачиваний: 380

И даже есть внешний RC генератор.
Можно припаять обычный подстроечный резистор и менять частоту МК плавно !
Я так и делал))
внешний RC генератор.jpg
(140.64 KiB) Скачиваний: 374

...
и т.д. и т.п.))
Короче , МК можно подключать к любому тактовому генератору... к внутреннему... к внешнему... и плавно менять частоту... и вообще как угодно)) Для этого не нужно ничего гуглить , достаточно просто открыть даташит и прочитать))

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

Вт дек 17, 2019 12:42:53

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

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

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

Вт дек 17, 2019 13:22:54





Осталось только написать свой код для таймера 0, как нас просит компилятор (отмечено синим), остальное за нас уже сделал компилятор)).
Всё))

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

Вт дек 17, 2019 13:57:28

roman.com, дайте даташит на русском. Мне на английском его читать пока проблематично.

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

Вт дек 17, 2019 15:02:44

Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?

Если не трогать регистр 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

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

у меня вот эти настройки таймера работают по переполнению,а не по сравнению с 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 раз.

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

Вт дек 17, 2019 17:43:21

NStorm писал(а): вообще плохая практика писать "магические числа" - код потом нечитаем без постоянного заглядывания в ДШ совсем. П


не готов пока по даташиту работать,
нет общего понимания системы,
поэтому выдерну код Гденить в интернетах, запущу, пытаюсь выйти на даташитские настройки, ну и так вот получается

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

Вт дек 17, 2019 19:13:17

Ну с таким подходом понимания может и не возникнуть. Откуда ж оно будет, если смысл цифр неизвестен?
Так-то в сети полно нормальных примеров. Почитайте те же курсы от DiHalt - нормальным языком написано по-русски, без заумностей.

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

Вт дек 17, 2019 19:14:07

olegue писал(а):не готов пока по даташиту работать,
нет общего понимания системы,

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

Для начала общая схема таймера.
схема.jpg
(106.27 KiB) Скачиваний: 357

1. есть два "главных" регистра TCR0A и TCR0B. Они задают режим работы таймера:
-управление выводами (COM0A1:0) - включить/выключить/переключить. Ничего не выбираем.
Можно пока выводы тини 13 не трогать.))
-режим работы таймера (WGM01:0). Всего 7 режимов. Смотрим таблицу и выбираем нужный нам режим работы.
Например выбрали нормальный режим. Пишем (WGM01:0) все нули... таймер будет 'тикать' от 0 до 255.
режим таймера.jpg
(85.12 KiB) Скачиваний: 408

-настраиваем делитель частоты для таймера. Тоже по таблице.
Например выбрали делитель 1. На входе получим: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам).
делитель частоты.jpg
(49.56 KiB) Скачиваний: 285

Всё)) Всего три параметра. Режим таймера задан.

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

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

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

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

Вт дек 17, 2019 19:35:45

Даташиты читать влом...(или проблемы языковые)...
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

На русском самой собой сподручнее.

Согласен, сам из таких… :)
Вот тебе описание на русском:
ATtiny2313
ATmega8
Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel
ATmega128
И в сети по меге128

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