- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: EEPROM - Adresse

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Anzeige

    Praxistest und DIY Projekte
    So, ich denke so müsste es klappen. Der Compiler meldet keinen Fehler mehr ich hoffe nur, die Logik stimmt auch so.

    Code:
    typedef struct {
    uint8_t min, sek, hour, date, mon, year, druck, feuchte, temp;
    } Messung;
    . . .
    Messung aktMessung; 
    Messung * adress; 
    Messung * i;
    ...
    int main() {
    ...
    case 6: //Teil einer Eingabe Aufforderung
    	uart_puts("Alle Werte aus dem EEPROM auslesen\r\n");
    	adress = (Messung*) eeprom_read_word(0x00);
    	for(i=(Messung*)0x02; i < adress; i++) {
    	//Ich will die Werte solange auslesen, bis ich bei der letzten Eingetragenen Messung angekommen bin
    	eeprom_read_block(&aktMessung, i, sizeof(Messung));
    	//Ausgabe von aktMessung über uart... 
    	//...
    	}
    break;
    case 7: 
    	uart_puts("EEPROM Zeiger reseten.\r\n");
    	eeprom_write_word(0, ((uint16_t)(Messung*)0x02));
    	/*Ist das so richtig, oder zeigt er dann wo falsch hin. Ich dachte mir, ich nehm 2 mal die breite der Struktur und dann muss dass ganze ja aber natürlich wieder zum uint16_t werden für die funktion. */
    break;
    //...
    } // Ende main();
    //...
    void speichern() { //Speichert die Werte aus aktMessung in den EEPROM
    	#if DEBUG  
    	uart_puts("Alle Werte der letzten aktuellen Messung speichern.\r\n");
    	#endif
    
    	adress = (Messung*) eeprom_read_word(0x00);
    	//Überprüfung ob noch Platz ist im EEPROM
    	if( (uint16_t)adress < 60) { /*512 Byte im Speicher / 8Byte pro Struktur = 64. Sicherheitshalbe hab ich 60 genommen.*/
    		#if DEBUG  
    		uart_puts("Ich werde bei "); PrintInt((uint16_t)adress); uart_puts(" anfangen in den EEPROM zu schreiben.\r\n");
    		#endif
    		eeprom_write_block( &aktMessung, adress, sizeof(aktMessung)); adress += 1;
    		eeprom_write_word(0x00, (uint16_t)adress);
    	}
    	else {
    		uart_puts("FEHLER: Kein Platz mehr im EEPROM!!!\r\n");
    	}
    }
    Könnte sich das vielleicht nochmal jemand ansehen und mich über logische Fehler aufklären? Ich werde es nachher auf den Mega16 spielen, aber ich seh das schon kommen, dass da ncihts geht und ich den Fehler nciht finde ...

    Danke

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    So auf Anhieb sieht's ganz ok aus.

    Für die letzte Adresse des EEPROMs gibt's das Define E2END (avr/io.h):
    if ((uint16_t) adress <= E2END+1-sizeof(Messung)) {...}

    Der Cast auf einen Pointer wechselt nur den Typ, der Wert als ganze Zahl betrachtet bleibt gleich.

    case 7:
    (uint16_t)(Messung*)0x02 ist nicht die "Breite" der Struktur, es ist 2 und der Ort für die erste Messung. (0x02 = sizeof(void*), d.h. vor der ersten Messung steht irgendein Pointer).

    Mit EEPROM-Adresse 0 hatte ich schon mal Probleme, im Wiki hab ich in den AVR-Errata was dazu geschrieben.
    Disclaimer: none. Sue me.

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Moin

    Danke für deine Hinweise. Das mit dem Ende vom EEPROM ist ein praktischer Hinweis, danke.

    Zu dem Fehler der EEPROM Adresse 0. Ich bin nicht so ganz bewandert mit den Geschichten was mir das Makefile alles abnimmt. Wo muss das genau rein? Hier:

    Code:
    # Link: create ELF output file from object files.
    .SECONDARY : $(TARGET).elf
    .PRECIOUS : $(OBJ)
    %.elf: $(OBJ)
    	@echo
    	@echo $(MSG_LINKING) $@
    	$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
    Oder wo muss ich da was ändern? Ich steig da leider nciht so 100%ig durch.

    case 7:
    (uint16_t)(Messung*)0x02 ist nicht die "Breite" der Struktur, es ist 2 und der Ort für die erste Messung. (0x02 = sizeof(void*), d.h. vor der ersten Messung steht irgendein Pointer).
    Ähm ... ok, ich glaube ich hab verstanden, was du mir sagen willst, aber heißt dass jetzt ich muss das ändern, oder kann ich das so lassen? Bzw. sollte ich da was ändern? Ich hab das so verstanden, dass ich in den ersten beiden Bytes(0 und 1) das WORD mit der Adresse speichere und dann im 3. Byte (0x02) anfange die Daten zu speichern. Ist da ein denkfehler drinn, oder meinst du nur ich kann mir das doppelte Casten sparen?

    Danke

    Andun

    Nachtrag:

    Achja, wie sieht das eigentlcih bei sizeof() aus? Übergeb ich da als Argument den Typ oder eine Instanz des Types? Also eine feste schon deklarierte Variable oder nur den Datentyp?
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Am Makefile musst du nix ändern. Du lässt ja nicht GCC (bzw ld) die Lokatierung der EEPROM-Daten übernehmen, sondern suchst dir die Adressen selbst aus. Du speicherst also das Word nicht ab 0x0, sondern ab 0x1 und die erste Messung ab 0x3. That's it.

    Das mit dem Rumgecaste hab ich nur gesagt, weil der Code so aussieht als wär die nicht klar, was du da eigentlich treibst... Geht aber schon so wie es da steht.

    sizeof frisst beides. Sei mutig und probier's aus, oder steuert dein Prog nen Atommeiler?
    Disclaimer: none. Sue me.

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Hehe, Atommeiler ... (Hat heute einer die Simpsons Folge gesehen? "Wie hat Homer Simpson die Kernschmelze ausgelöst? In dem Testwagen befand sich kein atomares Material?" )

    Also das mit dem EEPROM hab ich mir dann grade komplizieter vorgestellt. Hab irgendwann um 20 Ecken denken wollen ... Das werd ich mal anpassen auch wenn cih bis jetzt bei der 0 noch keinen Fehler gefunden habe.

    Also das System läuft jetzt seit Mittags und zeichnet mir schön alle 10 Minuten das "Wetter" auf. Geht gut. Ich hab halt leider immer nur für 10h Platz .... Ich hab schon mal ausgeleert.

    Ihr könnt morgen ein Diagramm meines Temperaturverlaufes haben, wenn ihr wollt.

    Danke und gute Nacht

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Die Zeit brauchst du nicht jedesmal mit zu speichern, oder? Es genügt doch, die Zeil am Anfang einmal zu speichern. Danach erfolgen die Messungen wohl in regelmässigen Intervallen. Damit würde es immerhin für gut einen Tag reichen.
    Disclaimer: none. Sue me.

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen