Problemi con PROGMEM

Ciao! Sto cercando di sfruttare la libreria pgmspace.h per gli stessi scopi.. tuttavia quando Arduino legge la riga:

memcpy_P(uSendBuff, pfSendBuff+1, rawlen * sizeof(uint16_t));

si blocca la scheda e devo resettare... Provo a incollare lo sketch... compilo con 1.0.5 r2 e Arduino UNO/MEGA (la libreria si comporta in modo diverso tra le due?)

#include <IRremote.h>
#include <avr/pgmspace.h>
#include <avr/io.h>
#define REQ_BUF_SZ   20
#define maxLength 25

prog_uint16_t off[] PROGMEM ={4450,4250,600,1550,600,1500,600,1550,600,1550,600,450,600,450,650,1500,600,450,650,450,600,500,550,500,600,450,600,1550,600,1550,600,450,600,1550,600,450,600,450,650,450,600,500,550,450,650,450,600,1550,600,1550,600,1550,550,1550,600,1550,600,1500,650,1550,550,1550,600,500,550,500,600,450,600,500,600,450,600,500,550,500,600,450,600,450,650,1500,600,450,650,1500,600,450,650,450,600,500,600,450,600,500,550,500,600,450,600,1500,650,450,600,500,600,450,600,1550,600,1550,600,1500,600,500,600,450,600,450,600,450,650,450,600,450,650,450,600,450,600,500,600,450,600,450,600,500,600,450,600,1550,600,1550,600,450,600};

unsigned int uSendBuff[RAWBUF];
IRsend irsend;


void sendAcCommand(int index) {
  uint16_t rawlen;
  Serial.println("PRIMA RIGA");
  delay(500);
  prog_uint16_t* pfSendBuff = getAcSendBuff(index);
  delay(500);
  Serial.println("SECONDA RIGA");
  delay(500);
  if (0 != pfSendBuff) {
    Serial.println("INGRESSO FUNZIONE PRIMA RIGA");
    delay(500);
    rawlen = pgm_read_word_near(pfSendBuff);
    Serial.println("INGRESSO FUNZIONE SECONDA RIGA");
    delay(500);
    memcpy_P(uSendBuff, pfSendBuff+1, rawlen * sizeof(uint16_t));
    Serial.println("INGRESSO FUNZIONE TERZA RIGA");
    delay(500);
    irsend.sendRaw(uSendBuff, rawlen, 38);
    Serial.println("FUNZIONE ESEGUITA");
    delay(500);
  }
}

prog_uint16_t * getAcSendBuff(int index) {
if ( index == 99 ) { return off; }
return 0;
}


void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
        Serial.println("CIAO");
}

void loop() {
        // send data only when you receive data:
        if (Serial.available() > 0) {
               sendAcCommand(99);
               delay(2000);
        }
}

Grazie per tutto l'aiuto... che mi date e mi darete.. :slight_smile:

Neanche un microscopico aiutino? :blush:

La prox volta non ti agganciare ad una discussione vecchia di 6 mesi :wink:

Tornando al problema, attento che nella versione 1.0.5 c'è una versione del compilatore, nella 1.5.7 ce n'è una più recente ed alcune cose con progmem nel corso del tempo sono cambiate, quindi ti conviene scegliere prima la versione del compilatore per capire dopo come fare.

Infine, inizia con l'usare la libreria Flash:
http://arduiniana.org/libraries/flash/

Serve proprio per usare la Flash quando non si ha dimestichezza con PROGMEM e simili, non è infatti facile leggere e scrivere dalla Flash.

leo72:
La prox volta non ti agganciare ad una discussione vecchia di 6 mesi :wink:

Tornando al problema, attento che nella versione 1.0.5 c'è una versione del compilatore, nella 1.5.7 ce n'è una più recente ed alcune cose con progmem nel corso del tempo sono cambiate, quindi ti conviene scegliere prima la versione del compilatore per capire dopo come fare.

Infine, inizia con l'usare la libreria Flash:
Flash | Arduiniana

Serve proprio per usare la Flash quando non si ha dimestichezza con PROGMEM e simili, non è infatti facile leggere e scrivere dalla Flash.

Mi conveniva aprirne una nuova eh? :roll_eyes: sorry..
Credo che con la libreria Flash riuscirò a risolvere il problema... anche perchè ci saranno discussione già aperte in merito!
Grazie :slight_smile: