Forum: Mikrocontroller und Digitale Elektronik großes Programm funktioniert nicht


von Hebel Zieher (Gast)


Lesenswert?

Hi,

Ich habe ein Problem mit meinem Programm.

µC: PIC 18F4523
Programmsprache: C
compiler: MPLAB C18

Ich habe mir eine 6x6x6 LED Cube gebaut welche auch Funktionstüchtig ist 
(http://www.youtube.com/watch?v=_YT1HWFXGgo).
Mein Programm bestet im prenzip aus einer Rendern funktion welche einen 
Array auswertet. In diesen Array stehn die Bildinformationen.

So nun zum eigentlichem Problem:
Solange das Programm klein bleibt (Laut MPLAB 2700 Zeilen bzw laut 
Memory Usage Gauge: 4036 von 16384 Words) geht alles Wunderbar. Sobalt 
das Programm aber über eine gewisse Größe (solte bei 4000-4500 words 
leigen) geht, steigt das Programm quasi aus. Die Leds machen was sie 
wollen, der µC macht meiner meinung garnichts mehr.



Code (hauptprogramm):
1
/** I N C L U D E S **********************************************************/
2
#include <p18cxxx.h>
3
#include "delays.h"    // für die Warteschleife
4
//#include "stdlib.h"
5
6
/** Configuration ********************************************************/
7
#pragma config OSC = HS   //CPU=14.7456 MHz
8
#pragma config PWRT = OFF
9
//#pragma config BOR = OFF
10
#pragma config WDT = OFF  //Watchdog Timer
11
#pragma config LVP = OFF  //Low Voltage ICSP
12
//#pragma config STVREN = OFF  //Steck Full/underflow reset
13
 
14
15
/** Genutzte PORTS des PICs ***********************************************
16
17
PORTA:  A0 - S_Latch 1 AN
18
    A1 - S_Latch 2 AN
19
    A2 - S_Latch 3 AN
20
21
PORTB  B0 - S_Latch LED 1
22
    B1 - S_Latch LED 2
23
    B2 - S_Latch LED 3
24
    B3 - S_Latch LED 4
25
    B4 - S_Latch LED 5
26
    B0 - S_Latch LED 6
27
28
PORTC  C0 - E_Latch Ebene 1
29
    C1 - E_Latch Ebene 2
30
    C2 - E_Latch Ebene 3
31
    C3 - E_Latch Ebene 4
32
    C4 - E_Latch Ebene 5
33
    C5 - E_Latch Ebene 6
34
    C6 - TX MAX232
35
    C7 - RX MAX232
36
37
PORTD  D0 - E_Latch 1 AN
38
    D1 - E_Latch 2 AN
39
40
*/
41
42
43
44
#pragma code
45
  unsigned char LED[37]; 
46
47
  unsigned char s, e, x, i;
48
  unsigned int time, t;
49
50
// Init()
51
// Stellt die Ein/Ausgänge ein
52
// Schaltet alle Ausgänge auf 0
53
54
void init(void) {
55
  
56
  LATB  = 0x00;    //Setzt alle seulen auf 0
57
  TRISB  = 0x00;    //Stellt Port B auf Output
58
  
59
//  LATA  = 0x00;    //Setzt alle Seulen Latches auf 0
60
  TRISA  = 0x00;    //Stellt PORT A auf Output
61
  LATA  = 0xFF;    //Setzt alle Seulen Latches auf 1 um sie zu leeren
62
63
  LATC  = 0x00;    //Setzt alle Ebenen auf 0
64
  TRISC  = 0x00;    //Stellt PORT C auf Output
65
66
//  LATD  = 0x00;    //Setzt alle Ebenen Latches auf 0
67
  TRISD  = 0x00;    //Stellt Port D auf Output
68
  LATD  = 0xFF;    //Setzt alle Ebene Latches auf 1 um sie zu leeren
69
70
  Delay1TCY();    //Wartet kurz um sicherzu gehn das wirklich alle Signale gelöscht wurden
71
  
72
  LATA  = 0x00;    //Schaltet die Seulen Latches ab
73
  LATD  = 0x00;    //Schaltet die Ebenen Latches ab
74
75
//Konstanten *****************************************************************
76
77
#define  Seule_1   LATBbits.LATB0    //Seule 1      
78
#define  Seule_2   LATBbits.LATB1    //Seule 2
79
#define  Seule_3   LATBbits.LATB2    //Seule 3
80
#define  Seule_4   LATBbits.LATB3    //Seule 4
81
#define  Seule_5   LATBbits.LATB4    //Seule 5
82
#define  Seule_6   LATBbits.LATB5    //Seule 6
83
84
#define  S_Latch_1 LATAbits.LATA0    //Seulen Latch für Seule 1-6   & 19-24  
85
#define  S_Latch_2 LATAbits.LATA1    //Seulen Latch für Seule 7-12  & 25-30
86
#define  S_Latch_3 LATAbits.LATA2    //Seulen Latch für Seule 13-18 & 31-36
87
88
#define  Ebene_1   LATCbits.LATC0    //Ebene 1
89
#define  Ebene_2   LATCbits.LATC1    //Ebene 2
90
#define  Ebene_3   LATCbits.LATC2    //Ebene 3
91
#define  Ebene_4   LATCbits.LATC3    //Ebene 4
92
#define  Ebene_5   LATCbits.LATC4    //Ebene 5
93
#define  Ebene_6   LATCbits.LATC5    //Ebene 6
94
95
#define  E_Latch_1 LATDbits.LATD0    //Ebenen Latch vorne
96
#define  E_Latch_2 LATDbits.LATD1    //Ebenen Latch hinten
97
//*****************************************************************************
98
}//Init() ENDE
99
100
101
102
//Löscht alle LED Signale
103
void clear_all(void) {
104
  LATB  = 0x00;    //Seulen Bus auf 0
105
  LATC  = 0x00;    //Ebenen Bus auf 0
106
  LATA  = 0xFF;    //Seulen Löschen
107
  LATD  = 0xFF;    //Ebenen Löschen
108
  
109
  Delay1TCY();    //Wartet kurz um sicherzu gehn das wirklich alle Signale gelöscht wurden
110
  
111
  LATA  = 0x00;    //Schaltet die Seulen Latches ab
112
  LATD  = 0x00;    //Schaltet die Ebenen Latches ab
113
}//clear_all() ENDE
114
115
116
// 1 durchlauf entspricht 1/370s
117
void Rendern(unsigned char LED[37]) {
118
  
119
  clear_all();      //Resettet alle Signale
120
121
  //unsigned char s, e, x, i;
122
123
  for (e=0; e<12; e++) {        // 12 druchgänge für die 12 Ebenen
124
    for (s=1; s<4; s++) {      //  3 durchgänge für die  3 Seulen 
125
      //Schaltet die Seulen Latches ab
126
      S_Latch_1 = 0;    
127
      S_Latch_2 = 0;
128
         S_Latch_3 = 0;
129
130
      x = e*3+s;          //Errechnet welche index im Array benutzt werden soll
131
      LATB = LED[x];
132
      switch (s) {        //Switch: Schaltet je nach dem welche Seulen beutzt werden die entsprechende durch
133
        case 1:          //Die vorder Reihe
134
             S_Latch_1 = 1;
135
          break;
136
        case 2:          //Die mittlere Reihe
137
             S_Latch_2 = 1;
138
          break;
139
        case 3:          //Die hintere Reihe
140
             S_Latch_3 = 1;
141
          break;
142
      }//Switch S ENDE
143
    }//Seulen schleife ENDE (3 durchläufe)
144
    
145
146
    switch (e) {
147
      case 0:
148
        Ebene_1 = 1;    //Ebenen BUS
149
        E_Latch_1 = 1;    //Ebenen Latch AN/AUS
150
          break;
151
      case 1:
152
        Ebene_2 = 1;    //Ebenen BUS
153
         E_Latch_1 = 1;    //Ebenen Latch AN/AUS
154
          break;
155
      case 2:
156
        Ebene_3 = 1;    //Ebenen BUS
157
         E_Latch_1 = 1;    //Ebenen Latch AN/AUS
158
          break;
159
      case 3:
160
        Ebene_4  = 1;    //Ebenen BUS
161
         E_Latch_1 = 1;    //Ebenen Latch AN/AUS
162
          break;
163
      case 4:
164
        Ebene_5 = 1;    //Ebenen BUS
165
         E_Latch_1 = 1;    //Ebenen Latch AN/AUS
166
          break;
167
      case 5:
168
        Ebene_6 = 1;    //Ebenen BUS
169
         E_Latch_1 = 1;    //Ebenen Latch AN/AUS
170
          break;
171
      case 6:
172
        Ebene_1 = 1;    //Ebenen BUS
173
        E_Latch_2 = 1;    //Ebenen Latch AN/AUS
174
          break;
175
      case 7:
176
        Ebene_2 = 1;    //Ebenen BUS
177
        E_Latch_2 = 1;    //Ebenen Latch AN/AUS
178
          break;
179
      case 8:
180
        Ebene_3 = 1;    //Ebenen BUS
181
        E_Latch_2 = 1;    //Ebenen Latch AN/AUS
182
          break;
183
      case 9:
184
        Ebene_4 = 1;    //Ebenen BUS
185
        E_Latch_2 = 1;    //Ebenen Latch AN/AUS
186
          break;
187
      case 10:
188
        Ebene_5 = 1;    //Ebenen BUS
189
        E_Latch_2 = 1;    //Ebenen Latch AN/AUS
190
          break;
191
      case 11:
192
        Ebene_6 = 1;    //Ebenen BUS
193
        E_Latch_2 = 1;    //Ebenen Latch AN/AUS
194
          break;
195
    }//Switch E ENDE
196
    
197
    //Bildanzeige dauer (ebene dauer 20µS
198
    for (i=0; i<75; i++) {
199
          Delay1TCY();
200
    }
201
  clear_all();      //Resettet alle Signale  
202
  }//Ebene Schleife ENDE (12 durchläufe
203
204
//clear_all();      //Resettet alle Signale  
205
return;
206
}//end Rendern
207
208
209
//Bild datein
210
#include "Muster/schlange.inc"  
211
212
void main(void)
213
{
214
215
  init();    //Stellt alle Ports ein und Löscht die ausgänge
216
217
218
219
//Programm schleife mit den Bilddatein
220
while(1){
221
222
223
224
225
schlange();    //Muster aus den Bilddatein
226
227
228
}
229
}//end main

Code Bildinhalt (ausschnitt):
1
void schlange(void) {
2
3
4
time = 50; // 0,13sec
5
  //Bild
6
  //Seulen vorne
7
  LED[1]  = 0x0;  //ebene 1
8
  LED[2]  = 0x0;
9
  LED[3]  = 0x0;
10
  LED[4]  = 0x0;  //Ebene 2
11
  LED[5]  = 0x0;
12
  LED[6]  = 0x0;
13
  LED[7]  = 0x0;  //Ebene 3
14
  LED[8]  = 0x0;
15
  LED[9]  = 0x0;
16
  LED[10]  = 0x0;  //Ebene 4
17
  LED[11]  = 0x0;
18
  LED[12]  = 0x0;
19
  LED[13]  = 0x0;  //Ebene 5
20
  LED[14]  = 0x0;
21
  LED[15]  = 0x0;
22
  LED[16]  = 0x1;  //Ebene 6
23
  LED[17]  = 0x0;
24
  LED[18]  = 0x0;
25
26
  //Seulen hinten
27
  LED[19]  = 0x0;  //Ebene 1
28
  LED[20]  = 0x0;
29
  LED[21]  = 0x0;
30
  LED[22]  = 0x0;  //Ebene 2
31
  LED[23]  = 0x0;
32
  LED[24]  = 0x0;
33
  LED[25]  = 0x0;  //Ebene 3
34
  LED[26]  = 0x0;
35
  LED[27]  = 0x0;
36
  LED[28]  = 0x0;  //Ebene 4
37
  LED[29]  = 0x0;
38
  LED[30]  = 0x0;
39
  LED[31]  = 0x0;  //Ebene 5
40
  LED[32]  = 0x0;
41
  LED[33]  = 0x0;
42
  LED[34]  = 0x0;  //Ebene 6
43
  LED[35]  = 0x0;
44
  LED[36]  = 0x0;
45
46
  for (t=0; t<time; t++) {
47
  Rendern(LED);
48
  }
49
  
50
51
  //Bild
52
  //Seulen vorne
53
  LED[1]  = 0x0;  //ebene 1
54
  LED[2]  = 0x0;
55
  LED[3]  = 0x0;
56
  LED[4]  = 0x0;  //Ebene 2
57
  LED[5]  = 0x0;
58
  LED[6]  = 0x0;
59
  LED[7]  = 0x0;  //Ebene 3
60
  LED[8]  = 0x0;
61
  LED[9]  = 0x0;
62
  LED[10]  = 0x0;  //Ebene 4
63
  .
64
        .
65
        .
66
//Der code wiederholt sich ab hier immer wieder mit anderen werten für die Arrays
67
//bis ca zeile 2500 läuft das alles hier problemlos ab zeile 2500-3000 leider nicht mehr

Da ich ein Anfänger bin was C-Programierung und µC allgemein angeht 
hoffe ich das ihr mir helfen könnt.
Bis ez ist mir nur der gedanke gekommen das die vielen Arrays probleme 
machen.

vielen Dank im vorraus
Der Hebel Zieher

von Christian H. (christian_h)


Lesenswert?

Wie kompilierst du denn?  Und du bist dir auch ganz sicher, dass das 
Endprodukt noch auf den Chip passt?

von Hebel Zieher (Gast)


Lesenswert?

Christian H. schrieb:
> Wie kompilierst du denn?  Und du bist dir auch ganz sicher, dass das
> Endprodukt noch auf den Chip passt?

Ich kompiliere über MPLAB mit dem c18 Compiler, hier is mal noch der 
Build bericht:
1
Executing: "C:\Program Files (x86)\Microchip\mplabc18\v3.38\bin\mcc18.exe" -p=18F4523 "main.c" -fo="main.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
2
MPLAB C18 v3.38 (evaluation)
3
Copyright 2000-2011 Microchip Technology Inc.
4
Days remaining until evaluation becomes feature limited:  54
5
Executing: "C:\Program Files (x86)\Microchip\mplabc18\v3.38\bin\mplink.exe" /p18F4523 /l"C:\Program Files (x86)\Microchip\mplabc18\v3.38\lib" "C:\Program Files (x86)\Microchip\mplabc18\v3.38\bin\LKR\18f4523_g.lkr" "main.o" /u_CRUNTIME /z__MPLAB_BUILD=1 /m"Led Cube 6³.map" /w /o"Led Cube 6³.cof"
6
MPLINK 4.39, Linker
7
Device Database Version 1.1
8
Copyright (c) 1998-2011 Microchip Technology Inc.
9
Errors    : 0
10
11
MP2HEX 4.39, COFF to HEX File Converter
12
Copyright (c) 1998-2011 Microchip Technology Inc.
13
Errors    : 0
14
15
Loaded L:\LED Cube 6x6x6\Pic prog\Led Cube 6³.cof.

Wegen der größe des programms ich bin mir absolut sicher das es nicht zu 
groß ist.
MPLAB sag das nur 4000 von 16 000 Words belegt sind und wenn ich mir die 
HEX file anschaue sind da auch mehr wie genug adressen frei.

von Lehrmann M. (ubimbo)


Lesenswert?

Schau dir doch mal die Simulation an, ob da die LATx die von dir 
gewünschten Werte annimmt.

Dem Compiler-Report entnehme ich, dass du ein Evaluationsversion von C18 
hast. Richtig? Kein gecracktes Programm ?! ....

Hebel Zieher schrieb:
> Die Leds machen was sie
> wollen, der µC macht meiner meinung garnichts mehr.

Erzähl mal mehr über deine Schaltung.

Könnte es sein, dass deine Stromversorgung nicht ausreichend ist?

Außerdem solltest du deine orthographischen Fähigkeiten mal überdenken. 
Säule nicht Seule, Prinzip nicht prenzip, Adjektive beginnen mit 
Kleinbuchstaben, Nomen immer mit Großbuchstaben. Ich sag das nicht um 
dich zu ärgern od. zu demütigen, sondern das hat auch viel mit 
Programmierkunst zu tun. Gerade wenn man sich für C entscheidet 
(zugegeben es gibt außer Assembler keine Alternative), dann muss man auf 
Präzision achten, ansonsten verrennt man sich gerade bei größeren 
Programmen verdammt schnell. Ganz nebenbei ist es recht peinlich, dass 
man in seinem Programmcode mit grausamer Konsequenz 'Seule' und nicht 
'Säule' schreibt.

von holger (Gast)


Lesenswert?

>Ganz nebenbei ist es recht peinlich, dass
>man in seinem Programmcode mit grausamer Konsequenz 'Seule' und nicht
>'Säule' schreibt.

Ob der Compiler das 'ä' im define wohl mag?
Ich glaube nicht.
Du bist echt nen Bimbo;)

von M. J. (manfred-64)


Lesenswert?

mal so ne frage neben bei,
ich programmiere nur (aäöo... bisher) in Assembler!?
ist das obige Programm in C wirklich als "Groß" zu bezeichnen???
in Assembler is das eher als "Popelig" zu bezeichnen!

von Purzel H. (hacky)


Lesenswert?

>ist das obige Programm in C wirklich als "Groß" zu bezeichnen???

Natuerlich nicht. Das obige Programm ist pipifax

von P. S. (Gast)


Lesenswert?

Manfred John schrieb:

> ist das obige Programm in C wirklich als "Groß" zu bezeichnen???

Noe.

> in Assembler is das eher als "Popelig" zu bezeichnen!

In C auch.

von M. J. (manfred-64)


Lesenswert?

Peter Stegemann schrieb:
> Manfred John schrieb:
>
>> ist das obige Programm in C wirklich als "Groß" zu bezeichnen???
>
> Noe.
>
>> in Assembler is das eher als "Popelig" zu bezeichnen!
>
> In C auch.

wie beruhigend :)

