На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (3) 1 2 [3]  все  ( Перейти к последнему сообщению )  
    > Микроконтроллер для опытов. , И программатор к нему.
      Цитата Prince @
      Есть режим WDT: сначала выполняется преывание(в обработчике которого нужно ручками сохранить важные данные

      Все зависит от задачи, надо ли переинициализировать все ОЗУ как при первом старте
      или Ваша алгоритм (задача)умеют анализировать холодный и горячий страт. Если вам надо (согласно логиге вашей програмы стартовать как при холодном старте инициализируя все с нуля или поймать по флагу что это горячий старт, или сброс произошел по вотч догу) вы можете поймать момент в стартовой програме был ли сброс по вотч догу и питание не снималось(ЗНАЧИТ ОЗУ СОХРАНИЛОСЬ)
      или в памяти мусор(флаг не выставлен значит ОЗУ не сохранилось, значит снималось питание) значит старт идет холодный - первый. в соответствии с этим вы можете в обработчике прерывания по вотч догу установить в ОЗУ флаг и сохранить только регистры.

      С чего вы взяли что "сброс(после которого эти данные могли бы потеряться)."
      при сбросе теряются только состояние регистров, ОЗУ остается в том же состоянии если вы не снимали питание.
      Сообщение отредактировано: AlexJ -
        Эээ... Кусок кода на IAR C для AVR, который реализует поставленную задачу:

        Правда, компилируемость не проверял - вырезал "по живому" из программы.

        Основная идея:
        Программа имеет некую переменную bValue, которую холит и лелеет.
        Также, имеет некоторые настройки, которые хранятся в EEPROMе.

        Если ничего не происходит на некоторой линии за какое-то время, то программа "засыпает", а будит её WatchDog. Причем будит перезагрузкой. При старте программа проверяет, не был ли контроллер перезагружен с помощью WDT, и если не был (т.е. холодный старт) - то обнуляет переменную. Если был - просыпается.

        PS: Код для ATTiny26. Для других процов возможно потребуется поправить названия регистров.

        ExpandedWrap disabled
          // 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;
          }
        Сообщение отредактировано: Kosha -
          Ну, спасибо, общими усилиями вы меня убедили: с памятью будет всё в порядке. :D
          trainer,
          AlexJ,
          Kosha, спасибо вам.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:
          Страницы: (3) 1 2 [3]  все


          Рейтинг@Mail.ru
          [ Script execution time: 0,0196 ]   [ 15 queries used ]   [ Generated: 27.04.24, 16:08 GMT ]