Hallo,
ich habe mir aus einem USB Modul von der V-USB Seite und dem IRMP
Programm von hier einen IR Empfänger gebaut, der meine
Fernbedienungssignale auf den USB Port schreibt.
Für die Umsetzung von Fernbedienungssignalen zu USB Codes habe ich eine
Zuordnungstabelle erzeugt, die ich nun komplettieren wollte.
Nun habe ich nach und nach Codes eingefügt und zwischendurch immer
wieder getestet. Ab einer ganz bestimmten Größe meiner Tabelle wird der
Mikrocontroller nicht mehr am USB Port erkannt und auch ansonsten ist
der Controller nicht am laufen.
Ich glaube, dass im Controller irgendein Speicherbereich voll ist und
der Controller falsche Programmadressen bekommt.
Aber das AVR Studio sagt mir für den Mega8:
1
Program Memory Usage : 4662 bytes 56,9 % Full
2
Data Memory Usage : 193 bytes 18,8 % Full
Von daher dachte ich, dass ich noch ausreichend Platz auf dem Controller
habe.
Ich denke nicht, dass es etwas hilft, aber so sieht die struct aus, in
der ich die Codes eintrage:
1
structcode_entry{
2
unsignedcharremote_protocol;
3
unsignedcharremote_command;
4
ucharhid_code;
5
}code_map[]={
6
{0x02,0x54,30},/* 1 */
7
{0x02,0x55,31},/* 2 */
8
{0x02,0x56,32},/* 3 */
9
{0x02,0x57,33},/* 4 */
10
{0x02,0x58,34},/* 5 */
11
{0x02,0x59,35},/* 6 */
12
{0x02,0x5A,36},/* 7 */
13
{0x02,0x5B,37},/* 8 */
14
{0x02,0x5C,38},/* 9 */
15
{0x02,0x5D,39},/* 0 */
16
17
{0x20,0x00,0xf0},
18
{0x20,0x01,0xf1},
19
{0x20,0x02,0xf2},
20
{0x20,0x03,0xf3},
21
{0x20,0x04,0xf4},
22
{0x20,0x05,0xf5},
23
{0x20,0x06,0xf6},
24
{0x20,0x07,0xf7},
25
{0x20,0x08,0xf8},
26
{0x20,0x09,0xf9},
27
{0x20,0x0A,0xfa},
28
{0x20,0x0B,0xfb},
29
{0x20,0x0C,0xfc},
30
{0x20,0x0D,0xfd},
31
{0x21,0x4E,0xfe},
32
{0x22,0x2F,0xf4},
33
};
In diesem Teil kann ich den letzten Eintag auskommentieren, dann läuft
der Prozessor. Wenn er einkommentiert ist, geht gar nichts.
Ich hoffe, ihr könnt mir einen Tip geben was hier faul ist und vor
allem, wie ich dagegen vorgehen kann.
MfG
Olli
Die letzte Element des Arrays braucht kein nachfolgendes Komma.
Ob dies der Fehler ist kann ich dir nicht sagen, da müsste man besser
den kompletten Quelltext sehen. Am bessten als ZIP-Archiv anhängen.
Du kannst auf jeden Fall RAM sparen, indem Du die Tabelle in den Flash
legst (Stichwort PROGMEM). Das behebt aber nicht die Ursache des
Problems.
Eventuell packst Du in einer Funktion noch sehr große Daten auf dem
Stack, so dass der Speicher nicht reicht. Das siehst Du in der
Größenanzeige von AVR Studio nicht. Da müsstest Du mal den ganzen Code
posten oder selber danach schauen, ob Du in Funktionen Arrays
definierst, sie rekursiv aufrufst etc..
Es kann natürlich auch sein, dass Du irgendwo anders im Programm von
einer falschen Speicheradresse liest. Solange Dein Array klein genug
ist, steht da z.B. 0 und es passiert nichts und erst mit dem Array kommt
an die Stelle ein anderer Wert. Das ist dann schwer zu finden ...
M. K. schrieb:> Die letzte Element des Arrays braucht kein nachfolgendes Komma.> Ob dies der Fehler ist kann ich dir nicht sagen
bestimmt nicht. Auch nach dem letzten Element darf ein Komma kommen,
das wurde absichtlich mal so festgelegt um die Generierung von C-Code zu
vereinfachen.
K&R Seite 218 A8.7
>A list may end with a comma, a nicety for neat formatting.
Oliver S. schrieb:> hier sind mal alle Quellcode Dateien.
Ich kann mir nicht vorstellen, dass so ein paar Abfragen mit
'code_map[]' (ausschließlich in der'infrahid.c'!) so einen Fehler
verursachen. Die zusammengebastelten Original-Dateien werden schon
funktionieren. Sieh mal an den Stellen nach, die du selber gemacht hast.
Mal ein paar Ideen:
1. Versuch mal, die Struktur zu vergrößern, also noch ein Feld "char
dummy" hinzuzufügen. Entsteht der Fehler dann schon bei weniger
Einträgen? Dann hast Du wirklich ein Speicherproblem.
2. Du kannst Deinen Code erheblich übersichtlicher machen, wenn Du die
beiden Bytes, die Du in inputBuffer2 schreibst, mit in die code_map
aufnimmst. Dann kannst Du Dir das riesige if-else-if-Statement sparen.
3. Der auskommentierte Original-Code lag schon im Flash (mit PROGMEM).
Warum hast Du das geändert? Das bietet sich auch für Deine Tabelle an.
Aber nicht vergessen, die Daten dann mit pgm_read_byte() zu lesen.
Wahrscheinlich erledigt sich damit auch Dein Problem, allerdings ohne
dass Du den eigentlichen Fehler behoben hast. Aber vielleicht findest Du
ihn ja dann beim Testen, oder er bleibt für immer verborgen ...