Hallo, ich beschäftige erst seit einigen Wochen mit der µC-Controller-Thematik. Daher bitte ich möglicherweise etwas triviale Fragen meinerseits zu entschuldigen. Die Suchfunktion hat mir leider keine Ergebnisse gebracht. Vielleicht habe nach dem falschen Begriff gesucht. Ich habe an meinem Atmega32 acht analoge Temp.fühler angeschlossen. Die Auswertung und Ausgabe über LCD als auch über USART funktioniert einwandfrei. Ich verwende das AVRStudio und avr-gcc. Nun möchte ich mit dem EEPROM beschäftigen, um später in bestimmten Zeitintervallen dort meine Messwerte abzuspeichern und in regelmäßigen Abständen über den USART an den PC zu übertragen. Die Messwerte sind vom Typ uint8_t und nehmen daher im EEPROM in Byte Platz ein?!?! Um möglichst wenig Platz im EEPROM zu verschwenden, muss ich dort die Messwertdaten in einer bestimmten Reihenfolge ablegen können. Durch die systematische Speicherung der Daten kann ich dann die einzelnen Daten den Sensoren bei der Ausgabe über den USART zuordnen. Soweit zumindest meine Überlegungen... Ich habe auch schon einzelne Werte in den EEPROM gespeichert, aber eine konkrete Adressierung des Speicherplatzes fehlt. Gibt es also einen EEPROM-write Befehl, bei dem ich die Adresse im EEPROM fest vorgeben kann? Falls ja, kann man die Adresse mit Hilfe einer Zählschleife bis 1024 (da der Atmega32 1024 Byte EEPROM besitzt) zählen lassen? Somit wüsste man dann auch gleich, wann der Speicher voll ist, oder? Vielen Dank für Eure Hilfe. Gruß Jens
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM eeprom_read_byte(&eeFooByte); Niemand sagt, dass du hier die Adresse einer Variablen angeben musst. Adresse ist Adresse und der Compiler kann sich nicht wehren :-) k = eeprom_read_byte( 1 ); l = eeprom_read_byte( 2 ); m = eeprom_read_byte( 3 ); .. for( i = 0; i < 512; ++i ) j = eeprom_read_byte( i ); ...
Du schreibst dir eine Funktion an der du die Adresse und Daten übergibst. Da du nur byteweise speicherst ist das recht einfach.
1 | void EEPRomWrite (uint8_t Address, uint8_t Data) |
2 | {
|
3 | while (EECR & (1 << EEWE)); // EEPROM write still busy ? |
4 | EEAR = Address; // EEPROM Adress Register |
5 | EEDR = Data; // EEPROM Data Register |
6 | EECR |= (1 << EEMWE); // EEPROM write enable |
7 | EECR |= (1 << EEWE); // EEPROM write data |
8 | }
|
Habs jetzt nicht getestet aber so stehts im Datenblatt. Während des speicherns dann noch Interrupts sperren, thats it.
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.