PROGMEM und int

Hallo allerseits,

ich habe mal ein wieder ein Speicherproblem. Ich hatte bei einer Laufschrift Daten in den Flash geladen. Das hat damals gut geklappt. Das waren damals Byte. Jetzt wollte ich Daten als int im Flash speichern. Ein kurzer Auszug aus dem Programm:

#include <avr/pgmspace.h>
int C = 262; int CC = 277; int D = 294; int DD = 311; int E = 330; int F = 349;
int FF = 370; int G = 392; int GG = 415; int A = 440; int AA = 466; int H = 494;
float tempo =0.8;
int L_1 = 2000tempo; int L_2 = 1000tempo; int L_2_ = 1500*tempo; usw.

const int melo_1 [ ] PROGMEM = { D, L_4, P_2, H, L_8, P_1, usw.

void loop()

ton = pgm_read_word(&(melo_1 [zg1])); zg1++;

Das gesamte Programm lässt sich übersetzen und hoch laden. Der Rückgabewert für ton ist immer 0.

Ohne PROGMEM, die Daten dann im RAM läuft das Programm.

Mit freundlichen Grüßen
Hans-Ulrich

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Außerdem entferne bitte die unnötigen Leerzeilen.

Gruß Tommy

Wenn das besser lesbar ist, ist aber nur ein Auszug aus dem Programm um das Problem zu verdeutlichen. Deshalb auch die Leerzeilen.

Noch eine andere Frage. Auf der 1. Seite des Forums kann ich mich nicht einloggen. Es kommt immer nur "log in". Gehe ich auf die zweite Seite, bin ich aber angemeldet. Gehe ich wieder zurück auf die erste Seite, bin ich wieder nicht angemeldet.
Den aktuellen Beitrag sehe ich nur unter "Eigene Beiträge".

#include <avr/pgmspace.h>
int C = 262; int CC = 277; int D = 294; int DD = 311; int E = 330; int F = 349;
int FF = 370; int G = 392; int GG = 415; int A = 440; int AA = 466; int H = 494;
float tempo =0.8;
int L_1 = 2000tempo; int L_2 = 1000tempo; int L_2_ = 1500*tempo; usw.
const int melo_1 [ ] PROGMEM = { D, L_4, P_2, H, L_8, P_1, usw.
void loop()
ton = pgm_read_word(&(melo_1 [zg1])); zg1++;

Hans_Ulrich:
Noch eine andere Frage. Auf der 1. Seite des Forums kann ich mich nicht einloggen. Es kommt immer nur "log in". Gehe ich auf die zweite Seite, bin ich aber angemeldet. Gehe ich wieder zurück auf die erste Seite, bin ich wieder nicht angemeldet.

Einfach nach der Rückkehr zur 1. Seite auf aktualisieren clicken.

Gruß Tommy

#include <avr/pgmspace.h>
 int C = 262; int CC = 277; int D = 294; int DD = 311; int E = 330; int F = 349;
int FF = 370; int G = 392; int GG = 415; int A = 440; int AA = 466; int H = 494;
 float tempo =0.8;
 int L_1 = 2000*tempo; int L_2 = 1000*tempo; int L_2_ = 1500*tempo;  usw.
 const int melo_1 [ ] PROGMEM = { D, L_4, P_2, H, L_8, P_1,  usw.
 void loop()
 ton = pgm_read_word(&(melo_1 [zg1])); zg1++;

Jetzt müsste es mit dem Einfügen geklappt haben.

Hat geholfen (F5).

M.f.G.

Hans-Ulrich

Hast Du Dir mal die Beispiele in der Referenz angeschaut?

Gruß Tommy

Hallo Tommy,

so richtig haben mir die Beispiele in der Referenz nicht geholfen. Ich habe alles mögliche ausprobiert. Das wurde zwar immer übersetzt, aber der Rückgabewert war entweder 0 oder irgend etwas , was mit dem gespeicherten Wert nichts zu tun hatte. Es kann auch sein, dass ich bloß zu blöd bin um den Syntax richtig zu verstehen.
Ich werde mir wohl einen Mega nehmen. dann haben sich die Probleme erledigt.

Trotzdem vielen Dank für deinen Hinweis.

M.f.G.

Hans-Ulrich

Also Dein Code compiliert erst mal überhaupt nicht, da Du Werte die nicht als const deklariert sind in ein const Progmen-Array legen willst.

Wenn man das korrigiert und den Code aus dem verlinkten Beispiel benutzt, funktioniert es auch.

#include <avr/pgmspace.h>
const int C = 262; const int CC = 277; const int D = 294; const int DD = 311; const int E = 330; const int F = 349;
const int FF = 370; const int G = 392; const int GG = 415; const int A = 440; const int AA = 466; const int H = 494;
const  float tempo =0.8;
const  int L_1 = 2000*tempo; const int L_2 = 1000*tempo; const int L_2_ = 1500*tempo; 
 const int melo_1 [ ] PROGMEM = { D, L_2, E, H, L_1, AA};
 
void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  for (byte k = 0; k < 6; k++) {
    int displayInt = pgm_read_word_near(melo_1 + k); 
    Serial.println(displayInt);
  }
}

void loop() {}

Ergibt:

Start
294
800
330
494
1600
466

Gruß Tommy

Hallo Tommy,

ich muss mir erst mal auf der Zunge zergehen lassen, was du geschrieben hast.

Ich habe aber mal weiter probiert. hat mich doch etwas gewurmt, dass es sich so gewehrt hat . . .

Alles was zum Testen nicht nötig war raus geschmissen und folgenden Code übersetzt:

#include <avr/pgmspace.h>
int zg1 = 0;
int ton = 0;
byte taste = 6;
int test = 10;
const int melo_1 [] PROGMEM = {10, 20, 30,
                              };
void setup() {

  Serial.begin(9600);
  pinMode (taste, INPUT); digitalWrite (taste, HIGH);
}

void loop() {
  do {} while (digitalRead(taste) == HIGH );
  ton = pgm_read_word(&(melo_1 [zg1])); zg1++; Serial.println( ton );
  delay(2000);
}

Das Ergebniss:

17:58:41.938 -> 10
17:58:51.377 -> 20
17:58:53.439 -> 30
Danach habe ich einen Wert verändert:

#include <avr/pgmspace.h>
int zg1 = 0;
int ton = 0;
byte taste = 6;
int test = 10;
const int melo_1 [] PROGMEM = {test, 20, 30,
                              };
void setup() {

  Serial.begin(9600);
  pinMode (taste, INPUT); digitalWrite (taste, HIGH);
}

void loop() {
  do {} while (digitalRead(taste) == HIGH );
  ton = pgm_read_word(&(melo_1 [zg1])); zg1++; Serial.println( ton );
  delay(2000);
}

Das Ergebniss:

18:00:49.131 -> 1026
18:00:52.271 -> 9233
18:00:55.131 -> -16865
Dann den Wert von Test auf const gesetzt:

#include <avr/pgmspace.h>
int zg1 = 0;
int ton = 0;
byte taste = 6;
const int test = 10;
const int melo_1 [] PROGMEM = {test, 20, 30,
                              };
void setup() {

  Serial.begin(9600);
  pinMode (taste, INPUT); digitalWrite (taste, HIGH);
}

void loop() {
  do {} while (digitalRead(taste) == HIGH );
  ton = pgm_read_word(&(melo_1 [zg1])); zg1++; Serial.println( ton );
  delay(2000);
}

Ergebnis:

18:10:01.838 -> 10
18:10:03.893 -> 20
18:10:05.901 -> 30

Ohne dass ich das, was du geschrieben hast, genau verstanden habe, dein Rat ging sicher in die Richtung.

Ich habe wieder Hoffnung . . .

M.f.G.

Hans-Ulrich

Schalte mal alle Warnungen ein. Bei mir compiliert er mit "unkonstanten" Werten überhaupt nicht.
Ist ja auch logisch. Wenn test nicht const ist, also zur Laufzeit verändert werden kann, kann es auch nicht Bestandteil eines const-Arrays sein.

Gruß Tommy

Hallo Hans_Ulrich,

sehr interessantes Beispiel für eine fehlende Fehlermeldung!

Der Sketch

#include <avr/pgmspace.h>
size_t zg1 = 0;
/* const */int test=10;  
const int melo_1 [] PROGMEM = {test, 20, 30};
void setup() {
  Serial.begin(9600);
  while (zg1 < sizeof (melo_1) / sizeof (int)) {
    int ton = pgm_read_word(&(melo_1[zg1])); zg1++; Serial.println( ton );
  }
}
void loop() { }

erzeugt aktuell
error: variable 'melo_1' with dynamic initialization put into program memory area
Kompiliert aber ohne das eigentlich erforderliche const bei
int test=10;
leider ohne Fehlermeldung oder Warnung (Stufe Alle) noch in der IDE 1.8.9
Liefert da bei mir allerdings

[color=red]0[/color]
20
30

( Übersetzt für einen Nano (328) )

Ja, diese 0-Werte waren ja auch beim TO vorhanden, als er alle Werte im Progmem-Array nicht als const deklariert hatte. Das hatte mir die aktuelle (1.8.13) IDE für UNO um die Ohren gehauen.

Danke, dass Du das mal in einer früheren Version getestet hast.

@TO: Welche IDE-Version verwendest Du?

Gruß Tommy

Hallo Tommy,

Ich hatte wieder Hoffnung . . .und die Hoffnung trog nicht !

Programm läuft sauber auch wenn es zur Zeit erst zu 75 % geschrieben ist. Wenn es mal komplett fertig ist, stelle ich es ein. Da gehört aber noch ein großer Schwung Hardware dazu.

Vielen Dank für die Hilfe.

M.f.G.

Hans-Ulrich

Welche IDE-Version verwendest Du?

Gruß Tommy

Hallo Tommy,

solche Fragen machen mir immer Kopfschmerzen . . .

Die Programmierumgebung hat die Nummer 1.8.8, falls du das meinst.

M.f.G.

Hans-Ulrich

Dann solltest Du updaten (evtl. eine portable IDE zusätzlich nutzen), da die aktuelle IDE Dein Vorgehen als Fehler erkennt.

Gruß Tommy