olegue, либо снижать частоту самой avr, либо считать вручную дополнительно в прерывании. Еще есть AVRки с 16-битными таймерами. Кстати OCR0A = 0xFF не имеет смысла. Можно запустить таймер не по совпадению с OCR, а просто по переполнению и разрешить прерывание по переполнению. Вектор TIM0_OVF_vect.
Любая разработка начинается с чтения документации и изучения доступных средств разработки. Данный материал целиком посвящен средствам разработки, включая детальные инструкции по запуску вашего первого приложения на BlueNRG-LP. Описана работа с отладкой STEVAL-IDB011V1, набором инструментов и пакетом ПО позволяющим разработчику быстро войти в курс дела.
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. Это ключевое слово подсказывает компилятору "аккуратнее быть" с переменной, что она может меняться в прерывании и не надо её оптимизировать так, что это может помешать.
Что привлекает в SiC по сравнению с кремнием, и какие особенности делают компоненты SiC часто используемыми, несмотря на более высокую стоимость в сравнении с кремниевыми высоковольтными устройствами? – Объясняет специалист ведущего разработчика силовых приборов из карбида кремния, компании Infineon.
Карма: 13
Рейтинг сообщений: 80
Зарегистрирован: Сб май 21, 2016 11:04:52 Сообщений: 2231 Откуда: Беларусь
Рейтинг сообщения:0
Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)? здесь прочитал, что define f_cpu лишь указывает компилятору , с какой часторой работает процссор https://qna.habr.com/q/449147
Добавлено after 3 minutes 56 seconds: и еще 2й вопрос. Как можно выводить отладочную информацию , допустим смотреть какую-то переменню в динамике
Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета? Конечно, можно было приделать 1602, но допустим в тиньке на так много выходов для этого. Ну как-то так.
Добавлено after 17 minutes 9 seconds: И еще 3-и грабли
В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде. И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'
... и т.д. и т.п.)) Короче , МК можно подключать к любому тактовому генератору... к внутреннему... к внешнему... и плавно менять частоту... и вообще как угодно)) Для этого не нужно ничего гуглить , достаточно просто открыть даташит и прочитать))
Как и в каких пределах устанавливается внутренняя частота процессора (встроенного генератора)?
Если не трогать регистр 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):
Без этого будет тяжко. Надо учиться читать ДШ на английском, хотя бы с переводчиком для начала. Благо они по главам написаны, целиком читать не обязательно, но ответы на одиночны вопросы можно находить.
Добавлено after 2 minutes 41 second:
Цитата:
Ну например как в отладчике. допустим я посчитал частоту импульсов с генератора. Как в протеусе вывести на экран результат подсчета?
В протеусе - тормознули программу, Debug->AVR->Variables там будут переменные текущие и их значения.
Добавлено after 2 minutes 36 seconds:
Цитата:
В отладчике вижу что все мои переменный указаны в шестнадцатиричном виде. И когда я делю количество импульсов на секунды, неудивительно что у меня в результирующей переменной '\0'
Нужен код. Что на что делится непонятно. Почему 0 и при чем здесь 16ричный вид?
Карма: 13
Рейтинг сообщений: 80
Зарегистрирован: Сб май 21, 2016 11:04:52 Сообщений: 2231 Откуда: Беларусь
Рейтинг сообщения:0
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, то вообще в функцию не заходит.
у меня вот эти настройки таймера работают по переполнению,а не по сравнению с 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 раз.
Карма: 13
Рейтинг сообщений: 80
Зарегистрирован: Сб май 21, 2016 11:04:52 Сообщений: 2231 Откуда: Беларусь
Рейтинг сообщения:0
NStorm писал(а):
вообще плохая практика писать "магические числа" - код потом нечитаем без постоянного заглядывания в ДШ совсем. П
не готов пока по даташиту работать, нет общего понимания системы, поэтому выдерну код Гденить в интернетах, запущу, пытаюсь выйти на даташитские настройки, ну и так вот получается
Ну с таким подходом понимания может и не возникнуть. Откуда ж оно будет, если смысл цифр неизвестен? Так-то в сети полно нормальных примеров. Почитайте те же курсы от DiHalt - нормальным языком написано по-русски, без заумностей.
Карма: -2
Рейтинг сообщений: -166
Зарегистрирован: Вт мар 13, 2012 12:16:13 Сообщений: 4418 Откуда: Россия
Рейтинг сообщения:0
olegue писал(а):
не готов пока по даташиту работать, нет общего понимания системы,
так ничего не получится... надо всё разбирать подробно. Иначе пустая трата времени. Даташита на русском нет... надо искать. я тини вообще не использую... (для моих проектов мало выводов и памяти и т.д.). Чтоб понять сам принцип работы можно читать даташит из другой авр)) Принцип работы всех таймеров авр одинаковый.
1. есть два "главных" регистра TCR0A и TCR0B. Они задают режим работы таймера: -управление выводами (COM0A1:0) - включить/выключить/переключить. Ничего не выбираем. Можно пока выводы тини 13 не трогать.)) -режим работы таймера (WGM01:0). Всего 7 режимов. Смотрим таблицу и выбираем нужный нам режим работы. Например выбрали нормальный режим. Пишем (WGM01:0) все нули... таймер будет 'тикать' от 0 до 255.
2. дальше прерывание. Настраиваем маску прерывания в регистре TIMSK: по переполнению/по совпадению. Выбираем по переполнению (TOV0). Всё)) Всего два параметра. Прерывание таймера задали.
Включаем тини 13... смотрим как таймер вызывает прерывание каждые: тактовая частота / 1 делитель / 256 таймер =... (посчитай сам).
Сейчас этот форум просматривают: Deoptim и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения