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

Pamięc Flash Ram i makro PSTR

ginar 27 Lip 2009 18:49 1959 4
  • #1 27 Lip 2009 18:49
    ginar
    Poziom 21  

    Witam.
    Chcę stałe tekstowe wypisywać bezpośrednio z pamięci programu aby nie zajmowały miejsca w Ramie
    (dotychczas używałem char *pwsk="string", na komp. PC ten sposób był ok).

    Mam problem z wykorzystaniem makra PSTR:

    Code:
    char * pcPointer1 = PSTR("-Sterownik temp.");
    
    LCDString(1, 0, pcPointer1, Negativ);


    powoduje, że na wyświetlaczy mam "krzaki"( -tak jakby wskaźnik nie był ustawiony na stringa tylko 'gdzieś'.. ) i zwiększone zostaje miejsce w pamięcie ram - przynajmniej tak pokazuje kompilator

    próbowałez z :
    Code:
    char * pcPointer1 __attribute__ ((progmem)) = "-Sterownik temp.";
    
    LCDString(1, 0, pcPointer1, Negativ);

    wyświetlany tekst jest ok ale zajętość pamięci ram jest taka sama jakby tekst był wpisany do Ramu.

    Nie wiem gdzie leży błąd, wydaje mi się, że działanie obu zapisów powinno być jednakowe: string zapisany we flashu i zwrócony wskaźnik na jego początek. Być może to funkcję wyswietlającą należy "przyuczyć" do czytana z pamięci programu
    Code:
    void LCDString(uint8_t ui8Y, uint8_t ui8X, char cStr[], enum Polar eNormalNegativ);

    0 4
  • #2 27 Lip 2009 19:14
    Anonymous
    Użytkownik usunął konto  
  • #3 27 Lip 2009 19:53
    ginar
    Poziom 21  

    Code:
    void LCDString(uint8_t ui8Y, uint8_t ui8X, char cStr[], enum Polar eNormalNegativ)
    
    {
       unsigned char ucNumberAscii;
       char ucChar;
       uint8_t uiNumberCharInLine=0;
       
       goto_YX(ui8Y, ui8X);  // skacze pod pozycje yx na LCD
       for(unsigned char ucCounterChar=0; NULL!=cStr[ucCounterChar]; ucCounterChar++)
       {
           ucNumberAscii=cStr[ucCounterChar];
          
          if(84-ui8X-5*uiNumberCharInLine<5)
          {   
             uiNumberCharInLine=0;
             ui8X=0;
             ui8Y++;
             goto_YX(ui8Y, ui8X);
          }
          uiNumberCharInLine++;
          
          for(uint8_t k=0; k<5; k++)
          {
             if(eNormalNegativ==Negativ)
             {
                ucChar = ~pgm_read_byte(&font[ucNumberAscii-' '][k]);
             }
             else
             {
                ucChar = pgm_read_byte(&font[ucNumberAscii-' '][k]);
             }
             SPI_SentData_ToLCD(ucChar);
          }
       }
    }


    gdzie fornt to przerobiona tablica ascii zapisana w pamiecie programu:
    Code:
    prog_char font [][5] =
    
    {                               //znak:   pozycja w tabeli ascii (dec):      
        { 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp     // spacja: 32
        { 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !
        { 0x00, 0x07, 0x00, 0x07, 0x00 },   // "
     ......

    0
  • Pomocny post
    #4 27 Lip 2009 20:02
    Anonymous
    Użytkownik usunął konto  
  • #5 27 Lip 2009 20:08
    ginar
    Poziom 21  

    Ok, śmiga z makrem PSTR także, no i pamięci RAM jakby o wiele więcej.

    Pozdrawiam.

    0