Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Есть у кого функция задержки времени без _delay_ms ,на таймере если еще и на нулевом то вобще гуд
а самому написать - не гуд?
настраиваете таймер на прерывания через любой подходящий вашим интересам интервал, например, если шаг задержки 1 мс, то и интервал прерываний таймера тоже разумно сделать 1 мс.
заводите себе глобальную переменную-стетчик, например delay. размер этой переменной должен вмещать нужную вам предельно большую задержку. т.е. если вы хотите до 10 секунд, а период тиков таймера 1 мс, максимальная задержка будет 10000 тиков таймера, т.е. переменная будет uint16_t delay; если счетчик вышел больше 1 байта, то дополнительно заводите себе переменную-флаг timeout (однобайтную!), которая и будет означать истечение задержки.
ну и теперь делаете обработчик прерываний таймера
Код:
ISR(TIMER0_OVF_vect){ // я дли примера взял по переполнению, можно любое иное прерывание if(delay){ delay--; timeout = 1; } }
вот почти и все. в нужном вам месте вызываете эту функцию set_delay и затем время от времени проверяете timeout - как только эта переменная станет не равна нулю - задержка истекла.
Код:
while(1){ // главный цикл if(timeout){ PORTB ^= _BV(PB0); // мигаем светодиодом на порту PB0 set_delay(1000); // с периодом 2 секунды } // а тут занимается остальными делами в главном цикле }
если delay у вас однобайтным вышел, то timeout не требуется, можно смотреть сразу на delay: обнулилась - время вышло. ну и atomic.h в этом случае не требуется
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Есть у кого функция задержки времени без _delay_ms ,на таймере если еще и на нулевом то вобще гуд ). камень мк atmega8. Задержки до от 100ms до 10s.
1-ый вариант:автоматное программирование и программные таймеры. Почитайте цикл статей. Будет очень полезно. Я многое почерпнул там.
2-ой вариант: настраивается самый ненужный таймер на 1 мс. В основном цикле проверять признак того, что таймер оттикал 1 мс и дальше работает ваша фантазия.
//================== // Реализация программных таймеров. // Примечание. Важно!!!!!!!!!!!!!!! // При смене состояния конечного автомата нужно сбросить // все таймеры, которые используются в этом состоянии. Иначе может быть // следующая ситуация: если таймер уже использовался в // текущем состоянии и флаг EN установлен, то по окончании времени // выполнится соответствующий код. //---------- Пример использования ---------- // set_soft_timer (ST_LED_2_BLINK, 50, 50); // Установка таймера. // if (handle_soft_timer (ST_LED_2_BLINK)) // Проверка таймера. //==================
Все таки решил попробовать что нибудь свое сотворить.) Создал таймер прерывание каждую ms, в нем и соответственно подсчет ms,ss,mm. ( на самом деле таймера допустимы и с условным временем,то есть 1s может быть примерно равна 1s ).
Также написал пару функций OffAfterTimeSS и OnAfterTimeSS ,ВключитьЧерезУказаноеВремя и выключить соответственно. Но есть одна переменная которая отвечает за фиксирование времени отсчета TimeCountingON и очевидно что при вызове функции более чем одного раза она изменяться и функция OnAfterTimeSS/OffAfterTimeSS перестает работать коректо. Как более правильно зафиксировать время TimeCountingON фиксировать ?
Код:
ISR (TIMER0_OVF_vect) { TCNT0=125; VarMS++; if(VarMS==1000) { VarSS++; VarMS=0; } if (VarSS==60) { VarMM++; VarSS=0; } if (VarMM==60) { VarMM=0; } } uint8_t FlagTImeON=0; //Флаг для захвата времени отсчета. uint8_t TimeCountingON=0;//Время Отсчета uint8_t FlagTImeOff=0; uint8_t TimeCountingOff=0; uint8_t OnAfterTimeSS(uint8_t TimeSS,uint8_t CurrentFlag) { if (FlagTImeON==0) { TimeCountingON=VarSS; //Время Отсчета FlagTImeON=1; } uint8_t TimeCurrent=VarSS; //Текущие время uint8_t OutFlag=0; if ((TimeCurrent-TimeCountingON) == TimeSS) { OutFlag=1; } else OutFlag=CurrentFlag; return OutFlag; }
попробуй как в ардуинах - переменная (R.O.) отсчитывает время от включения, а когда нужен интервал - берешь свою переменную, в момент начала интервала записываешь в неё значение "часов", а продолжительность интервала = "часы"-"момент начала интервала". этих моментов можно сколько угодно наделать, не сбивая "часов".
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Я примерно по такому принципу выше и делал. но как в функции организовать "момент начала интервала" ?) что бы при повторном вызове функции (пока к примеру первый ее вызов еще не отработал) этот момент не перезаписался.
сорри пропустил, с телефона неудобно ког понимать, увидел... а до скольки раз планируется запускать функции?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
тут динамическим выделением памяти попахивает... а хоть максимально сколько? взять по максимуму и раздуть массив, по мне, будет проще. хотя... может кто чего и насоветует
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Уже почитал что использовать функции динамического выделения опасно на мк. примерно прикинул что одновременно таймеров больше5 шт работать не будет. Поэтому пробую загонять данные в массив из 10 элементов(двух кратный запас). Но пока как то коряво получается (. Код:
а может тогда как в микроволновке - обратный отсчет
Код:
ISR (TIMER0_OVF_vect) { for (i=0,i<10,i++) { if (M[i]) { M[i]--; if (!(M[i])) "действие"; }; }; }
тут М - массив на 10 элементов при каждом переполнении цикл пробегает по массиву, находит элементы !=0 их убавляет, и если среди них есть "дотикавшие" выполняет действие. (для включения и выключения разные циклы). функцию для внесения задания: перебор до первого "0" и внесение в ячейку M[i] значения задержки (в количестве переполнений) и часы общие не понадобятся.
Добавлено after 1 hour 4 minutes 24 seconds:
Код:
void set_t (unsigned int time) { for (i=0,i<10,i++) { if (!(M[i])) {M[i]=time; break;}; }; }
примерно так. тоже для включения и выключения разные функции. если будут перебраны все 10 таймеров и не найдётся свободного - изменения в расписание внесены не будут.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
братцы, подскажите неучу, научился кексы закачивать в аруину уно, следующий этап написать простенькую прогу на Ассемблере. в пробнике проинициализировал Т2 на сравнение, прерывание приходит, идет на обработку по вектору, но в стеке записан какой то левый адрес т.е. по ret возвращается не в цикл-ожидание окуда вылетел по прерыванию, а гораздо выше. Почему так?
Сейчас этот форум просматривают: Varlakotam и гости: 37
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения