logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega8: Jak wyświetlić dane z EEPROM na LCD 2x16 w CodeVision?

c1h 15 Lis 2007 21:19 2300 17
REKLAMA
  • #1 4485525
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    Witam,

    Próbuję napisać program wpisujący do wewnętrznej pamięci EEPROM procesora ATmega8 napis 'czesc', a następnie wyświetlić go na LCD 2x16. Po przeczytaniu informacji w helpi'e do CV odnośnie EEPROM i LCD udało mi się napisać program, jednak nie kompiluje się on. Nie wiem jak odczytać zawartość EEPROM na LCD (znalazłem funkcję odczytu z pamięci FLASH "void lcd_putsf(char flash *str)", ale z EEPROM niestety nie..). Czy trzeba w jakiś sposób zainicjować pamięć EEPROM na początku programu (np. jak Timer) ?

    Czy ktoś wie w czym robię błąd, albo czego nie robię ? Załączam również mój kod:
    
    #include <mega8.h>              
    #asm
       .equ __lcd_port = 0x12       //Przypisanie wyprowadzen portu D do podlaczenia LCD
    #endasm
    #include <lcd.h>
    
    eeprom int alfa=1;      // The value 1 is stored in the EEPROM during chip programming
    eeprom char string[]=”czesc”; // The string is stored in the EEPROM during chip programming
    
    void main(void)
    {
     int i;
     int eeprom *ptr_to_eeprom; // Pointer to EEPROM
     alfa=0x55;                 // Write directly the value 0x55 to the EEPROM */
     i=alfa;                    // Read directly the value from the EEPROM
     
     lcd_init(16);                  //Inicjalizacja LCD (2linie po 16znakow)
     lcd_gotoxy(0,0);               //Zacznij od pierwszego znaku w pierwszej linii
     lcd_putsf(i);                  //Czytaj z EEPROM i wyświetl na LCD....
     while (1);
    }
    
  • REKLAMA
  • #2 4485697
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    tak to jest jak chce sie cos sprzedawac a nie wie jak to zrobic ;)
  • REKLAMA
  • #3 4485785
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    Kolego, jeżeli nie możesz mi pomóc to dlaczego piszesz bzdury? Akurat tak się składa, że jest to część mojej pracy inżynierskiej (dotycząca CodeVision) i nie potrafię niektórych rzeczy samemu zrobić, dlatego zwracam się o pomoc tutaj, bo wiem że ją otrzymam, gdyż nie raz już tak się stało.
  • #4 4485910
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    jesli nie potrafisz to jak chcesz uzyskac dyplom inz ? kupic? ;)
  • #5 4486498
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    Nie prosiłeś nigdy nikogo o pomoc jeżeli czegoś nie potrafisz? Tak się składa, że nie miałem styczności z programowaniem mikroprocesorów na studiach i sam poznaję powoli cały ten proces mając do dyspozycji kilka data sheets, więc wydaje mi się naturalnym jest że czegoś nie wiem i nie rozumiem, dlatego zadaję pytania. Nikt nie jest Alfą i Omegą.

    Jeżeli możesz mi pomóc to proszę zrób to, a jeżeli dalej chcesz się ze mnie wyśmiewać bo czegoś nie wiem, to proszę bardzo.
  • Pomocny post
    #6 4486584
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    Tu masz program do zapisu i odczytu eeprom w procesorze program do wyświetlania na wyświetlacz napisz sam
    poszukaj w google
    te linki powinny ci pomoc

    http://www.fizyka.umk.pl/~ptarg/labview/folie/LCD_pt.pdf
    http://www.elportal.pl/pdf/k09/25_10.pdf
    http://www.elportal.pl/pdf/k09/27_01.pdf

    void EEPROM_write(unsigned int uiAddress, unsigned char ucData) // wpisanie do pamieci e2
    {

    while(EECR & (1<<0x08));

    EEAR = uiAddress;
    EEDR = ucData;
    EECR |= (1<<0x02);
    EECR |= (1<<0x01);
    }


    unsigned char EEPROM_read(unsigned int uiAddress) // czutanie pamieci e2
    {

    while(EECR & (1<<0x00));;
    EEAR = uiAddress;
    EECR |= (1<<0x00);;
    return EEDR;
    }
  • Pomocny post
    #7 4486614
    firefox_PL
    Poziom 17  
    Posty: 235
    Pomógł: 21
    Ocena: 2
    nie mam teraz jak tego przetestować, ale o ile się nie mylę to w codevision powinno działać coś takiego:
    
    #include <mega32.h>
    
    // Alphanumeric LCD Module functions
    #asm
       .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>
    
    // Declare your global variables here
    eeprom char text[]="hello";
    
    void main(void){
      lcd_init(16);
    
      while (1){
        lcd_putchar(*text);
      }
    }
    
  • #8 4487587
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    Wyświetlacz się inicjuje ale wyświetla tylko wypełnione czarne kratki, żadnego tekstu. Zamieniłem port na D (0x12) bo mega8 nie obsługuje A. Wydaje mi się, że trzeba wcześniej zadeklarować bity pamięci EEPROM przy zapisie jak podał maxiu25. Spróbuję tak zrobić.
  • REKLAMA
  • Pomocny post
    #9 4487659
    firefox_PL
    Poziom 17  
    Posty: 235
    Pomógł: 21
    Ocena: 2
    jeśli chodzi o eeprom to w codevision nie trzeba tego robić, kompilator sam robi takie rzeczy, natomiast jeśli chodzi o lcd to sprawdź czy podłączyłeś go dokładnie tak jak jest pokazane przy tworzeniu projektu (codevision wykorzystuje również pin W/R który normalnie w innych bibliotekach lcd jest pomijany i na stałe zwierany na płytce do masy)
  • #10 4488061
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    Wyświetlacz podłączyłem dokładnie tak, jaki jest rozkład pinów w CodeWizard w zakładce LCD, po wyborze portuD. Czyli podłączony jest w trybie 4-bitowym i działa, bo gdy podam na niego jakieś słowo przez komendę lcd_putsf("blabla") to wyświetli napis.
    Jeżeli w Twojej propozycji dodam np. lcd_gotoxy(5,0) to zapali się tylko 6 kratka na wyświetlaczu (także cała na czarno) a reszta pól LCD jest nieaktywna.
    Spróbuję może jednak ustawić te bity, bo może mój CV coś szwankuje :)[/img]

    edit: Korzystając z porady maxiu25 udało wyświetlić się znak na wyświetlaczu odczytując go z rejestru EEDR (lcd_putchar(EEDR)
  • Pomocny post
    #11 4488430
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    sprawdź to :

    lcd_putsf(*text);
  • #12 4488526
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    putsf odnosi sie do stringow we w flashu.
    i zastanow sie skad ten napis w eepromie ;)
    bo sama deklaracja ze ma byc w eepromie nic nie mowi/robi...
    pzdr.
  • REKLAMA
  • Pomocny post
    #13 4489395
    zby

    Poziom 15  
    Posty: 65
    Pomógł: 12
    Ocena: 2
    do wyświetlenia tekstu z pamięcie EEPROM wewnętrznej wystarczy przerobić procedure z lcd.lib, np.
    
    // write the string str located in SRAM to the LCD
    void lcd_puts(char *str)
    {
    char k;
    while (k=*str++) lcd_putchar(k);
    }
    

    na
    
    void lcd_puts_ee(char eeprom *str)
    {
     char k;
     while (k=*str++) lcd_putchar(k);
    }
    

    i wywoływać:
    
    lcd_puts_ee(&string[0]);
    
    Konto firmowe:
    DU-EL Zbigniew Korpak
    Kopernika 45/1A, Gliwice, 44-117 | Strona WWW: http://www.du-el.pl/
  • #14 4490207
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    1. Po przerobieniu lcd.lib oraz zamienieniu tej komendy w lcd.h program ponownie wyświetla na wyświetlaczu czarne pola. Tylko nie wiem czy proces wpisania czegoś do eepromu i odczytania powinien wyglądać tak jak to robię:
    
    ...deklaracje i nagłówki...
    eeprom char string[6]="Hello";
    void main(void)
    {
      lcd_init(16);
      while (1)
     {
      lcd_puts_ee(&string[6]);
      }
    }
    Program się kompiluje ale nie wyświetla nic oprócz czarnych pól.

    2. Po zastosowaniu metody maxiu25 i ustawieniu rejestrów, wypisuję np. znak 'm' na wyświetlaczu:
    
    EEPROM_write(0x01,0x6D);
    lcd_gotoxy(5,0);
    lcd_putchar(EEDR);
    

    A co jeżeli chcę wyświetlić napis? np. 'mega8' ? Jeżeli przykładowo (na piechotę) napiszę wszystko x5, zmieniając w następnych rozkazach kolejny znak na wyświetlaczu oraz kolejny bajt pamięci, na LCD wyświetli się na kolejnych zadeklarowanych polach ten sam pierwszy znak, czyli będzie 'mmmmm'. W jaki sposób odczytać kolejny znak ? Czy funkcja np. EEPROM_read(0x02) odczyta z pamięci drugi znak, czyli 'e' ? Jeżeli tak to w jaki sposób ją wyświetlić (kolejne komendy lcd_putchar(EEDR) wyświetlają nadal pierwszy znak 'm')?
  • Pomocny post
    #15 4492845
    zby

    Poziom 15  
    Posty: 65
    Pomógł: 12
    Ocena: 2
    Pamięć EEPROM jest pamięcią o innym zastosowaniu niż FLASH czy RAM i mimo iż wykona się taką deklaracje jak
    
    eeprom char string[6]="Hello";
    

    to tekst nie zostanie umieszczony w pamięci, tylko zostanie zarezerwowany obszar na niego.
    Można dla przykładu wykonać program umieszczający ten napis po resecie w EEPROM
    
    string[0]="H";
    string[1]="e";
    string[2]="l";
    string[3]="l";
    string[4]="o";
    string[5]=0;    // znacznik konca zmiennej tekstowej
    


    i wyświetlenie

    
    lcd_puts_ee(&string[0]);
    
    Konto firmowe:
    DU-EL Zbigniew Korpak
    Kopernika 45/1A, Gliwice, 44-117 | Strona WWW: http://www.du-el.pl/
  • #16 4494128
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    Niestety nie potrafię poprawnie zastosować Twoich porad zby, napis jak nie chciał tak nie chce się wyświetlić. Widocznie nadal źle je implementuję w kod programu. Czy nie można w prosty sposób wpisać czegoś do EEPROM'u a potem to z niego odczytać (mam na myśli kod długości kilku linii)? Czy jedyną metodą jest wpisywanie znaków bajt po bajcie i później taki sam odczyt?

    Udało się natomiast rozwiązać problem drugi, czyli wypisywanie tego samego (pierwszego) znaku na wyświetlaczu (propozycją maxiu25). Problem tkwił w kolejności ustawiania bitów rejestru kontrolnego EECR. Najpierw należy ustawić bit strobu zapisu EEWE, dopiero potem bit zezwolenia na zapis EEMWE (w dokumentacji mega8 jest odwrotnie). Po 'upakowaniu' kodu wygląda to następująco (efekt - na LCD wyświetla się 'mega8'):
    
    char temp;
    int a;
    
    void EEPROM_write_read(unsigned int adres, unsigned char znak)
    {
     EEAR = adres;
     EEDR = znak;
     EECR = (1<<EEWE);
     EECR = (1<<EEMWE);
     
     temp=EEDR;
     EECR = (1<<EERE)
     lcd_gotoxy(a,0);
     lcd_putchar(temp);
     a++;
    }
     
    void main(void)
     {
      lcd_init(16);
      a=0;
    
      EEPROM_write_read(0x01,0x6D);
      EEPROM_write_read(0x02,0x65);
      EEPROM_write_read(0x03,0x67);
      EEPROM_write_read(0x04,0x61);
      EEPROM_write_read(0x04,0x38);
     } 
  • Pomocny post
    #17 4495337
    zby

    Poziom 15  
    Posty: 65
    Pomógł: 12
    Ocena: 2
    No to jeszcze raz tylko już całość i przetestowana na sprzęcie
    
    
    #include <delay.h>
    
    // Alphanumeric LCD Module functions 
    #asm 
       .equ __lcd_port=0x1B ;PORTA 
    #endasm 
    #include <lcd.h>
    
    eeprom char string[12]="Hello"; 
    flash char stringf[12]="test eeprom";
    
    void lcd_puts_ee(char eeprom *str) 
    { 
     char k; 
     while (k=*str++) lcd_putchar(k); 
    } 
    
    void memcpyf_EE(char eeprom *dest, char flash *arg, unsigned char n)
    {
     unsigned char j;
     unsigned char b;
     
     for (j=0; j < n; j++)
      {
       b = arg;               
       dest = b;
       dest++;
       arg++;
      }
    }
    
    void main(void)
    {
     lcd_init(16);
    
     string[0]='H'; 
     string[1]='e'; 
     string[2]='l'; 
     string[3]='l'; 
     string[4]='o'; 
     string[5]=0;    // znacznik konca zmiennej tekstowej 
    
     lcd_puts_ee(&string[0]);
     delay_ms(1000);
    
     lcd_clear();
     memcpyf_EE(&string[0], &stringf[0], 12);	//sizeof(stringf)
     lcd_putsf(&stringf[0]);
    
     while (1){};
    }
    
    
    
    
    Konto firmowe:
    DU-EL Zbigniew Korpak
    Kopernika 45/1A, Gliwice, 44-117 | Strona WWW: http://www.du-el.pl/
  • #18 4497070
    c1h
    Poziom 12  
    Posty: 52
    Pomógł: 2
    Ocena: 1
    Dziękuję Kolegom za pomoc. Wszystko działa jak należy.

    Pozdrawiam
    Michał

Podsumowanie tematu

✨ Dyskusja dotyczy problemu wyświetlania danych zapisanych w wewnętrznej pamięci EEPROM mikrokontrolera ATmega8 na wyświetlaczu LCD 2x16 przy użyciu kompilatora CodeVision. Autor próbuje zapisać napis "czesc" do EEPROM i następnie go odczytać i wyświetlić, jednak napotyka problemy z kompilacją i wyświetlaniem tekstu – na LCD pojawiają się jedynie czarne pola. Wskazano, że deklaracja zmiennych w EEPROM w CodeVision rezerwuje miejsce, ale nie zapisuje automatycznie danych, dlatego konieczne jest ręczne zapisywanie znaków bajt po bajcie do EEPROM. Podano przykładowe funkcje do zapisu i odczytu bajtów z EEPROM, z poprawną kolejnością ustawiania bitów w rejestrze EECR (najpierw EEWE, potem EEMWE). Zaproponowano modyfikację funkcji wyświetlania tekstu na LCD, aby obsługiwała wskaźnik do pamięci EEPROM (np. lcd_puts_ee), która odczytuje i wyświetla znaki z EEPROM. Zwrócono uwagę na poprawne podłączenie wyświetlacza LCD zgodnie z konfiguracją CodeVision, w tym obsługę pinu W/R. Ostatecznie autor potwierdził, że po zastosowaniu wskazówek i poprawnym zapisie znaków do EEPROM udało się poprawnie wyświetlić napis na LCD.
Wygenerowane przez model językowy.
REKLAMA