unsigned int und char ins eeprom!

Gast #1744797
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 .
Gast #1744803
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 .
#1744806
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.
Gast #1744838
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 .
Gast #1744840
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
Gast #1744848
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 .
#1744851
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?
Gast #1744889
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.)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren