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


von Christian (Gast)


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 .

von Marius W. (mw1987)


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

von Christian (Gast)


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 .

von Karl H. (kbuchegg)


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.

von Mark .. (mork)


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

von Christian (Gast)


Lesenswert?

1
#define   F_CPU 11059200  
2
#include  <avr\io.h>    
3
#include    <avr/eeprom.h>
4
#include    <string.h>
5
#include    <stdlib.h>
6
7
uint8_t  EEMEM W2 ;
8
uint16_t EEMEM W1 ; 
9
10
main ()            
11
{
12
  DDRD  = 0x00;
13
  DDRB  = 0xFF;
14
  PORTB = 0x00;
15
  PORTD = 0xFF;
16
  unsigned int Wert1 =  0  ;
17
  char         Wert2 =  0  ;
18
19
  eeprom_busy_wait();
20
  Wert1 = eeprom_read_word(&W1);
21
  
22
  eeprom_busy_wait();
23
  Wert2 = eeprom_read_byte(&W2);
24
  
25
  do {        // Schleifenanfang Mainloop
26
    if (!(PIND&0x02))                    // Wenn Taster 1
27
    {
28
      Wert1 = 20000 ;
29
      Wert2 = 1;
30
      Wert1 = (Wert1+Wert2);
31
    }
32
          
33
    if (!(PIND&0x04))                    // Wenn Taster 2
34
    {
35
      eeprom_busy_wait();
36
      eeprom_write_word (&W1,Wert1);
37
      eeprom_busy_wait();
38
      eeprom_write_byte(&W2,Wert2);
39
            
40
      if (Wert1 == 20001)
41
      {
42
        PORTB = 0xFF;
43
      }
44
    }              
45
  } while (true);   // Schleifenende Mainloop
46
}


so hier mal mein vereinfachtes Programm .

von Christian (Gast)


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

von Karl H. (kbuchegg)


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?

von Christian (Gast)


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 .

von Karl H. (kbuchegg)


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?

von Christian (Gast)


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

von Spezi (Gast)


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.)

von Karl H. (kbuchegg)


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

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.