Hallo,
ich finde avrdude zum Auslesen des EEPROMs recht gut zu handhaben,
allerdings ist das Ausgabeformat unpraktisch
( ich benutze -U eeprom:r:ausg.txt:d, aber :h udgl. sind auch nicht
besser).
Ich habe z.B. die Zahlen von 0-200 ins EEPROM geschrieben. Die
avrdude-Ausgabe sieht so aus:
d.h. zwei Zellen pro Wert und (bei größeren Zahlen) begrenzt auf 255,
obwohl sowohl Adressen als auch Inhalt mit uint16_t definiert waren.
Mir scheint, mit avrdude ist da nichts mehr zu machen (auch ein dump
bringt nichts Besseres).
Kann man dann an der EEPROM-Speicherei etwas ändern?
Das zugehörige Programm, das die Zahlen ins EEPROM schreibt, ist aus dem
Tutorial abgekupfert:
1
uint16_tadr[200]EEMEM;
2
3
intmain(void)
4
{
5
uint16_tmyWord,i;
6
for(i=0;i<200;i++)
7
{
8
myWord=i;
9
eeprom_write_word(&adr[i],myWord);// schreiben
10
}// Ende for
11
return(0);
12
}
Ich habe probeweise mal die Schrittweite i verdoppelt, falls der
Compiler übersehen sollte, daß für ein Wort zwei 1-Byte-Speicherplätze
reserviert werden müssen. Er übersieht es natürlich nicht und in der
Ausgabe steht zwischen meinen Zahlen immer zweimal 255.
Gibt es eine andere so bequeme Methode, an den EEPROM-Inhalt zu kommen,
nur schöner formatiert?
Gruß
Alexander
Das ist doch alles so, wie's sein soll?
Du schreibst nunmal einen 16 Bit breiten Wert ins EEPROM, von 0 bis 199.
Danach ist das EEPROM noch von vorher auf 0xFF=255 gesetzt.
Wie möchtest du die Ausgabe denn formatiert haben, bzw. woher soll
avrdude das wissen?
Gruß
Lasse
Lasse S. schrieb:
> Wie möchtest du die Ausgabe denn formatiert haben, bzw. woher soll> avrdude das wissen?
er ist anscheinend der Meinung, dass das EEPROM weiß, wie die einzelnen
Bytes, aus denen es nunmal besteht, zusammenhängen...
Lasse S. schrieb:
> Du schreibst nunmal einen 16 Bit breiten Wert ins EEPROM, von 0 bis 199.> Danach ist das EEPROM noch von vorher auf 0xFF=255 gesetzt.>>> Wie möchtest du die Ausgabe denn formatiert haben, bzw. woher soll> avrdude das wissen?
Auch wenn ich größere Zahlen hineinschreibe (z.B. 2000 bis 0), bleibt
die Aufteilung in low- und high-Byte.
Ich habe im avrdude-Manual nichts gefunden, was aus diesen beiden Bytes
einen direkt lesbaren Zahlenwert gem. uint16_t macht, wahrscheinlich ist
avrdude darauf nicht eingerichtet.
Man müßte ein Programm schreiben, was die avrdude-Datei einliest und die
beiden Bytes zusammensetzt, womit man dann das Rad zum x-ten Male neu
erfunden hätte.
Vielleicht gibt etwas Fertiges, das das Auslesen und in uint16_t-Format
bringen am Stück erledigen kann?
mfg
Alexander Schmeil schrieb:
> Ich habe im avrdude-Manual nichts gefunden, was aus diesen beiden Bytes> einen direkt lesbaren Zahlenwert gem. uint16_t macht, wahrscheinlich ist> avrdude darauf nicht eingerichtet.
Du wirst dort auch nix finden.
Aus dem einfachen Grund: AVRDUDE ist das sowas von egal, was im EEPROM
steht. AVRDUDE kennt weder uint16_t, noch sonst irgendeinen Typ,
abgesehen vom 'Byte'. Was du mit deinen Bytes anstellst, ist dir
überlassen. Oder deinem Assembler oder deinem C-Compiler oder sonstwem.
Entsprechend bekommst du auch höchstens 255 heraus, mehr geht mit einem
Byte halt nicht. Alles darüber setzt sich aus mehreren Bytes zusammen.
> Vielleicht gibt etwas Fertiges, das das Auslesen und in uint16_t-Format> bringen am Stück erledigen kann?
Was willst du denn damit?
Alexander Schmeil schrieb:
> Sven P. schrieb:>> Was willst du denn damit?>> In ein Meßwertdatendarstellungsprogramm einspeisen und graphisch> darstellen lassen.
Achso, das soll ein Protokoll sein...
In dem Fall ist uint16_t ungünstig, da abhängig von der Endianness der
Architektur. Wenns nur AVR ist, lässt sich das aber herausfinden.
Lass dir den Inhalt des EEPROMs in Binär ausgeben und dann
experimentiere mal mit dem *hd*-Programm (hexdump).