Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zapis i odczyt eeprom - 15 charów

krzysb91 03 Maj 2012 16:14 1227 3
  • #1 03 Maj 2012 16:14
    krzysb91
    Poziom 6  

    Witajcie,
    szukałem już o tym, ale nie pomogło mi nic z obecnych na forum.

    Pisze program na atmege88p. Potrzebuję odzytywać i zapisywac 15 charów do pamieci EEprom. Widzę że mi to dziala bo po resecie zostaje to co ja zmienilem w trakcie działania programu, ale to nie są char-y, tylko jakby znaki z chińskiego alfabetu. Pierwsza funkcja wrzuca cokolwiek do eepromu, kolejna odczytuje a nastepna ma zapisywac jeżeli coś sie zmieniło. Funkcje zapisu i odczytu eepromu mam z datasheeta pod tego procka.
    Dziękuję z góry za pomoc
    Załączam kod:

    Code:

    void StartEEprom(void){
       int i;
       for( i=0;i<15;i++){
          EEPROM_write(i+200, zmienneMenu[i]);
          _delay_ms(20);
          }
          LCD_Clear();
          LCD_GoTo(0, 0);
          LCD_WriteText("EEprom added");
          
       
       }
    void OdswierzanieTablicy(void ){
       int i;
       for( i=0;i<15;i++){
          zmienneMenu[i]=EEPROM_read(i+200);
          _delay_ms(20);
          }
          LCD_Clear();
          LCD_GoTo(0, 0);
          LCD_WriteText("EEprom sucked");
       }
    void koniecZmiany(void ){
       int i;
       for( i=0;i<15;i++){
          if(zmienneMenu[i]!=EEPROM_read(i+200)){
                EEPROM_write(i+200, zmienneMenu[i]);
                _delay_ms(20);
                }



    }
    LCD_Clear();
    LCD_GoTo(0, 0);
    LCD_WriteText("EEprom loaded");

    DispMenu(menu);


    }

    0 3
  • #2 03 Maj 2012 17:16
    mirekk36
    Poziom 42  

    Twórz sobie normalne zmienne a najlepiej struktury dla zmiennych w EEPROM a potem korzystaj z gotowych funkcji typu eeprom_read_block() czy eeprom_write_block() lub podobnych .... a od razu skończą się twoje problemy - jak ręką odjął.

    0
  • #3 04 Maj 2012 12:20
    krzysb91
    Poziom 6  

    Zastosowalem te funkcje o ktorych mowisz, ale nie poskutkowalo.
    EEprom widze ze dziala, bo po resecie procka zachowane sa ziany tych chinskich znaczkow jakie mam. Ogolnie to zmiany dokonuje poprzez przyciski, a widze to na wyswietlaczu LCD. Dzialam tak ze zmian dokonuje w zmienneMenu, a po zakonczeniu edycji ma mi zapisywac do EEpromu. Jest to 15 charow kazdy to liczba 0 do 9.

    Zalaczam poprawione:

    Code:

        unsigned char zmienneMenu [16] = {'1','1','1','2','2','2','3','9','3','4','4','4','9','5','5','\0'};
        static unsigned char EEMEM  zEEpromu [16] = {'1','1','1','2','2','2','3','9','3','4','4','4','9','5','5','\0'};
        static unsigned char EEMEM  *wsk;

    void StartEEprom(void){
       int i;
       wsk=&zEEpromu[0];
       
       for( i=0;i<15;i++){
          eeprom_write_byte(wsk+i, zmienneMenu[i]);
          
          _delay_ms(20);
          }
          LCD_Clear();
          LCD_GoTo(0, 0);
          LCD_WriteText("EEprom added");
          
       
       }
    void OdswierzanieTablicy(void ){
       int i;
          wsk=&zEEpromu[0];
       
       
       for( i=0;i<15;i++){
          zmienneMenu[i]=eeprom_read_byte(wsk+i);
          //LCD_Clear();
          //LCD_GoTo(0, 0);
          //LCD_WriteText(wydzielZnak(eeprom_read_byte(wsk+i)));
          //_delay_ms(1000);
          }
          LCD_Clear();
          LCD_GoTo(0, 0);
          LCD_WriteText("EEprom sucked");
       }
    void koniecZmiany(void ){
       int i;
          wsk=&zEEpromu[0];
       for( i=0;i<15;i++){
          if(zmienneMenu[i]!=eeprom_read_byte(wsk+i)){
                eeprom_write_byte(wsk+i, zmienneMenu[i]);
                _delay_ms(20);
                }
          
          }
          LCD_Clear();
          LCD_GoTo(0, 0);
          LCD_WriteText("EEprom loaded");
       
       DispMenu(menu);
       
       
       }


    Mysle ze problem moze byc przy adresie zapisu, albo przy typie zmiennej.

    Dziekuję za pomoc. Duzo glowie sie nad tym.

    0
  • #4 04 Maj 2012 20:19
    krzysb91
    Poziom 6  

    Trzecie podejscie do problemu. Tym razem poprzez write_block.

    Nie działa mi pozniej program wyswietlania tych wartosci. Nie wiem czemu, bo nie dziala tylko po wlaczeniu funkcji OdczytEEpromu.

    Sprawdzilem i nadal sa chinskie znaczki;

    Code:

    void OdczytEEprom(void ){
       
       LCD_GoTo(0, 0);

       if (eeprom_is_ready()){
       eeprom_read_block(&ee_dane, &ram_dane, sizeof(ram_dane));
       
       }
       LCD_WriteText("odczytEnd");
    }
    void ZmienneDoEdycji(void){
    // zapis do zmienne menu
    zmienneMenu [0]=ram_dane.p3;
    zmienneMenu [1]=ram_dane.p2;
    zmienneMenu [2]=ram_dane.p1;
    zmienneMenu [3]=ram_dane.i3;
    zmienneMenu [4]=ram_dane.i2;
    zmienneMenu [5]=ram_dane.i1;
    zmienneMenu [6]=ram_dane.d3;
    zmienneMenu [7]=ram_dane.d2;
    zmienneMenu [8]=ram_dane.d1;
    zmienneMenu [9]=ram_dane.s3;
    zmienneMenu [10]=ram_dane.s2;
    zmienneMenu [11]=ram_dane.s1;
    zmienneMenu [12]=ram_dane.ms3;
    zmienneMenu [13]=ram_dane.ms2;
    zmienneMenu [14]=ram_dane.ms1;


    }
    void ZmiennePoEdycji(void){
    // zapis do zmienne menu
    ram_dane.p3=zmienneMenu [0];
    ram_dane.p2=zmienneMenu [1];
    ram_dane.p1=zmienneMenu [2];
    ram_dane.i3=zmienneMenu [3];
    ram_dane.i2=zmienneMenu [4];
    ram_dane.i1=zmienneMenu [5];
    ram_dane.d3=zmienneMenu [6];
    ram_dane.d2=zmienneMenu [7];
    ram_dane.d1=zmienneMenu [8];
    ram_dane.s3=zmienneMenu [9];
    ram_dane.s2=zmienneMenu [10];
    ram_dane.s1=zmienneMenu [11];
    ram_dane.ms3=zmienneMenu [12];
    ram_dane.ms2=zmienneMenu [13];
    ram_dane.ms1=zmienneMenu [14];


    }
    void ZapisEEprom(void){
       if (eeprom_is_ready()){
       eeprom_write_block(&ram_dane, &ee_dane, sizeof(ram_dane));
       }
    }


    Jak nie wlaczam zapisu do eepromu to wszystko na wyswietlaczu fajnie smiga. Zmieniam menu dla 5 elementow i spokojnie edytuje po 3 zmienne dla kazdego z menu.
    Problem jest jedynie z zapisem i odczytem tych danych z eepromu

    Dodano po 1 [minuty]:

    No i jeszcze

    Code:

    extern unsigned char zmienneMenu [16];
       
       typedef struct  {
        char p3;
       char p2;
       char p1;
       char i3;
       char i2;
       char i1;
       char d3;
       char d2;
       char d1;
       char s3;
       char s2;
       char s1;
       char ms3;
       char ms2;
       char ms1;
    } daneGlobalne;

    daneGlobalne ee_dane EEMEM;    // definiujemy strukturę w pamięci EEPROM
    daneGlobalne ram_dane EEMEM;  // definiujemy strukturę w pamięci RAM

    0
  Szukaj w 5mln produktów