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 .
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
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 .
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.
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
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 .
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
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?
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 .
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?
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
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.)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.