PROGMEM lettura char

Salve avrei un problema con la lettura di alcuni char PROGMEM

il mio codice è tipo:

porg_char valore_1[] PROGMEM = "prova1";
porg_char valore_2[] PROGMEM = "prova2";

PROGMEM const char *valore_table[] =
{
valore_1,
valore_2
};

come faccio a leggere i 2 valori per intero?

ho provato ol pgm_read_word ma mi legge solo la prima lettera :frowning:

ho provato il ciclo for sulle referenze PROGMEM ma non funziona...

  1. includi il codice usando gli appositi tag :wink:
  2. porg_xxx è errato, al max è prog_char :wink:
  3. con il tuo codice estrai solo il primo elemento dato che hai creato poi un array di puntatori a char.

Devi usare strcpy e copiare il contenuto dell'area di memoria Flash puntata in un altro array di char:

char buffer[xx];
strcpy_P(buffer, (char*)pgm_read_word(&(valore_table[elemento])));

buffer deve essere di dimensioni adeguate a contenere l'array, poi "elemento" è l'elemento dell'array da estrarre. Se cioè devi leggere valore_1, gli passerai 0.

si bhe, questa è solo una parte di codice...

ovviamente l'include l'ho messo, per quanto riguarda prog_xxx non ho ben capito cosa intendi...

quella funzione l'avevo già provata.. forse ho sbagliato qualcosa..... bhe riproverò e vedremo :)!!

grazie mille

sagitt:
si bhe, questa è solo una parte di codice...

Mi riferivo al fatto che quando si include del codice in un post, lo si deve fare usando gli appositi tag... :sweat_smile:

per quanto riguarda prog_xxx non ho ben capito cosa intendi...

Che hai sbagliato a scriverlo! :stuck_out_tongue_closed_eyes:
Hai scritto porg_char invece di prog_char, guardati il codice.

quella funzione l'avevo già provata.. forse ho sbagliato qualcosa..... bhe riproverò e vedremo :)!!

grazie mille

Attendo :wink:

hehe si scusa è che lo scritto dall'iphone.. scrivendo anche il codice sul momento durante la pausa :slight_smile: scusami!!!

Ok leggere le voci lo fa... ma poi quando me le stampa sullo schermo sembra impazzire e mi blocca tutto il sistema...... lo schermo mostra caratteri strani ogni tanto, e sopratutto spegne l'illuminazione dello schermo... insomma qualcosa non va! però i valori li legge :slight_smile:

ho messo dei delay per vedere se risolvevano... ma nulla!

la parte di codice interessate è:

VARIABILI:

// Variabili stato menu
int menu_entries_min = 0;                              // Prima voce
int menu_entries_max = 8;                              // Ultima voce
char menu_line_1[15];                                  // Linea 1
char menu_line_2[15];                                  // Linea 2
prog_char menu_entries_0[] PROGMEM = "1. Avvio";       // Voce 1
prog_char menu_entries_1[] PROGMEM = "2. Arresto";     // Voce 2
prog_char menu_entries_2[] PROGMEM = "3. Riavvio";     // Voce 3
prog_char menu_entries_3[] PROGMEM = "4. Test";        // Voce 4
prog_char menu_entries_4[] PROGMEM = "5. Debug";       // Voce 5
prog_char menu_entries_5[] PROGMEM = "6. Scritt. LCD"; // Voce 6
prog_char menu_entries_6[] PROGMEM = "7. Standby LCD"; // Voce 7
prog_char menu_entries_7[] PROGMEM = "8. Presenza IN"; // Voce 8
prog_char menu_entries_8[] PROGMEM = "9. Esci";        // Voce 9

// Variabili lettura menu
PROGMEM const char *menu_entries[] =                   // Tabella
{
  menu_entries_0,                                      // Voce 1
  menu_entries_1,                                      // Voce 2
  menu_entries_2,                                      // Voce 3
  menu_entries_3,                                      // Voce 4
  menu_entries_4,                                      // Voce 5
  menu_entries_5,                                      // Voce 6
  menu_entries_6,                                      // Voce 7
  menu_entries_7,                                      // Voce 8
  menu_entries_8                                       // Voce 9
};

SCRITTURA:

