Hallo zusammen
Ich habe ein Projekt, mit dem ich ich mit einem Atmega16 eine
IR-Fernbedienung einlese. Der eingelesene Code wird dann mit einer
Lookup-Tabelle verglichen um den gedrückten Button herauszufinden.
Das hat bis jetzt auch ganz gut geklappt. Da mein RAM langsam zu eng
wird, will ich die Tabelle nun ins Flash verlegen.
Hier meine Lookup-Daten:
Hier kriege ich nun nur noch Mülldaten. Auch stoppt die Schleife nicht
mehr :(
Bis jetzt habe ich folgendes herausgefunden:
Wenn ich q nur von 0..1 zähle, klappt es.
Anschliessend kann ich in einer neuen Schleife von 2..3, 4..5 usw.
zählen.
Aus irgend einem Grund wird mir da offenbar q irgendwie zerschossen oder
es hat einen Überlauf.
merkwürdigerweise klappt es aber, wenn ich die Schlaufe wie zuoberst
zerlege.
Hier ein Beispiel wie es klappt:
unsigned const int IR_KEY_LIST[][8] PROGMEM
^^^^^
Warum machst du hier ein 2 Dimensionales Array auf?
Es reicht doch:
unsigned const int IR_KEY_LIST[8] PROGMEM
Die Groesse deiner Elemente ist doch fest "int".
Was meinst Du damit?
Natürlich könnte ich die Feldgrösse ausrechnen und angeben, aber das
kann der Compiler ja auch selber machen.
Ausserdem habe ich in einer anderen Konstante definiert, wie gross das
Array ist.
Der Grund dass ich das hier nicht angebe ist nur, weil ich es dann auch
im Headerfile angeben müsste.
Aber wie gesagt, einzeln auslesen geht ja, deshalb sollte das kaum das
Problem sein.
Also, der Code sollte eigentlich so funktionieren. Ich sehe keinen
Fehler.
Was mich stutzig macht, ist das Du schreibst:
>Da mein RAM langsam zu eng wird ...
Poste doch mal die Speicherangaben nach dem Compiliervorgang. (Du
benutzt doch AVRStudio nehme ich an)?
Ich habe Zweifel daran, dass es an zuwenig RAM liegt, aber sicher ist
sicher.
Reduziere dann auch mal den Code auf das absolut Notwendigste, so das
der Fehler noch auftritt und poste am besten das ganze Projekt (nach
einem Clean).
Das RAM sollte definitiv kein Problem sein.
Untenstehend ein Minimalbeispiel, bei dem das Problem immer noch
auftritt.
Wenn ich die 8 in der for-Schleife auf 2 verkleinere, geht es.
>Untenstehend ein Minimalbeispiel, bei dem das Problem immer noch
auftritt.
Du hast es vielleicht übersehen:
>Reduziere dann auch mal den Code auf das absolut Notwendigste, so das>der Fehler noch auftritt und poste am besten das ganze Projekt (nach>einem Clean).
Der Code muss natürlich für uns kompilierbar sein. Deswegen solltest Du
das ganze Projekt posten. Wie gesagt ist das Verhalten am Code allein
nicht erklärbar. Dein letzter Post bringt uns also nicht weiter.
P.S.
Der Kommentar stimmt übrigens nicht: Symptom ist das was Du beobachtest,
nicht das was Du vermutest.
Bhu, ich habe den Hund gefunden.
Das Problem war anscheinend meine Funktion display_int_hex, welche den
integer in einen string umwandelt und ausgibt:
1
voiddisplay_int_hex(unsignedinti){
2
charstring[sizeof(i)+1];
3
itoa(i,string,16);
4
display_string(string);
5
}
Natürlich ist das ganze mit dem "sizeof(i)+1" Unsinn.
Keine Ahnung, wie ich auf das kam, aber bis jetzt hat es nie Probleme
gegeben.
Korrekt heisst es:
1
voiddisplay_int_hex(unsignedinti){
2
charstring[6];//max on int (16bit) is FFFF + prefix, so use 6
3
itoa(i,string,16);
4
display_string(string);
5
}
Mir unerklärlich ist aber trotzdem, wieso es nur auftritt, wenn ich
pgm_read_word verwende. Ich vermute mal, das durch glückliche Umstände
jeweils ein Stringterminator an der richtigen Stelle im ungenutzten RAM
stand.