Возник такой вопрос куда лучше писать энергонезависимую информацию, в моем примере это значение переменной нагрева + состояние вкл/выкл. Я читал что Сам EEPROM ограничен по записям. И где то натыкался на статейку что можно писать во флешь память самого мк. Просто опыта по МК еще не имею вот и нехочу угробить мк постоянной перезаписью ЕЕПРОМ. И еще есть вопросик как правильно организовать плавное включение ( увеличение value до save) ,save планирую писать в eeprom.
//настройка параметров работы функций #define BTN_LOCK_TIME 30 /*время обработки дребезга в милисекундах (10-100)*/ #define BTN_LONG_TIME 1000 /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/
char mask = 0; if (! (BTN_PIN & BTN_LINE_UP)) mask = BTN_SHRT_UP; if (! (BTN_PIN & BTN_LINE_DN)) mask = BTN_SHRT_DN; if (! (BTN_PIN & BTN_LINE_POWER)) mask = BTN_SHRT_POWER;;
if (mask){ //опрос состояния кнопки if (BtnLockCoun < (BTN_LOCK_TIME/10)){ //клавиша нажата BtnLockCoun++; return; //защелка еще не дощитала - возврат } BtnLastState = mask; BtnLockBit =1; //нажатие зафиксировано if (BtnLongCoun >= (BTN_LONG_TIME/10)) return; //возврат, т.к. счетчик длинн нажат досчитал до максимума еще раньше if (++BtnLongCoun >= (BTN_LONG_TIME/10)) BtnFlags |= (BtnLastState<<4); //счетчик досчитал до максимума - устанавливаем биты длинного нажатия } else{ //клавиша отжата if (BtnLockCoun){ BtnLockCoun --; return; //защелка еще не обнулилась - возврат } if (! BtnLockBit) //СТАТИЧЕСКИЙ ВОЗВРАТ return; BtnLockBit =0; //отжатие зафиксировано if (BtnLongCoun < (BTN_LONG_TIME/10)) BtnFlags |= BtnLastState; //установка бита короткого нажатия BtnLongCoun = 0; //сброс счетчика длительности нажатия } } //----------
//Прерывания по инт0 от синхра импулса static unsigned char count = 0; ISR(INT0_vect) { if (fPower==1) { OCR1A = pgm_read_byte(&(TRIAK[value])); TCNT1 = 0; data1 = value % 10; data2= value/10; //гасим оба разр§да PORTB |=(1<<PB0); PORTB |=(1<<PB2); PORTA = 0b11111110; //зажигаем следующий разр§д if (count == 0) { if (data2>0) //гасим старший разряд , если он == 0 . { segchar(data2); PORTB &= ~(1<<2); } else { PORTB |=(1<<PB2); } } if (count == 1) { segchar(data1); PORTB &= ~(1<<0); } count++; if (count == 2) {count = 0;} } else { OCR1A = pgm_read_byte(&(TRIAK[0])); TCNT1 = 0; data1 = value % 10; data2= value/10; //гасим оба разр§да PORTB |=(1<<PB0); PORTB |=(1<<PB2); PORTA = 0b11111110; } BtnExe(); }
int main(void) { unsigned char save=0; init_io(); sei(); int0_init(); BtnInit(); while(1) { char BtnMask = BtnGet (); //одиночное нажатие + if ((BtnMask == BTN_SHRT_UP) & (value < 99)) { value++; } //одиночное нажатие - if ((BtnMask == BTN_SHRT_DN) & (value > 0)) { value--; } //одиночное нажатие Power if (BtnMask == BTN_SHRT_POWER) { if (fPower==0) { value=save; } if (fPower==1) { save=value; value=0; } fPower++; if (fPower==2) { fPower=0; } } //Удержание + if ((BtnMask == BTN_LONG_UP) & (value < 99)) { while ((!(PINB&0b00010000))& (value < 99)) { value++; _delay_ms(100); } } //Удержание - if ((BtnMask == BTN_LONG_DN) & (value > 0)) { while ((!(PINB&0b00001000))& (value > 0)) { value--; _delay_ms(100); } } } return 0; }
//Коды сегментов void segchar (unsigned char seg) { switch (seg) { case 1: PORTA = 0b01111100; break; case 2: PORTA = 0b10000100; break; case 3: PORTA = 0b01000100; break; case 4: PORTA = 0b01101000; break; case 5: PORTA = 0b01000010; break; case 6: PORTA = 0b00000010; break; case 7: PORTA = 0b01110100; break; case 8: PORTA = 0b00000000; break; case 9: PORTA = 0b01000000; break; case 0: PORTA = 0b00010000; break; } }
void init_io() { //порт, к которому подкл. сегменты PORTA = 0xff; DDRA = 0xff; //порт, к которому подкл. катод DDRB |=(1<<0)|(1<<1)|(1<<2); PORTB =0x00; //Иницилизация прерываний по совпадению Т1. TIMSK |=(1<<OCIE1A); TCCR1B |=/*(1<<CTC1)*/(0<<CS10)|(1<<CS11)|(0<<CS12)|(1<<CS13); OCR1A=0xFF; }
Всех с праздником всемирного дня электросвязи и информационного общества.
Алгоритм работы с EEPROM: при включении, сбросе считываются значения в ОЗУ и работаем с данными в ОЗУ. Один пин мк отдаем по контроль питания, как только пропало питание скидываем данные в EEPROM. Такой алгоритм подразумевает использование ионистора либо конденсаторы большой емкости на бп. Следует учитывать, что запись одного байта в EEPROM длится 8 мс.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Программа выполняется дальше, но если до окончания цикла записи вы вдруг решите снова что-то записать, можете похерить данные в EEPROM. А вообще: почему бы вам не читать даташит? Ну и обязательно пользуйтесь библиотечными функциями, они хотя бы гарантируют, что цикл записи не будет прерван (но снова напомню, что документацию читать надо, ибо эти функции не рассчитаны на применение и в прерываниях, и в главном цикле).
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
и там и там - означает одновременно т.е. только в прерываниях или только в главном цикле - пожалуйста, ну а сразу всюду - это надо быть хорошим программистом, тогда тоже можно.
короче - не реентерабельные они, кто в курсе, что это значит, тот поймет, а остальным просто лучше не мешать в кучу оба способа.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Заголовок сообщения: Re: Запись\Чтение EEPROM или flash.
Добавлено: Ср май 17, 2017 08:36:16
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Не понял что Вы имели ввиду одновременное использование. Хотя я и тут не вижу проблемы. В прерывпниях их не использовал. Интересно, эти функции учитывают что в обработчтке не надо трогать маску глобального разрешения прерываний.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Запись\Чтение EEPROM или flash.
Добавлено: Ср май 17, 2017 09:31:19
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Только что попробовал использовать функцию eeprom_write_byte((uint8_t*)0,0); в прерывании и поглядеть во что скомпилировалось (AS6). Код конечно сильно избыточен, есть команды которые совсем непонятно зачем включены (избыточность это отдельная тема). Я хотел проверить, не включит ли эта функция прерывания после запрета. Все нормально в этом плане, функция сохраняет SREG, только затем идет запрет, а после команды записи восстановление SREG.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Да ведь дело не в том, что прерывание или избыточность, а в том, что функции работают со статическими счетчиками и вспомогательными переменными, что может нарушить их работу, если во время работы "первой" функции записи произойдет прерывание, внутри которого эта же функция будет вызвана повторно, это нарушит работу "первой" функции.
Нереентерабельная функция означает, что она не допускает рекурсивный вход в себя, т.е. вход до выхода.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
//настройка параметров работы функций #define BTN_LOCK_TIME 30 /*время обработки дребезга в милисекундах (10-100)*/ #define BTN_LONG_TIME 1000 /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/
В простыне кода разбираться влом, но настоятельно рекомендую применять вместо eeprom_write_xxxx функции eeprom_update_xxxx Последние функции проверяют содержимое ячеек на совпадение и не перезаписывают те, которые в этом не нуждаются, чем повышают ресурс EEPROM. В остальном их действие аналогично.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Добавлено after 12 minutes 20 seconds: вроде бы получилось работает, но не совсем гладко, иногда сохраняет на 1 меньше почему то )) и плавное повышение яркости не робит . буду дальше разбираться.
//настройка параметров работы функций #define BTN_LOCK_TIME 30 /*время обработки дребезга в милисекундах (10-100)*/ #define BTN_LONG_TIME 1000 /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/
Вы идеологически неверно делаете сохранение. Зачем в таймере?!
В главном цикле после нажатия кнопки. Нет нажатий - нет изменений - нет сохранений. В главном цикле так же желательно отслеживать время с последнего нажатия, и если оно больше некоторого значения, только тогда сохранять, чтобы минимизировать перезаписи при изменении "яркости" несколькими нажатиями.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Уважаемые знатоки всем спасибо за советы) мой первый проект готов. Отдельное спасибо участникам форума: ARV. Z_h_e.
И по традиции сделал сам поделись с остальными (мб поможет новичкам) .100% правильность работы программы не гарантирую использовать на свой страх и риск.
Также принимается всевозможная критика по коду и алгоритму работы.Спойлер
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения