2016-07-28 9 views
1

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

<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> 
+0

Какое событие должно пройти процедуру EEPROM_Write? –

+0

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

ответ

1

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

+0

Спасибо. Пожалуйста, рекомендуйте Конденсатор. – comsian

+0

На самом деле это зависит от того, каково общее потребление вашей платы, но вы можете попробовать с 4700uf/16v. Но это подтвердило, что вы столкнулись с этой проблемой во время отключения питания в основном? – HallMark