Ну у нанки/про-мини/уно базовая частота таки 16 МГц... И такое же в "родной" NG применяется... Чуток полегше - а под 8/8а со встроенным RC явно не то будет. Флажок конечно хорошо, но его ведь в общем цикле опрашивать надо - а то уже или очередь задач или простое ожидание "пока все подряд не перещелкают"... Это при максимальной длине "кадра" в 4 миллисекунды (развертка 62Гц)... Так что независимо вертящееся с моего взгляду получше... ОТНОСИТЕЛЬНО... Да и сам процесс обслуживания дисплея достаточно простенько-коротенький - погасить аноды, скинуть из ОЗУ код в порт байта, зажечь по анодам да считать возвратный с клавиатуры. Ну и в конце цикла при необходимости скопировать 4 байта из одного массива в другой. Не слишком то и долго (даже под Си). Главное на моей "паутинной монтаЖОПе" вполне себе красивенько циферки гоняет. Без мерцаний/подсветов и прочей гадости. И кнопы на нажатие аккуратненько отзываются (несмотря на всего два опроса на каждом знакоместе). Следовательно и покрасивше упакованная будет еще лучше работать. Жаль только до....на лапок зазря израсходовалось... уж много удобнее хотя бы 595й под сегменты выставить... Зато хоть "теорию" на практике прокрутил. Кыстати... я пока только заголовочник сыскал - arduino.h (их там натыкано во многих местах, но вроде все одинаковые)... А вот где исходники *.с/*.срр к ним искать? Тем более, что у каждой платформы возможны различия...
Миллис можно б и без выключения прерываний... но то на таком таймере, где "захват на лету" возможно выполнить... А ежли уже изначально заложена"огрешность" - так и останется в данном случае. Ну да то не столь уж и плачевно...
// ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА (режим совпадения по OCR0A) OCR0A = 254
- мож кому с такой частотой индикацию регенерировать надо, таймер на другой пределитель низя - милисы и пр. сдуются. про 595 изначально предлагалось. а исходники на гитхабе вестимо https://github.com/arduino/ArduinoCore- ... es/arduino
Цитата:
Ну у нанки/про-мини/уно базовая частота таки 16 МГц... И такое же в "родной" NG применяется... Чуток полегше - а под 8/8а со встроенным RC явно не то будет.
у MsTimer2 усё продумано и мега8 и частоты разные: Спойлер
Я изначально ни Т1 ни Т2 трогать не собирался - интересовало или вписаться в пару tone() -> attachInterrupt()... или попробовать, чего из того книжна совета насчет Т0 получится. Оное то получилось, но вывести результат в отдельный файл/класс при tone() -> attachInterrupt() оказалось муторно... "Добавка" к Т0 дает только дублирующую генерацию миллисекунды для какого-то собственного процесса. Причем независимо от того, что в OCR0A записано результирующий интервал прерывания будет та же 1миллисекунда, а вот ее смещение от "родимой"системной от содержимого OCR0A явно зависит. Однако для дисплейного модуля с х4 остается всего-то 4 "тика" на каждую позицию (62,5 Гц)... Для более высокочастотной развертки такой вариант проблематичен, но для примитива - вполне достаточно. Собственно заменить прямой вывод на сброс в последовательный регистр за 0,002 секунды вполне можно.... Вобщем то, что было интересно я таки посмотрел в реал-макете и "в заметки" закинул. Насчет запрета на прерывания у миллисов... У нас же 4х байтовое длинное целое - а организация ОЗУ 1-байтовая. Причем запрос асинхронен по отношению к генератору системной частоты. Вот и запрет прерываний... Насчет SREG - то уже как программа пересылки данных устроена - ежли на счетчиках, то необходимо - ежли как иначе... В принципе там чтение с последующей записью - достаточно команд, чтоб вклинившееся прерывание данные успело испортить. РУТИНА обычная в подобных случаях...
Я изначально ни Т1 ни Т2 трогать не собирался ... или попробовать, чего из того книжна совета насчет Т0 получится
странные советы для true ардуинщиков - милисы ж это согласно "референсу" для индикации и ничего большего не нужно спокойно в loop() считывай милис типа:
Код:
unsigned long temp_millis;
loop(){
if(temp_milis != millis()) { temp_millis = millis()); ПодпрограмммаИндикации(); ПодпрограммаКлавиатурыi(); } ... тут еще много полезного можно сделать(); ... а тут еще(); ... и т.д.(); }
и можно много писанины поупрощать - и количество digitalWrite резко уменьшится : Спойлер
Код:
// список выводов Arduino для подключения к разрядам a-g // семисегментного индикатора int pins[8]={9,13,4,6,7,10,3,5}; //список выводов Arduino для подключения к катодам.анодам // семисегментного индикатора int pindigits[4]={2,8,11,12};
Любой опрос в цикле - хорош только для тех случаев, где размер цикла явно меньше интервала индикации. В ином случае будут сдвиги в произвольные моменты времени. Мы же не знаем, чего еще помимо обслуживания дисплея прожка делать будет, а те задачки могут бысть весьма громоздкими. Независимый процесс на прерывании заметно стабильнее работает. Относительно вывода - при "байтовой" структуре порта там вообще проблем не имеется. Только вот таких МК на сегодня не так уж много да и раскладка выводов у адуриньи УЖЕ сделана без учета линейной "байтовости". А в моем примере вообще "чехардень" из выводов, относящихся к разным портам МК (так уж ранее разводка выполнялась - влом менять для "поиграться"). Цикл на счетчике в таком случае заметно хуже, чем перебор восьми комбинаций пересылки бита по фиксированным значениям. Касательно переброса через массивы - смотрится неплохо, только нерационально - минимум два массива, да сопровождение. В принципе под ассемблером там всего-то биты перегоняются, а вот под Си или аж 12 байт с содержимым 1/0 или еще чего (структура с битовыми полями)... Как бы общий размер используемых ресурсов заметно больше не оказался. Добавить последующие "рожки" кои повылазят при выводе фрагмента в отдельный файл/библиотеку... То уже можно вылизывать лишь в готовом тексте, который работает.
Любой опрос в цикле - хорош только для тех случаев, где размер цикла явно меньше интервала индикации.
а чего там еще в часах да и других задачах делать в цикле больше миллисекунды - например между миллисекундой прекрасно опрашивается DS18B20 (добавить в часы термометр самое то). Даже термопарный полином быстрее считается. Цель то каковая была:
Цитата:
Главное на моей "паутинной монтаЖОПе" вполне себе красивенько циферки гоняет...
Цитата:
Цикл на счетчике в таком случае заметно хуже, чем перебор восьми комбинаций пересылки бита по фиксированным значениям.
все тоже самое, только проще - в массиве те же фиксированные значения. И "чехардень" очень красиво причесывается.
Цитата:
только нерационально - минимум два массива, да сопровождение.
шо так константы, шо так, а сопровождать удобнее - вжух и в масиве в одной строчке нужное поменял.
Массив это рядок данных(переменных) в ОЗУ, а их считать ещё надо. А константа входит в состав команды. Хотя... Как там компилятор все перекручивает - смотреть при обеих вариантах результат надо... Мне более интерес к "выноске" полученного в библиотечку. А там уже и "причесать" можно будет. Касательно возможных нюансов прикладной программы - это вопрос довольно сложный - лучше сразу на максимум проблем рассчитывать - потом легче будет.
Это ж массив стандартных пинов ардуино - что там считать то. Впервые слышу про какой-то счет массивов. Почитал - согласно ардуиновому референсу для констант во флэши используем PROGMEM: https://www.arduino.cc/reference/en/lan ... s/progmem/ Как перекручивает, проведем упрощенный тест - тут перечислены родные ардуиновые пины, опять строго согласно референсу:
Код:
#include "Arduino.h" // список выводов Arduino для подключения к разрядам a-g // семисегментного индикатора const uint8_t pins[8] PROGMEM = {9, 13, 4, 6, 7, 10, 3, 5};
int main() { while (1) { // зажечь сегмент for (int i = 0; i < 7; i++) digitalWrite(pins[i], HIGH); } }
Смотрим листинг, и видно, как красивенько берет из флэша (2 команды загрузка адреса и 3 команды в цикле):
Код:
- это наш масив, во флэши конечно 00000076 <_ZL4pins>: 76: 09 0d 04 06 07 0a 03 05
Насчет возможных "нюансов прикладной программы" - опрос флагов или засыпание в основном цикле с пробуждением от прерывания таймера/ацп/ватчдога/усарта/кнопки и пр. это стандартная практика в программировании микроконтроллеров и при правильном применении - никаких нюансов. см. тут Важные замечания: https://arduinomaster.ru/program/preryv ... interrupt/
Цитата:
В обработчике вы можете лишь устанавливать флаг события, а в loop – проверять флаг и обрабатывать его
"выноска" полученного в библиотечку - лучше сразу на максимум проблем рассчитывать - потом легче будет.(с) насчет как правильно использовать таймер0 и прерывание по совпадению оного написано тут: https://voltiq.ru/wiki/interruptions-in-arduino/
oleg110592 по сути является версией Google "с доставкой на дом" по любому вопросу 100500 ссылок на то, что уже есть готовенького. я даже удивляюсь: вот я, например, больше 20 лет программирую, а 99,999% этих ссылок ни разу даже не видел! когда программировать-то, если все читать?!
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Меня варианты "вылизывания" в данном случае не столь уж и волновали. Для начала хотя бы "черновик" работоспособный сделать при условии, что функция обработки прерывания слопает кусманчик или в виде объекта метода внешнего класса или в лучшем случае удастся ее упаковать вместе с файлами того класса... Т.е. содержимое функции обработчика прерывания находится во внешних файлах проекта, а функция вызова прерывания - в основном (или посложнее - в тех же "внешних" файлах). Примерно воть так первый примитив выглядит: Спойлер
Код:
void setup() { // put your setup code here, to run once: // Serial.begin(9600); // для сообщений тест-контроля
test_ksd.init_csd4(); // инициализация ККД
} //---------- void loop() { // put your main code here, to run repeatedly:
//.......... }
//*************************************************** // ПОДВАЛ С ФУНКЦЯМИ //***************************************************
//---------- // ОБРАБОТЧИК ПРЕРЫВАНИЯ (режим совпадения по OCR0A) // (по факту дублер системной миллисекунды) // в качестве функции выполняется метод sdr_prog() // объекта test_ksd класса ksd4
во внутренность файлика ksd4.cpp поока не удалось... Когда все в одном главном файле - это всегда без проблем работает, но уж больно гормоздко. Вроде первый вариант кой-как получился...
с нетерпеньем жду продолжения - согласно начальной схеме в программе вроде еще не задействована DS1307 и еще 2 шт. MOC3063 (наверное по будильникам что-то включают). Очень интересно - не будут ли мешать проведенные манипуляции с тамером0 работе часовой микросхемы по и2цэ.
Была бы какая-то польза от того.... А I2C (для ведущего шины) у меня ПРОГРАММНЫЙ (лаподрыгом выполнен) на любые лапки выводится. Там никакой разницы где, чего и как может быть "приторможено" - собственно сам протокол из тех, где ведущий может остановить обмен на неопределенное время, без вреда для данных.
Баловался как-то с 1307 и адуринкой. Кстати тогда и обратил внимание на имевшую место ранее ошибку алгоритма, которую устранил в данной библиотечке. И... таким же образом - через SIGNAL(name_vector){} можно и прерывания по INT0/INT1 для платформ на AVRках обрабатывать... А где б те правильные имена векторов сыскать..? Неумудренному АВРкиным Си...
польза - проверить ардуино на вшивость. А часики с гибким фунционалом, ну например с 485 интерфейсом, возможно нашли бы применение в народном хозяйстве и даже промышленности. У меня, например спрашивали производственники часы большие, с показом температуры произведенных блоков поролона - возможны возгорания без контроля. Сейчас втыкают китайские термометры для духовки и ходят, ходят, каждый осматривают. Индикаторы большие можно сделать на ws2812 (библиотека ардуиновая есть) как тут: https://www.radiokot.ru/forum/viewtopic ... 2&t=153087 з.ы. созрела идея - в часы работы часы светят красным, за 15 минут до окончания работы - желтым, в конце работы - зеленым
Я проверяю или действующей схемой ( если устройство для домашней прикладного использования) или имеющимся набором макет-заготовок. Этот "примитив" (х4 с совмещённый кноподавой) хорошо компонуется с простейшими конструкциями с МК имеющими "рядную" разводка портов - в частности с at89cX051 или аттини2313. Но там уже давно все под ассемблером перекручено. А для адуринки такое решение экономически неэффективно (по многим причинам). Большой дисплей на основе чего угодно - от ламп накаливания до светодиодных лент размерами в ковырнадцать метров тоже скучновато... Творческое спадо однако.... Осеннее... Подразжится парой динамичков да приемничек замутить... Может ещё последовательный обмен по 232му асинхроннику покручу...
НЕ... В наличии лишь RDA5807 (уже порядком подзалежалась)... За силабьи... только помечтамс... Да и прожку предпочтительно самому нашкарябать - там ничего особого нету, чтоб чужие библиотеки ставить. Обычный I2C да немножко мутноватое описание и питание от 3 вольтей...
глянул в интернет-киоске возле мясного - "TEA5767-MODUL" 1.5$, "Модуль RDA5807M FM радиоприемник Arduino" 30 центов, а писать уж точно - самому там нечего
oleg110592 по сути является версией Google "с доставкой на дом" по любому вопросу 100500 ссылок на то, что уже есть готовенького. я даже удивляюсь: вот я, например, больше 20 лет программирую, а 99,999% этих ссылок ни разу даже не видел! когда программировать-то, если все читать?!
Ну как же! Сначала посмотрел как у людей, а затем написал по своему, может даже лучше.)
Без "подсмотрел" на сегодня никак не обходится - те же книжи как по компиляторам, так и по железу. Крайне редко попадаются пошагово "разжеванные" примеры описаные на понятном языке (у каждого ведь свой уровень понимания - зависит и от опыта и от привычной подачи материала с неизменно присутствующим компонентом "а Вы это уже знаете")... Правда есть некоторая разница - или "на побыстрее" соорудить на основе чужих библиотек (о стандартном минимуме, входящем в набор компилятора или адуринкина референса речь не идет) или научиться самому делать собственные софтинки на основе "стандартного минимума" входящих в состав компилятора(референса) средств да документации на железко - но то заметно дольше да и сложнее. Зато результат для себя приятнее и в дальнейшем с софтинкой можно чего захочется сотворить (изменить/доработать). Плюс понимание работы того, чего нашкарябал.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения