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

odwołanie się do zmiennych PROGMEM, atmega

blasq 01 Paź 2010 22:33 3149 5
REKLAMA
  • #1 8573504
    blasq
    Poziom 11  
    Witam
    za radą poniższego artykułu: http://avr.elektroda.eu/node/4
    napisałem program, który przechowa w zmiennych programowych ciągi znaków, które zostaną użyte do wyświetlania na LCD, na sterowniku hd44780.

    deklaruję więc zmienne jako
    char l1[] PROGMEM  = "To, ze milcze,  ";
    char l2[] PROGMEM  = "nie znaczy, ze  ";
    char l3[] PROGMEM  = "nie mam nic do  ";
    char l4[] PROGMEM  = "   powiedzenia. ";
    char l5[] PROGMEM  = "   (J. Carroll) ";
    


    itd... (to ma być generator cytatów). Ale kiedy odwołuję się potem np:

    LCD_GoTo(0,0);
    LCD_WriteText(l1);


    wywala mi albo nic albo jakieś tekstowe śmieci (części innych ciągów).
    Wydaje mi się, że coś nie do końca zrozumiałem z adresowaniem. Próbowałem wypisać też tekst używając argumentu LCD_Write(*l1); oraz LCD_Write(&l1);
    niestety z jeszcze gorszym rezultatem.
    Będę wdzięczny za wszelką pomoc, pozdrawiam.
  • REKLAMA
  • #2 8573540
    tadzik85
    Poziom 38  
    pgm_read_byte() to jest ci potrzebne
  • REKLAMA
  • #3 8573578
    blasq
    Poziom 11  
    w deklaracjach dodałem:
    char lcd1[15];
    char lcd2[15];


    potem
    
    lcd1[] = pgm_read_byte(l1);


    i dostałem:
    Cytat:

    main.c:143: error: expected expression before ']' token
    main.c:143: error: '__addr16' undeclared (first use in this function)
    main.c:143: error: (Each undeclared identifier is reported only once
    main.c:143: error: for each function it appears in.)
    make.exe: *** [main.o] Error 1

    > Process Exit Code: 2
  • REKLAMA
  • #4 8573623
    tadzik85
    Poziom 38  
    Jak sama nazwa wskazuje funkcja ta odczytuje tylko jeden bajt z pamięci programu. Proponuje zajrzeć do dokumentacji.
  • REKLAMA
  • Pomocny post
    #5 8573624
    sulfur
    Poziom 24  
    Kod z pierwszego posta jest dobry za wyjątkiem
    LCD_WriteText(l1);
    Sugestia kolegi jest dobra. Niestety, nie da się wspomnianej funkcji zastosować bezpośrednio z LCD_WriteText. Jeśli kod obsługi wyświetlacza jest "radzia", to można dopisać taką funkcję.
    void LCD_WriteTextP(char * text)
    {
    register char c;
    
    while(c = pgm_read_byte(text++))
      LCD_WriteData(c);
    }
    I użyć jej zamiast wskazanej. Działa.
  • #6 8573652
    blasq
    Poziom 11  
    dzięki wielkie @sulfur, to załatwiło sprawę
REKLAMA