da werd' ich mir doch mal ANSI-C und ??? µC-C reinzien (µC-C???)
oda was is für PIC's für lau zu bekommen is. (nur für "kleine Projekte")
(und wenn ich nur im "Notfall" nur Fix-Point-Operationen verwende)
hab mom nur mir 16F... zu tun
was wäre da zu empfehlen (da mach ich noch'n gesonderten Thread auf, 
wenn ich sonst nix finde)

von Hebel Zieher (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> Schau dir doch mal die Simulation an, ob da die LATx die von dir
> gewünschten Werte annimmt.

Werde ich morgen mal angehn.


Lehrmann Michael schrieb:
> Erzähl mal mehr über deine Schaltung.
>
> Könnte es sein, dass deine Stromversorgung nicht ausreichend ist?

Alle ICs sind mit Kondensatoren gepuffert außerdem läuft das 
Programm/Hardware einwandfrei bis zu einer gewissen Programmgröße.

Mein Programm besteht wie gesagt aus 2 Teilen:
1. Das 'kleine' Hauptprogramm (ca 200 Zeilen lecherlich ich weiß)
2. Der Bildinformation (groß)- Ich benötige bei meinem jetzigen 
Programmaufbau einen Array mit 36 6-bit informationen pro Bild, welches 
angezeit werden soll. Diesen Code lasse ich mir mit einem 
HTML/PHP-Ürogramm erzeugen. Wird dieser Code nun zulang (ab ca 4250 von 
16000 words) steigt das programm aus.

Das ich irgendwo ein tipfehler gemacht habe ist ausgeschlossen da  der 
Code ja erzeugt wurde.


Noch ein Hinweiß zum fehlerablauf:
Solange das Programm wie besagt unter 4250 words bleibt startet es ganz 
normal, die I/O-Pins werden als Ausgänge gesetzt und das Programm läuft 
die Bildinformationen ab.
Überschreite ich jezt die tolle 4250er Marke, macht der PIC einfach 
garnichts mehr keine I/O-Pin belegung einfach garnichts, es wäre als 
würde ich einen leeren PIC in den sockel stecken (habe den PIC 
ausgelesen er ist beschrieben).

Mir kommt das einfach Spanisch vor wenn alles geht und eine Zeile Code 
alles futsch macht.

mfg Hebel Zieher

von Purzel H. (hacky)


Lesenswert?

Das Bild ist im flash ? Hat's denn ueberhaupt Platz ? Aendert der 
zugriff ?

von Julian B. (julinho)


Lesenswert?

Reicht der RAM aus?

von Peter D. (peda)


Lesenswert?

Hebel Zieher schrieb:
> unsigned char LED[37];

Hebel Zieher schrieb:
> void Rendern(unsigned char LED[37]) {

Auch wenn es prinzipiell nicht verboten ist, man nennt globale und 
lokale Variablen nicht gleich.
Die lokale Definition versteckt die globale.

Und Großschreibung interpretiert der erfahrene Programmierer nicht als 
Variable, sondern als Macro.


Peter

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.