Forum: Compiler & IDEs pgm_read_byte Problem


von Heinz (Gast)


Lesenswert?

Servus

Ich versuche gerade Daten aus dem EEPROM zu lesen.
Oder besser gesagt ich versuche meine ersten Schritte in diese Richtung.
Bis jetzt Simuliere ich das ganze nur mit AtmelStudio.

Ich habe ein kleines Programm geschrieben welches zwar keine 
Fehlermeldung liefert allerdings auch nicht das macht was es soll.Wie 
könnte es anders sein ^^.
1
/*
2
 * GccApplication5.c
3
 *
4
 * Created: 3/22/2013 8:16:21 PM
5
 *  
6
 */ 
7
#include <avr/io.h>
8
#include <stdint.h>
9
#include <avr/pgmspace.h>
10
#include <stdlib.h>
11
#include <util/delay.h>
12
13
// Tabelle anlegen
14
15
const uint8_t Test[5] PROGMEM = {100,250,150,220,10};
16
uint8_t Wert = 0  ;
17
int main(void)
18
{
19
    while(1)
20
    {
21
       Wert = pgm_read_byte(Test[2]);
22
    }
23
}

Ich habe ein "Watch" für Wert erstellt ,leider bleibt dieser immer auf 
0.
Was mache ich falsch ? ich möchte den 2 Speicherplatz von "Test"auslesen 
, dieser entspricht 250.Ich würde mich sehr freuen wenn jemand von euch 
mir helfen könnte !

Schönes Wochenende

Heinz

von Thomas E. (thomase)


Lesenswert?

Heinz schrieb:
> Ich habe ein "Watch" für Wert erstellt ,leider bleibt dieser immer auf
> 0.
> Was mache ich falsch ? ich möchte den 2 Speicherplatz von "Test"auslesen
> , dieser entspricht 250.
Der 2. Speicherplatz ist [1]. Wir fangen bei 0 an zu zählen. Aber das 
ist nicht dein Hauptproblem.

Heinz schrieb:
> Wert = pgm_read_byte(Test[2]);
Das ist grundlegend falsch.
mit x= Test[1] liest du den Inhalt der zweiten Speicherstelle - im RAM.
Hier: pgm_read_byte(Test[1]) musst du die Adresse der zweiten 
Speicherstelle im Flash übergeben:
pgm_read_byte(&Test[1]);
oder
pgm_read_byte(Test + 1);

mfg.

von Heinz (Gast)


Lesenswert?

Hallo

Danke für dein Posting !

Du meinst also so ?

 Wert = pgm_read_byte(Test + 1);

oder

 Wert = pgm_read_byte(&Test[1]);

Bei beiden Versionen bleibt das Value = 0 , also unverändert !
Was habe ich da falsch Verstanden ?

von Thomas E. (thomase)


Lesenswert?

Heinz schrieb:
> Was habe ich da falsch Verstanden ?
Eigentlich gar nichts.

sehe gerade:
Heinz schrieb:
> Ich versuche gerade Daten aus dem EEPROM zu lesen.

Aber ist egal. das Prinzip ist das gleiche.

Das schreibt die Daten in deb Flash:
const uint8_t Test[] PROGMEM = {100,250,150,220,10};

und damit liest man sie:  pgm_read_byte(&Test[1]);

Wie stellst du denn fest, daß da 0 drinsteht?

Mach sonst mal folgendes:

DDRx |= (1 << n); //Led

 while(1)
    {
       Wert = pgm_read_byte(&Test[]);
       if(Wert == 250) PORTx |= (1 << n); else PORTx &= ~(1 << n);
    }

x und n musst du natürlich durch die richtigen Portnummern ersetzen.

mfg.

von Heinz (Gast)


Lesenswert?

Hallo

Ich nutze den Simulator vom AtmelStudio.
Ich setze ein Watch auf die Variable "Wert" , dort kann ich sehen 
welchen Wert diese hat.Und der bleibt bei 0.
Wenn ich den Wert anderst setze zum Beispiel durch = 10 dann sehe ich 
die Veränderung.Nur eben nicht mit dem gewünschten Befehl.

Wenn ich Debugge und auf "Show Next Statement" bei der DebuggSteuerung 
drücke sehe ich keinen gelben Pfeil mehr , keine Ahnung was das zu 
bedeutet hat.

Wenn ich auf Continue drücke wird die "WatshAnzeige" grau hinterlegt und 
ich sehe ebenfalls keine Veränderungen mehr

Ich werde mal deine Methode ausprobieren.
Kann es sein das man EEPROM Befehle nicht mit dem Simulator ausprobieren 
kann ? was könnte ich noch versuchen ?

von Heinz (Gast)


Lesenswert?

Guten Morgen , hat jemand noch eine Idee woran es liegen könnte ?

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

Heinz schrieb:
> pgm_read_byte

Heinz schrieb:
> EEPROM Befehle

Flash != EEPROM

Definiere entweder Deine Variable "volatile" oder schalte zum debuggen 
die Optimierung aus.

mfg

von Heinz (Gast)


Lesenswert?

Hallo

Danke für deine schnelle Antwort am frühen Morgen.

Also ich habe mal folgendes versucht:

volatile uint8_t Wert = 0 ;
Wert = pgm_read_byte(&Test[1]);

Ich denke das hast du gemeint mit " Definiere Variable volatile "
Leider bringt das auch nicht der erwünschten Erfolg.
Bei Ausführen bleibt der Cursor wieder bei dem "pgm_read_byte" Befehl 
stehen und nichts passiert mehr.

Was genau meinst du mit "Optimierung ausschalten" wie mache ich das ?

von Heinz (Gast)


Lesenswert?

Hallo

Ich habe ein wenig rumprobiert und bemerkt das wenn ich mit Breakepoints 
oder " Run To Cursor "arbeite die Variable den Wert von pgm_read_byte 
bekommt.
1
int main(void)
2
{
3
    
4
  Wert = pgm_read_byte(&Test[1]);
5
  
6
    
7
}

Wenn ich aber auf "Start Debugging and Break" bleibt der Cursor bzw das 
Programm bei "int main(void) stehe das ist ok.
Wenn ich dann aber auf Continue gehe wird die Watch anzeige grau 
hinterlegt und nichts tut sich mehr , der Debugger läuft aber noch.
Die Variable ändert sich dann auch nicht !Das selbe passiert wenn ich 
die While-Schleife einfüge nur das dann eben der Cursor am Anfang bei 
While stehen bleibt !

An was kann das liegen oder warum ist das so ?

von Heinz (Gast)


Lesenswert?

?????

von Hmm (Gast)


Lesenswert?

>Wenn ich dann aber auf Continue gehe wird die Watch anzeige grau
>hinterlegt und nichts tut sich mehr , der Debugger läuft aber noch.

Du musst den Debugger erst anhalten um eine Veränderung zu sehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.