Хранение таймера жизни PIC 18F452

Мы сохраняем таймер в EEPROM_Write, но данные стираются по неизвестной причине. Ваша помощь высоко ценится. Короче говоря, если у вас есть код для запуска таймера жизни (счетчик пробега в велосипеде, последний этап хранения при отключении питания системы и восстановление с последней точки) в PIC 18F452, пожалуйста, поделитесь с нами.

<pre>
/*
==============================LCD
EN    RB0    PIN # 33
RS    RB1    PIN # 34
D4    RB4    PIN # 37
D5    RB5    PIN # 38
D6    RB6    PIN # 39
D7    RB7    PIN # 40
MICROCHIP
*/
unsigned int time = 0;
unsigned int sec=0;
unsigned int minutes=0;
unsigned int hour=0;
char Select_Mode=0;
unsigned int LT_minutes;
unsigned int LT_hour;

char txt2[]="0000000000";
char txt3[]="000000000000";
char txt4[]="0000000000";
char txt5[]="0000000000";
char txt10[]="000000000000";
char txt11[]="000000000000";

// LCD module connections
sbit LCD_RS at RB1_bit;
sbit LCD_EN at RB0_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

//char uart_rd;

char txt8[] = "Tele Fun";
char txt9[] = "0900-78601";

//Timer1
//Prescaler 1:8; TMR1 Preload = 3035; Actual Interrupt Time : 100 ms

//Place/Copy this part in declaration section

void InitTimer1(){
  T1CON         = 0x31;
  TMR1IF_bit    = 0;
  TMR1H         = 0x6D;
  TMR1L         = 0x84;
  TMR1IE_bit    = 1;
  INTCON        = 0xC0;
}

void Interrupt(){
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x6D;
    TMR1L         = 0x84;
    //Enter your code here
    time++;

    // time 1 = 100ms, time 2 = 200ms
    if (time==10){
          time=0;
          sec++;
          if (sec==60){sec=0;minutes++;LT_minutes++;}
          if (minutes==60){minutes=0;hour++;}
          if (LT_minutes==60){
            //EEPROM_Write(0x03,LT_minutes);

          LT_minutes=0;
          LT_hour++;
          //EEPROM_Write(0x04,LT_hour);
          }
          if (LT_hour==9999){LT_hour=0;}
      }
  }
}

void main() {

  ADCON0=0b00010101;
  ADCON1=0b10001110;
  Lcd_Init();                      // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               // Clear display

  TRISE0_bit = 0;                  // set RB0 pin as output
  TRISE1_bit = 0;

  LT_minutes = EEPROM_Read(0x03);
  if ((LT_minutes>=0)&&(LT_minutes<=60))LT_minutes = EEPROM_Read(0x03);
  else EEPROM_Write(0x03,0);LT_minutes = EEPROM_Read(0x03);
  delay_ms(10);


  if ((LT_hour>=0)&&(LT_hour<=9999))LT_hour = EEPROM_Read(0x04);
  else EEPROM_Write(0x04,0);LT_hour = EEPROM_Read(0x04);
  delay_ms(10);

  if (LT_hour==255){LT_hour=0;}

  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off

  InitTimer1();

  while (1) {                           // Endless loop
     if (sec==15){
         EEPROM_Write(0x03,LT_minutes);
         EEPROM_Write(0x04,LT_hour);

      }

        Lcd_Out(1,11,"  ");            // Write text in first row
        Lcd_Out(2,9,"   ");            // Write text in first row
        Lcd_Out(1,1,"LT");             // Write text in first row
        Lcd_Out(2,1,"RT");             // Write text in first row
        Lcd_Out(2,6,":");              // Write text in first row
        Lcd_Out(1,8,":");              // Write text in first row
        Lcd_Out(3,2,txt8);             // Write text in first row
        Lcd_Out(4,5,txt9);             // Write text in first row


        WordToStrWithZeros(minutes, txt2);
        WordToStrWithZeros(hour, txt3);


         EEPROM_Write(0x03,LT_minutes);
         EEPROM_Write(0x04,LT_hour);


        WordToStrWithZeros(LT_minutes, txt10);
        WordToStrWithZeros(LT_hour, txt11);

        Lcd_Chr(1,4,txt11[1]);            // LT H
        Lcd_Chr(1,5,txt11[2]);            // LT H
        Lcd_Chr(1,6,txt11[3]);            // LT H
        Lcd_Chr(1,7,txt11[4]);            // LT H

        Lcd_Chr(1,9,txt10[3]);           // LT M
        Lcd_Chr(1,10,txt10[4]);          // LT M

        Lcd_Chr(2,7,txt2[3]);
        Lcd_Chr(2,8,txt2[4]);

        Lcd_Chr(2,4,txt3[3]);
        Lcd_Chr(2,5,txt3[4]);
    }
    }
<code>

person comsian    schedule 28.07.2016    source источник
comment
Какое событие должно инициировать процедуру EEPROM_Write?   -  person GJ.    schedule 28.07.2016
comment
Он должен хранить время. Позвольте мне объяснить сценарий, здесь я запускаю два счетчика. 1- Срок службы (до 9999 часов, до 59 минут) 2- Сбрасываемый таймер (или сброс питания). Когда мы перезагружаем систему, иногда таймер жизни очень хорошо сохраняет ее, иногда убирает час со времени и делает его равным нулю. например, текущее время жизни составляет 10 часов и пять минут. При первом перезапуске время остается прежним и продолжается. При втором перезапуске такое же поведение, но при третьем перезапуске может быть пять минут и ноль часов.   -  person comsian    schedule 28.07.2016


Ответы (1)


Если вы записываете в EEPROM во время отключения питания, я бы посоветовал проверить, сколько времени требуется для записи в EEPROM, и я думаю, что вы можете полностью потерять питание до того, как он закончит запись в EEPROM. Установка некоторого конденсатора между VCC-GND для накопления дополнительного питания может решить проблему, если проблема связана с аппаратным обеспечением и, в частности, отсутствует во время отключения питания.

person HallMark    schedule 01.08.2016
comment
Спасибо. Пожалуйста, порекомендуйте конденсатор. - person comsian; 02.08.2016
comment
На самом деле это зависит от потребляемого тока всей вашей платы, но вы можете попробовать с 4700 мкФ/16 В. Но подтверждено ли, что вы сталкиваетесь с этой проблемой в основном во время отключения питания? - person HallMark; 02.08.2016