Ну у нанки/про-мини/уно базовая частота таки 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% этих ссылок ни разу даже не видел! когда программировать-то, если все читать?!
Ну как же! Сначала посмотрел как у людей, а затем написал по своему, может даже лучше.)
Без "подсмотрел" на сегодня никак не обходится - те же книжи как по компиляторам, так и по железу. Крайне редко попадаются пошагово "разжеванные" примеры описаные на понятном языке (у каждого ведь свой уровень понимания - зависит и от опыта и от привычной подачи материала с неизменно присутствующим компонентом "а Вы это уже знаете")... Правда есть некоторая разница - или "на побыстрее" соорудить на основе чужих библиотек (о стандартном минимуме, входящем в набор компилятора или адуринкина референса речь не идет) или научиться самому делать собственные софтинки на основе "стандартного минимума" входящих в состав компилятора(референса) средств да документации на железко - но то заметно дольше да и сложнее. Зато результат для себя приятнее и в дальнейшем с софтинкой можно чего захочется сотворить (изменить/доработать). Плюс понимание работы того, чего нашкарябал.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения