EEprom i PIC blir korrupt

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

EEprom i PIC blir korrupt

Inlägg av newbadboy »

Har byggt o kodat en helt vanlig timer som räknar upp tid. Detta visas på en 2x16 LCD. Vid varje ny minut och timme sparas värdet i eepromet för att hämtas när man startar kortet igen.

Varje gång jag flashar kortet visas 55:55 innan jag resetar den. Så jag antar att det är ngt default värde alla minnesplatser i eepromet har innan man faktiskt har skrivit till det.
Nu till problemet. När jag använder klockan så händer det rätt ofta efter jag startar om den att den på ngn position visar 55. Trots att det innan avstängning varit ngt helt annat värde.
Jag använder fyra olika minnesplatser för att kunna spara 2 st timpositioner och 2st minut positioner. Sekunder sparas ej. Alla fyra minnesplaster kan ibland visa 55, har dock inte hänt samtidigt.
Har försökt i koden lögga till ngn from av check av minnet men det hjälper nada. Det verkar verkligen som skriving och läsning sker rätt men sedan på ngt sätt blir
minnet korrupt vid avstängning.

Kortet jag har byggt var för en helt annan grej men den används inte längre och det var därför smidigt iom allt med knappar, lcd etc fanns. Så jag sklängde bara på denna koden.

Får också tillägga att när den väl läst 55 så gör den det vid varje omstar tills jag aktivt raderar minnet eller låter klockan räkna upp

Vad tror ni vad är det som sker och vad kan jag prova som åtgärd?

Kod: Markera allt

#define BTN_up PORTB.F1
#define BTN_down PORTB.F2
#define BTN_Start PORTC.F4
short unsigned nSec=0;                                                          //Sätt alla varibler för att räkna tid
short unsigned nMin=0;
short unsigned nHour=0;
short unsigned nSec2=0;
short unsigned nMin2=0;
short unsigned nHour2=0;
short unsigned memTest=0;
short int a=1,b=0;                                                              //a och b används för knapp status
char MinOut[7];                                                                 //sträng för att printa tiden i minut och en för timme
char HourOut[7];

//LCD module connection
sbit LCD_RS at RD7_bit;
sbit LCD_EN at RD6_bit;
sbit LCD_D4 at RD5_bit;
sbit LCD_D5 at RD4_bit;
sbit LCD_D6 at RD3_bit;
sbit LCD_D7 at RC3_bit;

sbit LCD_RS_Direction at TRISD7_bit;
sbit LCD_EN_Direction at TRISD6_bit;
sbit LCD_D4_Direction at TRISD5_bit;
sbit LCD_D5_Direction at TRISD4_bit;
sbit LCD_D6_Direction at TRISD3_bit;
sbit LCD_D7_Direction at TRISC3_bit;
//End LCD module connection


void InitMain(){
//IO direction settings
     TRISA=0b00000000;
     TRISB=0b00111110;
     TRISC=0b00010000;
     TRISD=0b00000000;
     TRISE=0b00000111;

//Turn of ADC
     ANSELA=0b00000000;
     ANSELB=0b00000000;
     ANSELD=0b00000000;
     ANSELE=0b00000000;

//Oscillator set to 4MHz
     OSCCON=0b01101010;

     LCD_Init();
     LCD_Cmd(_LCD_CURSOR_OFF);
     Delay_ms(200);
     Lcd_out(2,1,"  KS2021  R1.0");
     Delay_ms(2000);
     Lcd_Cmd(_LCD_CLEAR);

     if(BTN_up==0){                                                             //Reset funktion för att nollställa räknare
        Lcd_out(1,1,"Reset $1??");
        Lcd_out(2,1,"                ");
        delay_ms(1500);
        EEPROM_Write(0x00,0);                                                   //Redare inormation i EEPROM minnet
        EEPROM_Write(0x01,0);
        Lcd_out(1,1,"Reset DONE!!");
        while(BTN_up==0){
             //wait
             }
        }
     if(BTN_down==0){
        Lcd_out(1,1,"Reset $2??");
        Lcd_out(2,1,"                ");
        delay_ms(1500);
        EEPROM_Write(0x02,0);
        EEPROM_Write(0x03,0);
        Lcd_out(1,1,"Reset DONE!!");
        while(BTN_down==0){
             //wait
             }
        }

     Lcd_out(1,1,"                ");
     Lcd_out(2,1,"                ");
     Lcd_out(1,1,"$1  00:00");
     Lcd_out(2,1,"$2  00:00");

     nMin=EEPROM_Read(0x00);
     if(nMIN==55)
        nMin=EEPROM_Read(0x00);
                                                                                //Läs ut innehållet i minnet för att fortsätta på tiden
     nHour=EEPROM_Read(0x01);
     if(nHour==55)                                                              //flera läsningar då ibland korrupt läsning sker
        nHour=EEPROM_Read(0x01);

     nMin2=EEPROM_Read(0x02);
     if(nMin2==55)
        nMin2=EEPROM_Read(0x02);
     
     nHour2=EEPROM_Read(0x03);
     if(nHour2==55)
        nHour2=EEPROM_Read(0x03);
        
     a=EEPROM_Read(0x04);
     if(a>2)
        a=EEPROM_Read(0x04);
                                                                                //läs ut senast tid som användes $1 eller $2

     IntToStr(nMin,MinOut);                                                     //printa ut tiden som visades innan avstänging
     Lcd_Out(1,8,MinOut+4);
     IntToStr(nHour,HourOut);
     Lcd_Out(1,5,HourOut+4);
     IntToStr(nMin2,MinOut);
     Lcd_Out(2,8,MinOut+4);
     IntToStr(nHour2,HourOut);
     Lcd_Out(2,5,HourOut+4);

     if(a==1){
     Lcd_Out(1,15,":)");
     Lcd_Out(2,15,":(");
     }
     
     else{
     Lcd_Out(1,15,":(");
     Lcd_Out(2,15,":)");
     }
     


}

void Timer1(){
     Lcd_Out(1,15,":)");
     Lcd_Out(2,15,":(");
     Lcd_Out(1,11,"RUN");
     Lcd_Out(2,11,"   ");
     Delay_ms(967); //count each sec
     nSec++;

     if(nSec==60){
       nMin++;
       IntToStr(nMin,MinOut);
       Lcd_Out(1,8,MinOut+4);
       nSec=0;
          if(nMin==60){
              nHour++;
              IntToStr(nHour,HourOut);
              Lcd_Out(1,5,HourOut+4);
              nMin=0;
              }
      }

}


void Timer2(){
     Lcd_Out(1,15,":(");
     Lcd_Out(2,15,":)");
     Lcd_Out(1,11,"   ");
     Lcd_Out(2,11,"RUN");
     Delay_ms(967); //count each sec
     nSec2++;

     if(nSec2==60){
       nMin2++;
       IntToStr(nMin2,MinOut);
       Lcd_Out(2,8,MinOut+4);
       nSec2=0;
          if(nMin2==60){
             nHour2++;
             IntToStr(nHour2,HourOut);
             Lcd_Out(2,5,HourOut+4);
             nMin2=0;
             }
       }
}


void Button_check(){

     if(BTN_up==0){
        a=1;
        while(BTN_down==0){
              //wait
              }
        }

     if(BTN_down==0){
        a=0;
        while(BTN_down==0){
              //wait
              }
        }

     if((BTN_Start==0)&&(b==0)){
        b=1;
        while(BTN_Start==0){
              //wait
              }
        }

      if((BTN_Start==0)&&(b==1)){
        b=0;
        while(BTN_Start==0){
                //wait
                }
           }
}

void Write_Mem(){                                                               //ibland korrupt skrivning blir då alltid 55. Därav extra koll
         EEPROM_Write(0x00,nMin);
         memTest=EEPROM_Read(0x00);
         if(memTest==55)
            EEPROM_Write(0x00,nMin);
         
         EEPROM_Write(0x01,nHour);
         memTest=EEPROM_Read(0x01);
         if(memTest==55)
            EEPROM_Write(0x01,nHour);
         
         EEPROM_Write(0x02,nMin2);
         memTest=EEPROM_Read(0x02);
         if(memTest==55)
            EEPROM_Write(0x02,nMin2);

         EEPROM_Write(0x03,nHour2);
         memTest=EEPROM_Read(0x03);
         if(memTest==55)
           EEPROM_Write(0x03,nHour2);

         EEPROM_Write(0x04,a);
         memTest=EEPROM_Read(0x04);
         if(memTest>2)
           EEPROM_Write(0x04,a);
         }


void main() {
    InitMain();
    while(1){

         Button_check();
         if(b==1){
            if(a==1)
               Timer1();
            else if(a==0)
               Timer2();
            }

         Write_Mem();

         if(b==0){
            Lcd_Out(1,11,"   ");
            Lcd_Out(2,11,"   ");
            }
         }
     }
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av newbadboy 4 september 2021, 09:35:58, redigerad totalt 3 gånger.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av TomasL »

Du kanske borde tala om vilken processor det är, då vissa har kiselfel gällande eeram
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av newbadboy »

Syns i schemat. Även om rätt dassigt.

16LF1937
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av TomasL »

Ok, har du kollat errata på denna?
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av newbadboy »

Nej. Inte haft en tanke. Hittar man de på Micro chips hemsida antar jag
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av TomasL »

naturligtvis
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: EEprom i PIC blir korrupt

Inlägg av Zkronk »

Hur ser implementationen av EEPROM_Read() ut?
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av newbadboy »

Ingen aning. Det är en färdig funktion som stöds av kompilatorn. Jag kan prova imorgon att se om jag kan hitta den på ngt sätt. Dock har jag använt den i andra projekt utan konstigheter.

Får också tillägga att när den väl läst 55 så gör den det vid varje omstar tills jag aktivt raderar minnet eller låter klockan räkna upp.
Senast redigerad av newbadboy 3 september 2021, 23:49:24, redigerad totalt 1 gång.
Användarvisningsbild
Glenn
Inlägg: 33667
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av Glenn »

Det var lääänge sen jag petade med eeprom på PIC, och då en helt annan PIC, men visst var det så att man var tvungen att vänta lite efter skrivning ? annars blev det problem ?

Isåfall, är du säker på att det blir så när du bryter strömmen ?
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av newbadboy »

Jag trodde först att jag ibland råkar tajma och bryter precis när den skriver. Men provade då att inte låta klockan räkna vilket innebär ingen skrivning. Utan bara startar om kortet flera ggr. Och då hoppar 55 fram efter ett fåtal försök.

Hmm borde i såfall vara inlagt funktionen redan om. Man måste vänta efter en skrivning. Men å andra sidan händer det som sagt utan att jag ens skriver
Senast redigerad av newbadboy 3 september 2021, 23:57:48, redigerad totalt 1 gång.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av newbadboy »

Tadaa några omstarter senare :rofl
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av sodjan »

Hm...
Det är något "fishy" med att hex 55 är en del av den sekvens (55/AA) som måste
skrivas till ett register för att EEPROM-write sekvensen ska starta.

Kod: Markera allt

  BCF INTCON, GIE     ;Disable INTs.
  MOVLW 55h           ;
  MOVWF EECON2        ;Write 55h
  MOVLW 0AAh          ;
  MOVWF EECON2        ;Write AAh
  BSF EECON1, WR      ;Set WR bit to begin write
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av newbadboy »

Nämen. Vad är nu detta? Hmm varför ska den skiva 55 och AA hmmm.
Har du kört write funktionen själv och hittat detta, bara lite nyfiken. Har inte hunnit själv, precis vaknat 😊

Det förklarar kanske lite iaf varför mina försök till att kontrollera skrivningarna inte funka då jag letade efter 55. Men 55Hex är eg 85.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: EEprom i PIC blir korrupt

Inlägg av sodjan »

Hm, jo hex/dec i och för sig...
Dina andra frågor förstår jag inte. Vadå "varför"?
Databladet sid 116-117. 55/AA är standard...
Användarvisningsbild
rvl
Inlägg: 5720
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: EEprom i PIC blir korrupt

Inlägg av rvl »

För dem som inte har inbyggd omvandlare:
Hex 55/AA blir binärt 01010101/10101010.
Skriv svar