mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unsigned int und char ins eeprom!


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Gemeinde,
Ich versuche jetzt schon seit Tagen diese zwei Werte ins Eeprom zu 
übertragen und dann nachdem der ATmega168 keinen Strom mehr hatte ,da 
ausgeschaltet wieder in das Programm zu laden :

uint8_t  EEMEM W2 ;
uint16_t EEMEM W1 ;

----------------------------------------------------------------

unsigned int Wert1 = 12345 ;
char         Wert2 = 1     ;

----------------------------------------------------------------

eeprom_write_word (&W1,Wert1);
Wert1 = eeprom_read_word(&W1);

-----------------------------------------------------------------

eeprom_write_byte(&codl,Wert2);
Wert 2 = eeprom_read_byte(&W2);


------------------------------------------------------------------


Irgendwie blick ich da noch nicht ganz durch .Das Tutorial hilft mir da 
bisher auch nicht mehr weiter .
Mit der write Block Anweisung habe ich zum Beispiel mit Strings kein 
Problem .

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck doch einfach mal nach, ob da nicht irgendwie in Zeile 42 der Wurm 
drin ist... Ich hab da so die Vermutung, dass dein Programm in der Zeile 
nen Fehler macht.

MfG
Marius

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Knapp daneben ;-) .Zeile 42 ist ein Kommentar :P .
Nein mal im Ernst .Mir würde es schon reichen wenn jemand mal eben einen 
Code postet wo er eine int und char ins Eeprom geschrieben und wieder 
gelesen hat .

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> Knapp daneben ;-) .Zeile 42 ist ein Kommentar :P .
> Nein mal im Ernst .

Mal im Ernst

Die Floskel "Der Fehler ist in Zeile 42" steht für:

Zeig uns deinen Code!
Und zwar den richtigen! Und zwar möglichst vollständig!

Mach kein Beispiel fertig, tipp ihn nicht ab, beschreib ihn nicht 
verbal, sondern häng einfach den Code so wie er ist als Attachment an.

Das ist für dich bequemer und wir müssen auch nicht nachfragen.

Wenn du nett bist, dann isolierst du dein Problemkind in ein eigenes 
Programm, welches sich nur um dieses Problemkind dreht, compilierst noch 
mal und stellst sicher, dass der Fehler auch wirklich noch enthalten ist 
und postest erst dann diese 'Vereinfachung'

> Mir würde es schon reichen wenn jemand mal eben einen
> Code postet wo er eine int und char ins Eeprom geschrieben und wieder
> gelesen hat .

Das funktioniert genau so, wie du es oben andeutest.
Dein Fehler liegt daher in Codeteilen, die wir nicht sehen können. Das 
kann zb auch in den Codeteilen sein, mit denen du überprüfst ob das 
Gelesene korrekt ist.

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> eeprom_write_byte(&codl,Wert2);
> Wert 2 = eeprom_read_byte(&W2);

Du schreibst Wert2 nach &codl, liest ihn aber von &W2. Davor wurde Wert1 
jeweils nach/von &W1 geschrieben/gelesen. Ist das beabsichtigt?

MfG Mark

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define   F_CPU 11059200  
#include  <avr\io.h>    
#include    <avr/eeprom.h>
#include    <string.h>
#include    <stdlib.h>

uint8_t  EEMEM W2 ;
uint16_t EEMEM W1 ; 

main ()            
{
  DDRD  = 0x00;
  DDRB  = 0xFF;
  PORTB = 0x00;
  PORTD = 0xFF;
  unsigned int Wert1 =  0  ;
  char         Wert2 =  0  ;

  eeprom_busy_wait();
  Wert1 = eeprom_read_word(&W1);
  
  eeprom_busy_wait();
  Wert2 = eeprom_read_byte(&W2);
  
  do {        // Schleifenanfang Mainloop
    if (!(PIND&0x02))                    // Wenn Taster 1
    {
      Wert1 = 20000 ;
      Wert2 = 1;
      Wert1 = (Wert1+Wert2);
    }
          
    if (!(PIND&0x04))                    // Wenn Taster 2
    {
      eeprom_busy_wait();
      eeprom_write_word (&W1,Wert1);
      eeprom_busy_wait();
      eeprom_write_byte(&W2,Wert2);
            
      if (Wert1 == 20001)
      {
        PORTB = 0xFF;
      }
    }              
  } while (true);   // Schleifenende Mainloop
}


so hier mal mein vereinfachtes Programm .

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark .. schrieb:
> Du schreibst Wert2 nach &codl, liest ihn aber von &W2. Davor wurde Wert1
>
> jeweils nach/von &W1 geschrieben/gelesen. Ist das beabsichtigt?
>
>
>
> MfG Mark

Nein sorry war nur falsch im Beispiel .
Wie gesagt vereinfachtes Programm funktioniert nach dem neustart des 
AVRS nicht :S

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:

> so hier mal mein vereinfachtes Programm .


O .... kay ....

und woran machst du jetzt fest, dass aus dem EEPROM nicht richtig 
gelesen/geschrieben werden konnte?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich compiliere obigen Code .
Nutze mein Experimental Board .
Drücke ich nun Taster für die Rechnung leuchten die LEDs also die 
Rechnung stimmt .
Jetzt mache ich den Strom weg warte kurz schalte ihn wieder ein .
Durch die read Prozedur sollte der Wert1 noch immer 20001 betragen da 
dieser ja so ins EEprom geschrieben wurde .
Da die LEDs aber nicht leuchten kann was nicht stimmen .

Wie gesagt der Code mag von der Funktion her vielleicht etwas blöd sein 
aber ich musste ihn deart vereinfachen das ich an den Eeprom Prozeduren 
leicht was ändern konnte .

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> Ich compiliere obigen Code .
> Nutze mein Experimental Board .
> Drücke ich nun Taster für die Rechnung leuchten die LEDs also die
> Rechnung stimmt .
> Jetzt mache ich den Strom weg warte kurz schalte ihn wieder ein .
> Durch die read Prozedur sollte der Wert1 noch immer 20001 betragen da
> dieser ja so ins EEprom geschrieben wurde .
> Da die LEDs aber nicht leuchten kann was nicht stimmen .

Die Leds leuchten aber nur dann wenn du nach dem Wiedereinschalten 
erneut Taster 2 drückst. Tust du das?

> Wie gesagt der Code mag von der Funktion her vielleicht etwas blöd sein
> aber ich musste ihn deart vereinfachen das ich an den Eeprom Prozeduren
> leicht was ändern konnte .

Ist schon ok.
Das ist gut so, wie du das gemacht hast.

Ich wollte nur deine Testprozedur wissen

Strom ein                 -> Leds sind aus
Taster 1 drücken          -> Leds sind aus
Taster 2 drücken          -> Leds sind ein
Strom aus
Strom ein                 -> Leds sind aus
Taster 2 drücken          -> Leds sind ein

das wäre das Testszenario und das Verhalten der Leds das ich aufgrund 
des Programms erwarten würde.

Brown Out Detection hast du per Fuse eingeschaltet?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha jetzt klappt es .Bei der Taster 2 Routine hat die Klammer gefehlt 
daher ist das Programm hier wohl etwas durcheinander geraten .

Super ! lieben Dank erstmal

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

du solltest dir noch Gedanken machen über prellende (und auch länger 
gedrückte) Tasten und die damit verbundenen mehrfachen Durchläufe der 
Tasten-Routinen. Sonst ist irgendwann das EEPROM "zerschrieben" ...

Eine Entprell-Routine und eine Verhinderung vor Mehrfach-Ausführung sehe 
ich in deinem Code nicht. (Über Hardware- Entprell-Massnahmen kann man 
mangels Schaltplan nichts sagen.)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spezi schrieb:
> Hallo,
>
> du solltest dir noch Gedanken machen über prellende (und auch länger
> gedrückte) Tasten und die damit verbundenen mehrfachen Durchläufe der
> Tasten-Routinen. Sonst ist irgendwann das EEPROM "zerschrieben" ...

Ist ja nur ein abgespeckter Testcode

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.