Forum: Mikrocontroller und Digitale Elektronik EEMEM schreiben/lesen


von Johannes S. (senzi)


Lesenswert?

Hi,

könnte mir bitte, wer sagen warum dieser Code nicht läuft. Vielen Dank

#include <avr/io.h>
#include <avr/eeprom.h>
1
uint16_t EEMEM eeFooWord  = 12345;
2
3
int main(void)
4
{
5
  DDRB = 0xFF;
6
  
7
  uint16_t myWord;
8
  //myByte lesen (Wert = 12345)
9
  myWord = eeprom_read_word(&eeFooWord);
10
  
11
  while(1)
12
  {
13
    if(myWord == 12345)
14
    {
15
      PORTB=0xFF;
16
    }
17
  }    
18
}

von SF6 (Gast)


Lesenswert?

Johannes Senzenberger schrieb:
> könnte mir bitte, wer sagen warum dieser Code nicht läuft.
Weil er keine Beine hat.

Beschreib dein Problem vllt. ein bisschen genauer, siehe Netiquette.

von Johannes S. (senzi)


Lesenswert?

Stimmt!

Ich versuch den EEPROM zu beschreiben. Der Controller ist ein ATMEGA16A. 
Der Grund hierfür ist, die bleibende Veränderung von Grenzwerten via 
RS232. Die Schnittstelle funktioniert in einem anderen Programm.

Bei dem EEPROM habe ich sehr viel Tutorials gesehen, aber ich komme 
nicht auf  die Lösung.

Danke für den Link. Ich versuche nun doch schon etwas verbissen die 
Aufgabe zu lösen.

von Loopseher (Gast)


Lesenswert?

Johannes Senzenberger schrieb:
> könnte mir bitte, wer sagen warum dieser Code nicht läuft.

"Gehen" wird dein Code schon, aber

- vielleicht hast du dein EEPROM nicht programmiert.
- vielleicht ist dein EEPROM kleiner als 12345. dann
  wirst du nämlich bei 12345 (0x3039) keine Daten ablegen
  können.

Wir wissen es nicht. Denn du willst uns ja nicht alles
zeigen. Nennt man Salamitaktik .....

von Loopseher (Gast)


Lesenswert?

Johannes Senzenberger schrieb:
> Der Controller ist ein ATMEGA16A.

Dann ist dein EPROM nur 512 (0x0200) Bytes gross.

von Johannes S. (senzi)


Angehängte Dateien:

Lesenswert?

Ich habe einen externen Kristall Quarz mit 8 MHZ. Die Debugging Frequenz 
ist ein MHz. Ich denke die EESAVE muss nicht gesetzen, weil der EEPROM 
beim Programmieren gelöscht werden soll.

ok. Danke dann wird einiges klar.

Danke

von Thomas E. (thomase)


Angehängte Dateien:

Lesenswert?

Loopseher schrieb:
> Nennt man Salamitaktik .....
Und das, was du schreibst, nennt man Blödsinn.

Johannes Senzenberger schrieb:
> könnte mir bitte, wer sagen warum dieser Code nicht läuft. Vielen Dank

Also eigentlich läuft es. Zumindest auf einem 644P. Gab es bei den 
Altlasten nicht ein Problem mit Adresse 0?

mfg.

von Thomas E. (thomase)


Lesenswert?

Johannes Senzenberger schrieb:
> ok. Danke dann wird einiges klar.

Hoffentlich meinst du damit nicht den Unsinn von diesem Schleifengucker.

Vergiss das!

mfg.

von Johannes S. (senzi)


Angehängte Dateien:

Lesenswert?

Gleiches Problem.  Mein Debugger ist AVR mk2. Ich denke bei den 
Einstellungen für den Programmer mache ich ncoh was falsch. Ich habe es 
auf beiden Wegen versucht. Einmal EEMEM vor und nach dem Variablen namen 
geschrieben.   Salamitaktik möchte ich gerne vermeiden, aber ich habe 
noch nicht soviel mit Foren gearbeitet.

1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
4
5
uint16_t EEMEM eeFooWord  = 123;
6
7
int main(void)
8
{
9
  DDRB = 0xFF;
10
  
11
  uint16_t myWord;
12
  //myByte lesen (Wert = 123)
13
  myWord = eeprom_read_word(&eeFooWord);
14
  
15
  while(1)
16
  {
17
    if(myWord == 123)
18
    {
19
      PORTB=0xFF;
20
    }
21
  }
22
}

von Loopseher (Gast)


Lesenswert?

Johannes Senzenberger schrieb:
> Gleiches Problem.

Du schreibst ja nicht was du erwartest.

Du hast einen MKII, da kannst du ja mal das EEPROM lesen und
prüfen ob da was drinsteht was du reingeschrieben hast....

von Thomas E. (thomase)


Lesenswert?

Johannes Senzenberger schrieb:
> Mein Debugger ist AVR mk2. Ich denke bei den
> Einstellungen für den Programmer mache ich ncoh was falsch.

Das einzige, was man da falsch kann, ist, dass man da überhaupt etwas 
einstellt. Unter normalen Bedingungen, d.h. bei einem CPU-Takt von 1 - 
20 MHz, läuft der mit den Default-Einstellungen.

Wie gross ist Vcc?

mfg.

von Loopseher (Gast)


Lesenswert?

Loopseher schrieb:
> - vielleicht ist dein EEPROM kleiner als 12345.

Ja das war Käse, zu schnell geschaut.

von Johannes S. (senzi)


Angehängte Dateien:

Lesenswert?

5V. Ground sollte auch ok sein, da ich ein evaluation board (STK16+ von 
waveshare) verwende. Auch der Jumper am Board ist auf 5V position.

von Johannes S. (senzi)


Lesenswert?

Ich habe auch versucht die Interrupts zu enablen. Was ist gemeint mit 
Altlasten und Adresse 0?

von Thomas E. (thomase)


Lesenswert?

Johannes Senzenberger schrieb:
> Ich habe auch versucht die Interrupts zu enablen.
Das hat ja nichts mit deinem Problem zu tun.

> Was ist gemeint mit Altlasten und Adresse 0?
Ich habe die alten Controller, Atmega8, 16, ..., nie verwendet. Deswegen 
hat mich das nie besonders interessiert.
Aber es gibt da irgendein Poblem mit Adresse 0. Da wird irgendwie was 
unter bestimmten Bedingungen gelöscht oder nicht richtig beschrieben. 
Dazu gibt es auch jede Menge Beiträge im Forum.

Was sagt denn dein Debugger dazu? Guck doch einfach rein ins EEPROM.

Dass dein Programm funktioniert, siehst du ja an meinem Screenshot. Ist 
zwar ein 644. Aber das ist auch nur ein AVR. Allerdings kennt der das 
Problem mit Adresse 0 nicht.

mfg.

: Bearbeitet durch User
von Johannes S. (senzi)


Lesenswert?

Ich hab nur den AVRISP mk2. Soweit ich weiß, kann ich mit diesem Gerät 
nicht die Werte an den Breakpoints auslesen.

Dachte ich mir schon, dass keine Verbindung mit den Interrupts besteht. 
Man bewegt sich halt dann mal schnell in eine falsche Richtung.

Ich werde das Forum durchsuchen. Vielleicht gibts da eine Lösungen. 
Vielleicht direkt adressieren.

Vielen Danke, soweit deinen Bemühung und natürlich für diesen Tipp!!

mfg

von Johannes S. (senzi)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt noch das eeprom.eep unter dem Debug ordner mit dem Text 
editor geöffnet.

Konvertiert von Hex nach Dezi
020000007B0083   =>   562949961482371

Grüße

von Fritz G. (fritzg)


Lesenswert?

Wie wärs damit, das EEPROM erst einmal zu beschreiben? Z.b. Mit 
eeprom_write_word.
Mit der Zuweisung wird es nicht ins Eeprom geschrieben, es sei denn, du 
schreibst das .eep File, das beim kompilieren hoffentlich erzeugt wurde.

von Johannes S. (senzi)


Angehängte Dateien:

Lesenswert?

Ok, aber jetzt funktioniert es.

Ich ich habe jetzt die eeprom.eep datei beim Debugger hinzugefügt und 
programmiert. Die Zeichen :00000001FF steht in jeder eeprom.eep auch bei 
anderern Porgrammen
Die Zeichen :020000007B0083 kann ich mir nicht erklären.

Mfg

von Thomas E. (thomase)


Lesenswert?

Johannes Senzenberger schrieb:
> Ich habe jetzt noch das eeprom.eep unter dem Debug ordner mit dem Text
> editor geöffnet.

Das ist das, was beim Programmieren reingeschrieben wird. Das kannst du 
zur Kontrolle auch aus dem µC auslesen.

Johannes Senzenberger schrieb:
> Konvertiert von Hex nach Dezi

Das braucht niemand.

Johannes Senzenberger schrieb:
> 020000007B0083

Das ist interessant. 2 Bytes an Adresse 0. Und zwar diese beiden: 7B 00. 
Das ist die 123:
1
uint16_t EEMEM eeFooWord  = 123;

Da es uint16 ist, sind es 2 Bytes.

Passt alles.

mfg.

von hp-freund (Gast)


Lesenswert?

Und zur Kontrolle vielleicht noch ein:
1
uint16_t EEMEM eeFooWord  = 0x1234;

von Intelerklärbär (Gast)


Lesenswert?

Johannes Senzenberger schrieb:
> Die Zeichen :020000007B0083 kann ich mir nicht erklären.

http://de.wikipedia.org/wiki/Intel_HEX

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.