// Menu (Voci)
void menu_selection_entries(int menu_selection_state) {
  // In caso stato scrittura LCD "Attivato"
  if (lcd_print_state == true) {
    // In caso stato selezione "Prima apertura"
    if (menu_selection_state == '=') {
      // Impostazione stato menu "Attivato"
      menu_state = true;
      // Impostazione voce prima riga menu "Prima voce"
      menu_selection_1 = menu_entries_min;
      // Impostazione voce seconda riga menu "Seconda voce"
      menu_selection_2 = menu_entries_min + 1;
    }
    // In caso stato menu "Attivato"
    if (menu_state == true) {
      // In caso stato selezione "Prima apertura"
      if (menu_selection_1 < menu_entries_min || menu_selection_1 > menu_entries_max) {
        // Impostazione voce prima riga menu "Prima voce"
        menu_selection_1 = menu_entries_min;
        // Impostazione voce seconda riga menu "Seconda voce"
        menu_selection_2 = menu_entries_min + 1;
      }
      // Altrimenti
      else {
        // In caso stato selezione "Su"
        if (menu_selection_state == '-') {
          // In caso voce prima riga 1 maggiore rispetto a "Prima voce"
          if (menu_selection_1 > menu_entries_min) {
            // Diminuzione
            menu_selection_1--;
          }
          // Altrimenti
          else {
            // Impostazione voce prima riga "Ultima voce"
            menu_selection_1 = menu_entries_max;
          }
          // In caso voce prima riga 1 maggiore rispetto "Prima voce"
          if (menu_selection_2 > menu_entries_min) {
            // Diminuzione
            menu_selection_2--;
          }
          // Altrimenti
          else {
            // Impostazione voce seconda riga "Ultima voce"
            menu_selection_2 = menu_entries_max;
          }
        }
        // In caso stato selezione "Giu"
        if (menu_selection_state == '+') {
          // In caso voce prima riga 1 minore rispetto "Ultima voce"
          if (menu_selection_1 < menu_entries_max) {
            // Aumento
            menu_selection_1++;
          }
          // Altrimenti
          else {
            // Impostazione voce prima riga "Prima voce"
            menu_selection_1 = menu_entries_min;
          }
          // In caso voce seconda riga 1 minore rispetto "Ultima voce"
          if (menu_selection_2 < menu_entries_max) {
            // Aumento
            menu_selection_2++;
          }
          // Altrimenti
          else {
            // Impostazione voce seconda riga "Prima voce"
            menu_selection_2 = menu_entries_min;
          }
        }
      }
      delay(100);
      strcpy_P(menu_line_1,(char*)pgm_read_word(&(menu_entries[menu_selection_1])));
      delay(100);
      strcpy_P(menu_line_2,(char*)pgm_read_word(&(menu_entries[menu_selection_2])));
      delay(100);
      // ************** Inizio funzioni LCD **************
      // Scrittura testo voci menu (Selezione)
      lcd_print(2,0,0,0,0,0,">",NULL,NULL,NULL,true,true,loop_delay);
      // Scrittura testo voci menu (Prima riga e Seconda riga)
      lcd_print(2,2,3,3,0,0,menu_line_1,NULL,menu_line_2,NULL,true,false,200);
      // *************** Fine funzioni LCD ***************

    }
  }
}

Non hai incluso la lib per gestire i dati in flash:

#include <avr/pgmspace.h>

leo72:
Non hai incluso la lib per gestire i dati in flash:

#include <avr/pgmspace.h>

ovviamente nel codice originale c'è l'include...

quella è solo la parte che mi da il problema!

Fai un test semplice.
Creati un file che salva un paio di stringhe char in flash, poi recuperale e stampale a video.

leo72:
Fai un test semplice.
Creati un file che salva un paio di stringhe char in flash, poi recuperale e stampale a video.

ho fatto dei test.....

avendo:

strcpy_P(menu_line_1,(char*)pgm_read_word(&(menu_entries[menu_selection_1])));
//strcpy_P(menu_line_2,(char*)pgm_read_word(&(menu_entries[menu_selection_2])));

Se attivo solo il primo strcpy_P funziona tutto alla perfezione!! se attivo il secondo... il sistema dopo un po che si avvia si blocca in automatico anche se non premo nessun pulsante... ed ovviamente queste funziono sono sotto la pressione di pulsanti e non nel loop per confermare che il problema non è solo la tastiera che non funziona me ne accorgo dal led che ho installato su dei pin che rimane bloccato anzichè lampeggiare.

perchè non posso avere 2 strcpy_P?

E chi l'ha detto che non puoi avere più di un strcpy in uno sketch? :wink:
A parte che io ti avevo chiesto un test molto più semplice di questo, ossia di fare uno sketch senza nient'altro che la scrittura a video, ma comunque mi confermi che l'estrazione dei dati dalla Flash ti funziona, ora.
Quindi sta a te trovare l'errore logico che ti fa bloccare il micro perché mi stai dicendo che il programma si blocca durante l'esecuzione e tu durante l'esecuzione fai qualcosa... non è che per caso menu_selection_2 va oltre la dimensione dell'array di stringhe memorizzate nella Flash, ad esempio?

leo72:
E chi l'ha detto che non puoi avere più di un strcpy in uno sketch? :wink:
A parte che io ti avevo chiesto un test molto più semplice di questo, ossia di fare uno sketch senza nient'altro che la scrittura a video, ma comunque mi confermi che l'estrazione dei dati dalla Flash ti funziona, ora.
Quindi sta a te trovare l'errore logico che ti fa bloccare il micro perché mi stai dicendo che il programma si blocca durante l'esecuzione e tu durante l'esecuzione fai qualcosa... non è che per caso menu_selection_2 va oltre la dimensione dell'array di stringhe memorizzate nella Flash, ad esempio?

si il tuo test infatti l'ho effettuato, e ho risolto il problema con quel test... :slight_smile:

adesso faccio ulteriori test per questo... diciamo che mi manca solo questa seconda voce per finire tutto il mio codice :D!!

ho risolto usando l'lcd print standard... la mia funzione probabilmente sovraccaricava la memoria

Dipende da quanta RAM libera avevi.
Hai usato la funzione F() per le stringhe da stampare sull'LCD?
Esempio:

lcd.print("CIAO");

diventa:

lcd.print(F("CIAO"));

Così risparmi RAM.