Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.2.15] |
|
Страницы: (3) 1 2 [3] все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Цитата Prince @ Есть режим WDT: сначала выполняется преывание(в обработчике которого нужно ручками сохранить важные данные Все зависит от задачи, надо ли переинициализировать все ОЗУ как при первом старте или Ваша алгоритм (задача)умеют анализировать холодный и горячий страт. Если вам надо (согласно логиге вашей програмы стартовать как при холодном старте инициализируя все с нуля или поймать по флагу что это горячий старт, или сброс произошел по вотч догу) вы можете поймать момент в стартовой програме был ли сброс по вотч догу и питание не снималось(ЗНАЧИТ ОЗУ СОХРАНИЛОСЬ) или в памяти мусор(флаг не выставлен значит ОЗУ не сохранилось, значит снималось питание) значит старт идет холодный - первый. в соответствии с этим вы можете в обработчике прерывания по вотч догу установить в ОЗУ флаг и сохранить только регистры. С чего вы взяли что "сброс(после которого эти данные могли бы потеряться)." при сбросе теряются только состояние регистров, ОЗУ остается в том же состоянии если вы не снимали питание. |
Сообщ.
#32
,
|
|
|
Эээ... Кусок кода на IAR C для AVR, который реализует поставленную задачу:
Правда, компилируемость не проверял - вырезал "по живому" из программы. Основная идея: Программа имеет некую переменную bValue, которую холит и лелеет. Также, имеет некоторые настройки, которые хранятся в EEPROMе. Если ничего не происходит на некоторой линии за какое-то время, то программа "засыпает", а будит её WatchDog. Причем будит перезагрузкой. При старте программа проверяет, не был ли контроллер перезагружен с помощью WDT, и если не был (т.е. холодный старт) - то обнуляет переменную. Если был - просыпается. PS: Код для ATTiny26. Для других процов возможно потребуется поправить названия регистров. // Crystal: 11.0592MHz #include "global.h" #include "init.h" //Initialization sequences //#include "softserport.h" #include "iButton.h" __no_init unsigned char bValue; int main(void) { __disable_interrupt(); InitPeripherals(); __enable_interrupt(); SafeReadEEPROM(); //Checks CRC of EEPROM and fails if check failed. //Check that we have or have not resetted by WatchDog: if (MCUSR&_BV(WDRF)) { //Hot-start (resetted by watchdog) MCUSR&=~_BV(WDRF); //Check that we need to be online: if (/*...Nothing happens on some line...*/) EnterDeepSleep(); } else { //cold-start. Init value. bValue=0x00; } while(1) { __watchdog_reset(); if (/*...smth...*/)) { EnterDeepSleep(); } } } inline void eeprom_read_block (unsigned char *pointer_ram, unsigned char pointer_eeprom, unsigned char size) { do { _EEGET(*pointer_ram,pointer_eeprom); pointer_ram++; pointer_eeprom++; size--; } while(size); } void SafeReadEEPROM() { eeprom_read_block(pBuffer,EEPROM_DATA_START,16); if (crc8(pBuffer,16)) //Non-zero bFail=TRUE; else bFail=FALSE; } inline void eeprom_write_block (unsigned char *pointer_ram, unsigned char pointer_eeprom, unsigned char size) { do { _EEPUT(pointer_eeprom,*pointer_ram); pointer_ram++; pointer_eeprom++; size--; } while(size); } void EnterDeepSleep() { INDICATE_NONE; MOSFET_OFF; //Enable watchdog: WDTCR=_BV(WDE)|_BV(WDP0)|_BV(WDP1)/*|_BV(WDP2)*/; // 0.14s ADCSR &= ~_BV(ADEN); MCUCR = _BV(SE)|_BV(SM1); __sleep(); //Power-down mode. Exit by Watchdog reset. } void InitPeripherals(void) { // // Init I/O ports: // DDRA = 0x00; PORTA = 0x00; PORTB = 0x00; DDRB = 0x00; MCUCR = 0x00; //two times to write JTD bit. PLLCSR = 0x00; ACSR = _BV(ACD); //Analog Comparator Disable // ADCSR = 0x80; } |
Сообщ.
#33
,
|
|
|
Ну, спасибо, общими усилиями вы меня убедили: с памятью будет всё в порядке.
trainer, AlexJ, Kosha, спасибо вам. |