Forum: Mikrocontroller und Digitale Elektronik EEMEM schreiben/lesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Johannes S. (senzi)


Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

#include <avr/io.h>
#include <avr/eeprom.h>
uint16_t EEMEM eeFooWord  = 12345;

int main(void)
{
  DDRB = 0xFF;
  
  uint16_t myWord;
  //myByte lesen (Wert = 12345)
  myWord = eeprom_read_word(&eeFooWord);
  
  while(1)
  {
    if(myWord == 12345)
    {
      PORTB=0xFF;
    }
  }    
}

von SF6 (Gast)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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.

#include <avr/io.h>
#include <avr/eeprom.h>


uint16_t EEMEM eeFooWord  = 123;

int main(void)
{
  DDRB = 0xFF;
  
  uint16_t myWord;
  //myByte lesen (Wert = 123)
  myWord = eeprom_read_word(&eeFooWord);
  
  while(1)
  {
    if(myWord == 123)
    {
      PORTB=0xFF;
    }
  }
}

von Loopseher (Gast)


Bewertung
0 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


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

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht 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:
uint16_t EEMEM eeFooWord  = 123;

Da es uint16 ist, sind es 2 Bytes.

Passt alles.

mfg.

von hp-freund (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und zur Kontrolle vielleicht noch ein:
uint16_t EEMEM eeFooWord  = 0x1234;

von Intelerklärbär (Gast)


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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.