Go Down

Topic: programma non va (Read 1 time) previous topic - next topic

?R

ahn ok ok, avevo capito male...
grazie ancora ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

?R

non sto capendo una cosa di progmem perchè il compilatore non mi da errori però il programma non va come mi aspetto...
se per dichiarare una striga da dare al mio LCD scrivo così è giusto?
Code: [Select]
const char wrgpsw[] PROGMEM={"WRONG PASSWORD!"};
e devo darla alla funzione del LCD che è:
Code: [Select]
void ST7565::drawstring(uint8_t x, uint8_t line, char *c, uint8_t color) {
  while (c[0] != 0) {
    drawchar(x, line, c[0], color);
    c++;
    x += 6; // 6 pixels wide
    if (x + 6 >= LCDWIDTH) {
      x = 0;    // ran out of this line
      line++;
    }
    if (line >= (LCDHEIGHT/8))
      return;        // ran out of space :(
  }
if (x <= LCDWIDTH && color)drawline(x,line*8,x,line*8+7,color);
}

quindi nel programma per scrivere nello schermo faccio:
Code: [Select]
  glcd.drawstring(0, 5,(char*)wrgpsw,0);
ma questo è sbagliato, da quello che ho letto bisogna usare
Code: [Select]
glcd.drawstring(0, 5,(char*)pgm_read_word(&(wrgpsw[i])),0);
però così sono costretto ad usare un ciclo for per scrivere tutta la stringa... e tra l'altro non sto capendo cosa mi ritorna perchè mi scrive simboli sbagliati :~
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Non mi ricordo se l'avevo già detto a te oppure a qualcun altro.... ma il problema di PROGMEM non è tanto nel memorizzare dei dati dalla Flash, il problema è recuperarli  :smiley-sweat:

Prova così:

Code: [Select]
char buffer[25];
PROGMEM char *wrgpsw[] = {"WRONG PASSWORD!"};
strcpy_P(buffer, (char*)pgm_read_word(&(wrgpsw)));


Adesso dovresto avere in "buffer" (che è un array di tipo char) la stringa estratta dalla Flash.

PS: l'ho scritto di getto, compila ma non l'ho testato. La dimensione di buffer è arbitraria, regolala tu in base alla max lunghezza che devi trattare

?R

ho provato come dicevi tu ma ancora niente :smiley-sad-blue:
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

?R

sto leggendo il file pgmspace.html che è all'egato con l'IDE e veso la fine c'è scritto come si dovrebbere procedere con le stringe... se non ho capito male dicono che non si può mettere nella flash una stringa alla volta, o almeno non lo prendono neanche in considerazione quel caso, boh... :smiley-roll-blue: comunque dicono di fare così mettendole tutte in una tabella:

Code: [Select]
char string_1[] PROGMEM = "String 1";
char string_2[] PROGMEM = "String 2";
char string_3[] PROGMEM = "String 3";
char string_4[] PROGMEM = "String 4";
char string_5[] PROGMEM = "String 5";

PGM_P string_table[] PROGMEM =
{
    string_1,
    string_2,
    string_3,
    string_4,
    string_5
};


e poi per riportarle in ram quando ce n'è bisogno suggeriscono di fare così:
Code: [Select]
void foo(void)
{
    char buffer[10];
   
    for (unsigned char i = 0; i < 5; i++)
    {
        strcpy_P(buffer, (PGM_P)pgm_read_word(&(string_table[i])));
       
        // Display buffer on LCD.
    }
    return;
}


ora non ho il robot per provare, secondo voi ha senso la cosa?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Go Up