Forum: Mikrocontroller und Digitale Elektronik Codegröße im Mega8 überschritten?


von Oliver S. (os252)


Lesenswert?

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
struct code_entry {
2
  unsigned char remote_protocol;
3
  unsigned char remote_command;
4
  uchar hid_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

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

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.

von User (Gast)


Lesenswert?

Da kann doch noch ein const 'rein.

von xfr (Gast)


Lesenswert?

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 ...

von Oliver S. (os252)


Angehängte Dateien:

Lesenswert?

Hallo

hier sind mal alle Quellcode Dateien.
Die struct steht in der "infrahid.c".

Vielen Dank für die Mühe!

MfG
Olli

von troll (Gast)


Lesenswert?

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.

von troll (Gast)


Lesenswert?

troll schrieb:
>  um die Generierung von C-Code zu
> vereinfachen.
oder die Formatierung des Quellcodes wie der K&R sagt...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Nimm mal die letzte Zeile raus und lass dir von dieser Funktion den 
freien RAM im Betrieb ausgeben:
http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc#Dynamischer_RAM-Verbrauch

von Ralf G. (ralg)


Lesenswert?

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.

von xfr (Gast)


Lesenswert?

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 ...

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
Noch kein Account? Hier anmelden.