Pages: [1]   Go Down
Author Topic: PROGMEM lettura char  (Read 981 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve avrei un problema con la lettura di alcuni char PROGMEM

il mio codice è tipo:

Code:
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 smiley-sad

ho provato il ciclo for sulle referenze PROGMEM ma non funziona...
« Last Edit: August 27, 2013, 04:36:00 am by leo72 » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

1) includi il codice usando gli appositi tag  smiley-wink
2) porg_xxx è errato, al max è prog_char  smiley-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:

Code:
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.
Logged


Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley!!

grazie mille
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...  smiley-sweat

Quote
per quanto riguarda prog_xxx non ho ben capito cosa intendi...
Che hai sbagliato a scriverlo!  smiley-yell
Hai scritto porg_char invece di prog_char, guardati il codice.

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

grazie mille
Attendo  smiley-wink
Logged


Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

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


la parte di codice interessate è:

VARIABILI:
Code:
// 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:
Code:
// 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 ***************

    }
  }
}
« Last Edit: August 27, 2013, 06:37:07 am by sagitt » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non hai incluso la lib per gestire i dati in flash:
Code:
#include <avr/pgmspace.h>
Logged


Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non hai incluso la lib per gestire i dati in flash:
Code:
#include <avr/pgmspace.h>

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

quella è solo la parte che mi da il problema!
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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?
« Last Edit: August 27, 2013, 02:05:31 pm by sagitt » Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

E chi l'ha detto che non puoi avere più di un strcpy in uno sketch?  smiley-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?
Logged


Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E chi l'ha detto che non puoi avere più di un strcpy in uno sketch?  smiley-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... smiley

adesso faccio ulteriori test per questo... diciamo che mi manca solo questa seconda voce per finire tutto il mio codice smiley-grin!!
Logged

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dipende da quanta RAM libera avevi.
Hai usato la funzione F() per le stringhe da stampare sull'LCD?
Esempio:
Code:
lcd.print("CIAO");
diventa:
Code:
lcd.print(F("CIAO"));
Così risparmi RAM.
Logged


Pages: [1]   Go Up
Jump to: