Forum: Mikrocontroller und Digitale Elektronik seltsames Phänomen Ausgabe auf LCD HD44780


von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

folgendes Problem: Ich möchte mehrere Anweisungen auf einem LCD (2x40 
Zeichen) über einen ATmega32 ausgeben. Die Anweisungen sollen 
hintereinander durch drücken eines Tasters, der am µC angeschlossen ist, 
aufgerufen werden. Mit einem weiteren Taster kann man eine Anweisung 
zurück gehen. Insgesamt habe ich 28 Anweisungen. Das Problem besteht nun 
darin, dass die ersten 5 Anweisungen nicht auf dem Display angezeigt 
werden. Erst wenn der Taster 6 mal gedrückt wurde erscheint Anweisung 6. 
Programmiere ich den µC allerdings für nur insgesamt 20 Anweisungen oder 
weniger funktioniert es einwandfrei. Hat jemand eine Idee? Zur 
Ansteuerung des Displays verwende ich die Library von Peter Fleury und 
zur Tastenentprellung das Debounce-Makro von Peter Dannegger auf der 
Artikelseite. Hier der Code:
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <stdio.h>
4
#include <stdint.h>
5
#include <string.h>
6
#include <debounce.h>
7
#include <util/delay.h>
8
#include <avr/interrupt.h>
9
#include <lcd.c>
10
#include <lcd.h>
11
12
unsigned char step = 0;                      // Schrittvariable
13
14
15
void next_instruction(void)                  // Funktion für den nächsten Schritt
16
  {
17
    switch (step) 
18
    {   
19
      case 0: 
20
        lcd_gotoxy(0,0);
21
        lcd_puts ("Anweisung 1                             ");
22
        lcd_gotoxy(0,1);
23
        lcd_puts ("Anweisung 1                        01/28");
24
          step = 1; 
25
        break;
26
        
27
      case 1:
28
        lcd_gotoxy(0,0);
29
        lcd_puts ("Anweisung 2                             ");
30
        lcd_gotoxy(0,1);
31
        lcd_puts ("Anweisung 2                        02/28");
32
            step = 2; 
33
        break;
34
      
35
      case 2:
36
        lcd_gotoxy(0,0);
37
        lcd_puts ("Anweisung 3                             ");
38
        lcd_gotoxy(0,1);
39
        lcd_puts ("Anweisung 3                        03/28");
40
          step = 3; 
41
        break;
42
        
43
      case 3:
44
        lcd_gotoxy(0,0);
45
        lcd_puts ("Anweisung 4                             ");
46
        lcd_gotoxy(0,1);
47
        lcd_puts ("Anweisung 4                        04/28");
48
        step = 4; 
49
        break;
50
        
51
        
52
      case 4: 
53
        lcd_gotoxy(0,0);
54
        lcd_puts ("Anweisung 5                             ");
55
        lcd_gotoxy(0,1);
56
        lcd_puts ("Anweisung 5                        05/28");
57
        step = 5; 
58
        break;
59
        
60
      case 5:  
61
        lcd_gotoxy(0,0);
62
        lcd_puts ("Anweisung 6                             ");
63
        lcd_gotoxy(0,1);
64
        lcd_puts ("Anweisung 6                        06/28");
65
        step = 6; 
66
        break;
67
        
68
      case 6:
69
        lcd_gotoxy(0,0);
70
        lcd_puts ("Anweisung 7                             ");
71
        lcd_gotoxy(0,1);
72
        lcd_puts ("Anweisung 7                        07/28");
73
        step = 7; 
74
        break;
75
        
76
      case 7:
77
        lcd_gotoxy(0,0);
78
        lcd_puts ("Anweisung 8                             ");
79
        lcd_gotoxy(0,1);
80
        lcd_puts ("Anweisung 8                        08/28");
81
        step = 8; 
82
        break;
83
        
84
      case 8:
85
        lcd_gotoxy(0,0);
86
        lcd_puts ("Anweisung 9                             ");
87
        lcd_gotoxy(0,1);
88
        lcd_puts ("Anweisung 9                        09/28");
89
        step = 9; 
90
        break;
91
        
92
      case 9:
93
        lcd_gotoxy(0,0);
94
        lcd_puts ("Anweisung 10                            ");
95
        lcd_gotoxy(0,1);
96
        lcd_puts ("Anweisung 10                       10/28");
97
        step = 10; 
98
        break;
99
        
100
      case 10:
101
        lcd_gotoxy(0,0);
102
        lcd_puts ("Anweisung 11                            ");
103
        lcd_gotoxy(0,1);
104
        lcd_puts ("Anweisung 11                       11/28");
105
        step = 11; 
106
        break;
107
        
108
      case 11:
109
        lcd_gotoxy(0,0);
110
        lcd_puts ("Anweisung 12                            ");
111
        lcd_gotoxy(0,1);
112
        lcd_puts ("Anweisung 12                       12/28");
113
        step = 12; 
114
        break;
115
        
116
      case 12:
117
        lcd_gotoxy(0,0);
118
        lcd_puts ("Anweisung 13                            ");
119
        lcd_gotoxy(0,1);
120
        lcd_puts ("Anweisung 13                       13/28");
121
        step = 13; 
122
        break;
123
        
124
      case 13:
125
        lcd_gotoxy(0,0);
126
        lcd_puts ("Anweisung 14                            ");
127
        lcd_gotoxy(0,1);
128
        lcd_puts ("Anweisung 14                       14/28");
129
        step = 14; 
130
        break;
131
        
132
      case 14:
133
        lcd_gotoxy(0,0);
134
        lcd_puts ("Anweisung 15                            ");
135
        lcd_gotoxy(0,1);
136
        lcd_puts ("Anweisung 15                       15/28");
137
        step = 15; 
138
        break;
139
        
140
      case 15:
141
        lcd_gotoxy(0,0);
142
        lcd_puts ("Anweisung 16                            ");
143
        lcd_gotoxy(0,1);
144
        lcd_puts ("Anweisung 16                       16/28");
145
        step = 16; 
146
        break;
147
        
148
      case 16:
149
        lcd_gotoxy(0,0);
150
        lcd_puts ("Anweisung 17                            ");
151
        lcd_gotoxy(0,1);
152
        lcd_puts ("Anweisung 17                       17/28");
153
        step = 17; 
154
        break;
155
      
156
      case 17:
157
        lcd_gotoxy(0,0);
158
        lcd_puts ("Anweisung 18                            ");
159
        lcd_gotoxy(0,1);
160
        lcd_puts ("Anweisung 18                       18/28");
161
        step = 18; 
162
        break;
163
164
      case 18:
165
        lcd_gotoxy(0,0);
166
        lcd_puts ("Anweisung 19                            ");
167
        lcd_gotoxy(0,1);
168
        lcd_puts ("Anweisung 19                       19/28");
169
        step = 19; 
170
        break;
171
      
172
      case 19:
173
        lcd_gotoxy(0,0);
174
        lcd_puts ("Anweisung 20                            ");
175
        lcd_gotoxy(0,1);
176
        lcd_puts ("Anweisung 20                       20/28");
177
        step = 20; 
178
        break;
179
180
      case 20:
181
        lcd_gotoxy(0,0);
182
        lcd_puts ("Anweisung 21                            ");
183
        lcd_gotoxy(0,1);
184
        lcd_puts ("Anweisung 21                       21/28");
185
        step = 21; 
186
        break;
187
188
      case 21:
189
        lcd_gotoxy(0,0);
190
        lcd_puts ("Anweisung 22                            ");
191
        lcd_gotoxy(0,1);
192
        lcd_puts ("Anweisung 22                       22/28");
193
        step = 22; 
194
        break;
195
196
      case 22:
197
        lcd_gotoxy(0,0);
198
        lcd_puts ("Anweisung 23                            ");
199
        lcd_gotoxy(0,1);
200
        lcd_puts ("Anweisung 23                       23/28");
201
        step = 23; 
202
        break;
203
    
204
      case 23:
205
        lcd_gotoxy(0,0);
206
        lcd_puts ("Anweisung 24                            ");
207
        lcd_gotoxy(0,1);
208
        lcd_puts ("Anweisung 24                       24/28");
209
        step = 24; 
210
        break;
211
212
      case 24:
213
        lcd_gotoxy(0,0);
214
        lcd_puts ("Anweisung 25                            ");
215
        lcd_gotoxy(0,1);
216
        lcd_puts ("Anweisung 25                       25/28");
217
        step = 25; 
218
        break;
219
220
      case 25:
221
        lcd_gotoxy(0,0);
222
        lcd_puts ("Anweisung 26                            ");
223
        lcd_gotoxy(0,1);
224
        lcd_puts ("Anweisung 26                       26/28");
225
        step = 26; 
226
        break;
227
228
      case 26:
229
        lcd_gotoxy(0,0);
230
        lcd_puts ("Anweisung 27                            ");
231
        lcd_gotoxy(0,1);
232
        lcd_puts ("Anweisung 27                       27/28");
233
        step = 27; 
234
        break;
235
236
      case 27:
237
        lcd_gotoxy(0,0);
238
        lcd_puts ("Anweisung 28                            ");
239
        lcd_gotoxy(0,1);
240
        lcd_puts ("Anweisung 28                       28/28");
241
        step = 28; 
242
        break;
243
244
        
245
      default:  break;
246
    }
247
    
248
  }
249
250
251
void previous_instruction(void)                  // Funktion für den vorherigen Schritt
252
  {
253
    switch (step) 
254
    {
255
      case 2: 
256
        lcd_gotoxy(0,0);
257
        lcd_puts ("Anweisung 1                             ");
258
        lcd_gotoxy(0,1);
259
        lcd_puts ("Anweisung 1                        01/28");
260
          step = 1; 
261
        break;
262
        
263
      case 3:
264
        lcd_gotoxy(0,0);
265
        lcd_puts ("Anweisung 2                             ");
266
        lcd_gotoxy(0,1);
267
        lcd_puts ("Anweisung 2                        02/28");
268
            step = 2; 
269
        break;
270
      
271
      case 4:
272
        lcd_gotoxy(0,0);
273
        lcd_puts ("Anweisung 3                             ");
274
        lcd_gotoxy(0,1);
275
        lcd_puts ("Anweisung 3                        03/28");
276
          step = 3; 
277
        break;
278
        
279
      case 5:
280
        lcd_gotoxy(0,0);
281
        lcd_puts ("Anweisung 4                             ");
282
        lcd_gotoxy(0,1);
283
        lcd_puts ("Anweisung 4                        04/28");
284
        step = 4; 
285
        break;
286
        
287
        
288
      case 6: 
289
        lcd_gotoxy(0,0);
290
        lcd_puts ("Anweisung 5                             ");
291
        lcd_gotoxy(0,1);
292
        lcd_puts ("Anweisung 5                        05/28");
293
        step = 5; 
294
        break;
295
        
296
      case 7:  
297
        lcd_gotoxy(0,0);
298
        lcd_puts ("Anweisung 6                             ");
299
        lcd_gotoxy(0,1);
300
        lcd_puts ("Anweisung 6                        06/28");
301
        step = 6; 
302
        break;
303
        
304
      case 8:
305
        lcd_gotoxy(0,0);
306
        lcd_puts ("Anweisung 7                             ");
307
        lcd_gotoxy(0,1);
308
        lcd_puts ("Anweisung 7                        07/28");
309
        step = 7; 
310
        break;
311
        
312
      case 9:
313
        lcd_gotoxy(0,0);
314
        lcd_puts ("Anweisung 8                             ");
315
        lcd_gotoxy(0,1);
316
        lcd_puts ("Anweisung 8                        08/28");
317
        step = 8; 
318
        break;
319
        
320
      case 10:
321
        lcd_gotoxy(0,0);
322
        lcd_puts ("Anweisung 9                             ");
323
        lcd_gotoxy(0,1);
324
        lcd_puts ("Anweisung 9                        09/28");
325
        step = 9; 
326
        break;
327
        
328
      case 11:
329
        lcd_gotoxy(0,0);
330
        lcd_puts ("Anweisung 10                            ");
331
        lcd_gotoxy(0,1);
332
        lcd_puts ("Anweisung 10                       10/28");
333
        step = 10; 
334
        break;
335
        
336
      case 12:
337
        lcd_gotoxy(0,0);
338
        lcd_puts ("Anweisung 11                            ");
339
        lcd_gotoxy(0,1);
340
        lcd_puts ("Anweisung 11                       11/28");
341
        step = 11; 
342
        break;
343
        
344
      case 13:
345
        lcd_gotoxy(0,0);
346
        lcd_puts ("Anweisung 12                            ");
347
        lcd_gotoxy(0,1);
348
        lcd_puts ("Anweisung 12                       12/28");
349
        step = 12; 
350
        break;
351
        
352
      case 14:
353
        lcd_gotoxy(0,0);
354
        lcd_puts ("Anweisung 13                            ");
355
        lcd_gotoxy(0,1);
356
        lcd_puts ("Anweisung 13                       13/28");
357
        step = 13; 
358
        break;
359
        
360
      case 15:
361
        lcd_gotoxy(0,0);
362
        lcd_puts ("Anweisung 14                            ");
363
        lcd_gotoxy(0,1);
364
        lcd_puts ("Anweisung 14                       14/28");
365
        step = 14; 
366
        break;
367
        
368
      case 16:
369
        lcd_gotoxy(0,0);
370
        lcd_puts ("Anweisung 15                            ");
371
        lcd_gotoxy(0,1);
372
        lcd_puts ("Anweisung 15                       15/28");
373
        step = 15; 
374
        break;
375
        
376
      case 17:
377
        lcd_gotoxy(0,0);
378
        lcd_puts ("Anweisung 16                            ");
379
        lcd_gotoxy(0,1);
380
        lcd_puts ("Anweisung 16                       16/28");
381
        step = 16; 
382
        break;
383
        
384
      case 18:
385
        lcd_gotoxy(0,0);
386
        lcd_puts ("Anweisung 17                            ");
387
        lcd_gotoxy(0,1);
388
        lcd_puts ("Anweisung 17                       17/28");
389
        step = 17; 
390
        break;
391
      
392
      case 19:
393
        lcd_gotoxy(0,0);
394
        lcd_puts ("Anweisung 18                            ");
395
        lcd_gotoxy(0,1);
396
        lcd_puts ("Anweisung 18                       18/28");
397
        step = 18; 
398
        break;
399
400
      case 20:
401
        lcd_gotoxy(0,0);
402
        lcd_puts ("Anweisung 19                            ");
403
        lcd_gotoxy(0,1);
404
        lcd_puts ("Anweisung 19                       19/28");
405
        step = 19; 
406
        break;
407
      
408
      case 21:
409
        lcd_gotoxy(0,0);
410
        lcd_puts ("Anweisung 20                            ");
411
        lcd_gotoxy(0,1);
412
        lcd_puts ("Anweisung 20                       20/28");
413
        step = 20; 
414
        break;
415
416
      case 22:
417
        lcd_gotoxy(0,0);
418
        lcd_puts ("Anweisung 21                            ");
419
        lcd_gotoxy(0,1);
420
        lcd_puts ("Anweisung 21                       21/28");
421
        step = 21; 
422
        break;
423
424
      case 23:
425
        lcd_gotoxy(0,0);
426
        lcd_puts ("Anweisung 22                            ");
427
        lcd_gotoxy(0,1);
428
        lcd_puts ("Anweisung 22                       22/28");
429
        step = 22; 
430
        break;
431
432
      case 24:
433
        lcd_gotoxy(0,0);
434
        lcd_puts ("Anweisung 23                            ");
435
        lcd_gotoxy(0,1);
436
        lcd_puts ("Anweisung 23                       23/28");
437
        step = 23; 
438
        break;
439
    
440
      case 25:
441
        lcd_gotoxy(0,0);
442
        lcd_puts ("Anweisung 24                            ");
443
        lcd_gotoxy(0,1);
444
        lcd_puts ("Anweisung 24                       24/28");
445
        step = 24; 
446
        break;
447
448
      case 26:
449
        lcd_gotoxy(0,0);
450
        lcd_puts ("Anweisung 25                            ");
451
        lcd_gotoxy(0,1);
452
        lcd_puts ("Anweisung 25                       25/28");
453
        step = 25; 
454
        break;
455
456
      case 27:
457
        lcd_gotoxy(0,0);
458
        lcd_puts ("Anweisung 26                            ");
459
        lcd_gotoxy(0,1);
460
        lcd_puts ("Anweisung 26                       26/28");
461
        step = 26; 
462
        break;
463
464
      case 28:
465
        lcd_gotoxy(0,0);
466
        lcd_puts ("Anweisung 27                            ");
467
        lcd_gotoxy(0,1);
468
        lcd_puts ("Anweisung 27                       27/28");
469
        step = 27; 
470
        break;
471
472
      case 29:
473
        lcd_gotoxy(0,0);
474
        lcd_puts ("Anweisung 28                            ");
475
        lcd_gotoxy(0,1);
476
        lcd_puts ("Anweisung 28                       28/28");
477
        step = 28; 
478
        break;
479
        
480
      default:  break;
481
    }
482
    
483
  }
484
485
486
487
488
//----------------------------------------------
489
490
int main(void)
491
{
492
  DDRB = 0xFF;                        // PortB als Ausgang schalten
493
  DDRC = 0xFF;                        // PortC als Ausgang schalten
494
  DDRD = 0x00;                        // PortD als Eingang schalten
495
  PORTB = 0x1C;  
496
  PORTC = 0x00;
497
  PORTD = 0x00;                      // interne Pull-ups an PORTD deaktivieren
498
499
  
500
  
501
  lcd_init(LCD_DISP_ON);
502
  lcd_gotoxy(0,0);
503
  lcd_puts ("   ***     PROGRAMMABLAUF XY     ***   ");
504
505
506
507
  
508
  
509
  while(1)                        // Überwachen ob und welcher Taster gedrückt wird
510
  {    
511
    
512
      if( debounce( PIND, PD0 ) )              
513
      {
514
        next_instruction();
515
      }
516
  
517
      if( debounce( PIND, PD1 ) )              
518
      {
519
        previous_instruction();
520
      }
521
    
522
  }   
523
}

Danke

von smatlok (Gast)


Lesenswert?

reiner zufall dasses überhaupt läuft.. initialisiere step in main() und 
lass mal step in der main schleife hoch+runterzählen und übergeb den 
konkreten wert an die funktion als parameter.

von Karl H. (kbuchegg)


Lesenswert?

Und denk mal darüber nach, deine Texte in ein Stringarray zu legen, die 
du mit der step Variablen indizierst. Das ist doch Unmenge an Code für 
nichts, mit massenhaft Textduplikaten.

von Karl H. (kbuchegg)


Lesenswert?

Sind eigentlich deine restlichen Dinge die du bei jedem step machst in 
previous_step bzw next_step immer gleich, d.h. wenn bei next_step der 
step 2 von 1 ausgehend erreicht wird, passiert dann das gleiche, wie 
wenn step 2 von previous_step von der 3 aus erreicht wird?

Wenn ja, dann solltest du unbedingt deine Systematik auf jeden Fall 
ändern. Du hast eine Funktion show_step und das erhöhen bzw. erniedrigen 
ist nicht das Bier dieser Funktion, sondern passiert ausserhalb. Dein 
Gedöns mit PORTB ist, soweit ich das auf die Schnelle gesehen habe, auch 
in allen Fällen gleich nur PORTC wird anders behandelt.

Alles in allen sieht es so aus, als ob man die Funktionalität leicht 
mittels Tabellen und einer Abarbeitungsmaschine (ähnlich einer 
State-maschine) einfach implementieren kann.

Edit:
Nein, eigentlich ist eine State-maschine in einer Tabelle schon ziemlich 
genau der Ansatz um das Programm extrem zu vereinfachen. Es sei denn, da 
kommt noch was dazu, was man jetzt noch nicht absehen kann.

von Falk B. (falk)


Lesenswert?

@Dennis (Gast)

Was soll der Unsinn mit dem ellenlangen Code im Posting? Im Anhang ist 
er prima aufgehoben. Siehe Netiquette!
Und wie bereits gesagt, das macht man mit Arrays und einer 
Statemachine.

MFG
Falk

von Hc Z. (mizch)


Lesenswert?

Du hast Strings mit 40 Zeichen (41 Bytes) Länge.  Je Schritt zeigst Du 2 
davon an, macht 80 Zeichen (82 Bytes).  Pro case hast du 28 Einträge. 
Du hältst die Strings unpassenderweise im initialisierten SRAM, nicht im 
Flash.

Insgesamt hast Du also
1
 2 * 28 * 82 Bytes = 4592 Bytes
 an Strings im SRAM.  Der ATmega32 hat 4kBytes SRAM.  Merkst Du was?

von Mike H. (-scotty-)


Lesenswert?

Nur Gemecker von den Forumshirschen, aber keine Lösung des Problems,
war ja klar. Beantwortet doch mal die Frage des TO. Den Code solltet
ihr doch gar nicht diskutieren. Klar, Profis programmieren das mit
minimalem Aufwand, aber jeder hat mal angefangen und macht das erst
mal umständlich, nur funktionieren sollte es.

von Karl H. (kbuchegg)


Lesenswert?

Mike Hammer schrieb:
> Nur Gemecker von den Forumshirschen, aber keine Lösung des Problems,
> war ja klar. Beantwortet doch mal die Frage des TO.

Die ist längst beantwortet.
Viel zu viel SRAM verbraucht.

> Den Code solltet
> ihr doch gar nicht diskutieren.

Doch.
Mit einer einfacheren SW-Architektur hätte er viel weniger SRAM 
verbraucht.

> Klar, Profis programmieren das mit
> minimalem Aufwand, aber jeder hat mal angefangen und macht das erst
> mal umständlich,

drum sagen wir ihm ja auch, wie man es besser machen kann.

von Dennis (Gast)


Lesenswert?

Um ehrlich zu sein befasse ich mich mit mikrocontrollern sehr selten und 
mache das hier nur nebenbei....deshalb ergeben sich mir ne menge fragen 
auf euere antworten...

smatlok schrieb:
> reiner zufall dasses überhaupt läuft.. initialisiere step in main() und
>
> lass mal step in der main schleife hoch+runterzählen und übergeb den
>
> konkreten wert an die funktion als parameter.


ich dachte man initialisiert globale variablen immer am anfang des 
codes? hab es mal ausprobiert und es erscheint eine fehlermeldung, dass 
der compiler die variable step in der funktion next_step() nicht kennt. 
und ist es nicht wurst ob ich die variable in der mainschleife hochzähle 
oder in der funktion?
ich glaube nicht dass es ein zufall ist dass es mit weniger anweisungen 
klappt.

Falk Brunner schrieb:
> Und wie bereits gesagt, das macht man mit Arrays und einer
>
> Statemachine.

wusste bisher nicht was eine statemachine ist aber nachdem ich mir den 
artikel durchgelesen hab sieht mein programm doch exakt so aus (vgl 
erstes bsp in dem artikel) nur dass meine variable step heist und nicht 
state.

Karl heinz Buchegger schrieb:
> Mit einer einfacheren SW-Architektur hätte er viel weniger SRAM
>
> verbraucht.

und wenn man strings in einem array abspeichert verbraucht man weniger 
speicher als wenn man jeden einzelnen string abspeichert? Warum?



ich will das eigentlich zügig ohne großen aufwand erledigt haben und da 
das eigentliche problem ja der mangelnde platz an sram ist, ist doch das 
abspeichern der strings im flash die schnellste lösung wenn auch nicht 
die eleganteste...

von 900ss (900ss)


Lesenswert?

Dennis schrieb:
> ich dachte man initialisiert globale variablen immer am anfang des
> codes?

Deine Initialisierung funktioniert genauso gut. Lass dir da mal nichts 
einreden.

> wusste bisher nicht was eine statemachine ist aber nachdem ich mir den
> artikel durchgelesen hab sieht mein programm doch exakt so aus (vgl
> erstes bsp in dem artikel) nur dass meine variable step heist und nicht
> state.

Ja, da hast du recht. Verstehe auch nicht warum da der Falk meinte, du 
sollst eine Statemachine bauen. Er hatte wohl eine andere elegantere 
Struktur im Kopf. Aber das von einem Anfänger verlangen/erwarten?

>
> Karl heinz Buchegger schrieb:
>> Mit einer einfacheren SW-Architektur hätte er viel weniger SRAM
>>
>> verbraucht.
>
> und wenn man strings in einem array abspeichert verbraucht man weniger
> speicher als wenn man jeden einzelnen string abspeichert? Warum?

Nein, dass ist natürlich nicht der Fall. Aber du hast elendig viele 
gleiche Anteile in den Strings. Die gleichen Strings könntest du nur 
einmal ablegen und dann mehrere Ausgaben starten für jeden Step. Erst 
den für alle gemeinsamen Text "Anweisung ", dann die Stepnummer und dann 
gotoxy(35,1) und noch die Ausgabe "18/28" oder so. Die vielen 
Leerzeichen brauchst du als String doch garnicht. Der String "Anweisung 
" wäre dann nur einmal da und nicht über 40 mal. Und schon würde auch 
dein SRAM reichen.
z.B.:
1
static char sAnweisung[] = "Anweisung";  // Text "Anweisung " ist so nur einmal vorhanden
2
char buffer[20];
3
4
sprintf(buffer,"%s %2d",sAnweisung, step);  // "Anweisung " + step nummer als String vorbereiten
5
lcd_gotoxy(0,0);
6
lcd_puts(buffer)             // "Anweisung step" ausgeben
7
lcd_gotoxy(0,1);
8
lcd_puts(buffer)
9
sprintf(buffer,"%2d/28",step);  // step/max. Step als String vorbereiten
10
lcd_gotoxy(35,1);
11
lcd_puts(buffer)
12
step = 27;

> ich will das eigentlich zügig ohne großen aufwand erledigt haben und da
> das eigentliche problem ja der mangelnde platz an sram ist, ist doch das
> abspeichern der strings im flash die schnellste lösung wenn auch nicht
> die eleganteste...

Das so zu erledigen geht natürlich auch.

Dein nicht ausreichendes SRAM wird sicher der Grund sein, warum du solch 
ein merkwürdiges Verhalten hast. Das es überhaupt läuft, ist schon ein 
wunder. Aber das wurde ja schon gesagt.

Ich muss sagen, auch wenn ich die Meinung der "Platzhirsche" hier sehr 
schätze, dass ihre Antwort hier suboptimal war. Sicher kann man alles 
besser und hübscher machen. Aber als Anfänger(?) ist es auf einem 
einfachen Wege erstmal OK finde ich. Dabei lernt man schonmal etwas. Ich 
bin echt verwundert. Wenn ein Anfänger ein komplexes Projekt mit einem 
AVR aufziehen will und hier fragt, dann rät man ihm mit einer LED und 
einem Taster anzufangen. Hier erwartet man umgekehrt gleich gute und 
ordentliche Programmstrukturen u.s.w.. Für einen Anfänger finde ich das 
oben garnicht so schlecht.

von Karl H. (kbuchegg)


Lesenswert?

900ss D. schrieb:

> einem Taster anzufangen. Hier erwartet man umgekehrt gleich gute und
> ordentliche Programmstrukturen u.s.w.. Für einen Anfänger finde ich das
> oben garnicht so schlecht.

Na ja.
Zumindest so hätte man das ja doch machen können. Das wäre ziemlich 
naheliegend:
1
void show_instruction( uint8_t schritt )
2
{
3
  switch( schritt ) 
4
  {   
5
    case 0: 
6
    lcd_gotoxy(0,0);
7
    lcd_puts ("Anweisung 1                             ");
8
    lcd_gotoxy(0,1);
9
    lcd_puts ("Anweisung 1                        01/28");
10
    break;
11
        
12
  case 1:
13
    lcd_gotoxy(0,0);
14
    lcd_puts ("Anweisung 2                             ");
15
    lcd_gotoxy(0,1);
16
    lcd_puts ("Anweisung 2                        02/28");
17
    break;
18
19
  ...
20
}
21
22
int main()
23
{
24
  ...
25
26
  lcd_init(LCD_DISP_ON);
27
  lcd_gotoxy(0,0);
28
  lcd_puts ("   ***     PROGRAMMABLAUF XY     ***   ");
29
  
30
  step = 0;
31
32
  while( 1 )
33
  {    
34
    if( debounce( PIND, PD0 ) )              
35
    {
36
      if( step < 29 ) {
37
        step++;
38
        show_instruction( step );
39
      }
40
    }
41
42
    if( debounce( PIND, PD1 ) )              
43
    {
44
      if( step > 0 ) {
45
        step--;
46
        show_instruction( step );
47
      }
48
    }
49
  }   
50
}

damit hätte man schon mal die doppelte Aufzählung aller steps in 
previous_... und next_... weg, weil es previous_... und next_... schon 
gar nicht mehr gibt, sondern nur noch 1 Funktione die einen Parameter 
bekommt, für welchen Schritt sie die Anzeige aufbereiten soll.

Vo da ist es dann kein weiter Weg mehr, dass man realisiert, dass doch 
im Grunde alle cases in der Funktion dasselbe machen. Also legt man sich 
die gleich in eine Tabelle, die aus den beiden Texten für einen Status 
besteht.
1
struct state
2
{
3
  char * text1;
4
  char * text2;
5
};
6
7
struct states States[] = 
8
{
9
  { "Anweisung 1                             ",
10
    "Anweisung 1                        01/28" },
11
12
  { "Anweisung 2                             ",
13
    "Anweisung 2                        02/28" },
14
15
  ... die restlichen 26 States
16
};
17
18
void show_instruction( uint8_t schritt )
19
{
20
  if( schritt < sizeof(States) / sizeof(*States) ) {   // sicher ist sicher
21
    lcd_gotoxy(0,0);
22
    lcd_puts( States[schritt].text1 );
23
    lcd_gotoxy(0,1);
24
    lcd_puts( States[schritt].text2 );
25
  }
26
}
27
28
int main()
29
{
30
  ...
31
32
  lcd_init(LCD_DISP_ON);
33
  lcd_gotoxy(0,0);
34
  lcd_puts ("   ***     PROGRAMMABLAUF XY     ***   ");
35
  
36
  step = 0;
37
38
  while( 1 )
39
  {    
40
    if( debounce( PIND, PD0 ) )              
41
    {
42
      if( step < 29 ) {
43
        step++;
44
        show_instruction( step );
45
      }
46
    }
47
48
    if( debounce( PIND, PD1 ) )              
49
    {
50
      if( step > 0 ) {
51
        step--;
52
        show_instruction( step );
53
      }
54
    }
55
  }   
56
}

die restlichen Informationen, die sonst noch zu einem State gehören, 
kann man auch noch in die Tabelle verfrachten und hat dort dann die 
komplette Info beisammen, was in einem State alles zu tun ist (und wenn 
man will kann man in die Tabelle dann auch noch den jeweiligen Vorgänger 
btw. Nachfolgezustand mit angeben.

Vorteil des Ganzen: Änderungsaufwand ist kleiner und vor allen Dingen 
übersichtlicher, weil alles an einer Stelle beisammen ist und nicht über 
2 Funktionen verstreut (und dort auch noch dupliziert) ist.

Das man die Texte dann allesamt ins Flash verlegt ist dann der nächste 
Schritt. Dadurch, dass die Anzeigefunktion jetzt viel einfacher ist, ist 
das programmtechnisch keine Hexerei, in den Daten ist es sowieso nicht 
mehr als einfach nur eine entsprechende Attributierung der Texte per 
Makro.

von 900ss (900ss)


Lesenswert?

Karl heinz Buchegger schrieb:
> .... Vorteil des Ganzen: ....

Ja du hast ja Recht. Aber trotzdem ist das schon eine Stufe komplexer 
und nicht mehr nur die LED am AVR sondern auch ein Pegelwandler mit 
Schieberegister um 80 LEDS anzusteuern (oder so) ;-)

Unsere beiden Verbesserungen machen da schon was hübsches draus ;-)

von Karl H. (kbuchegg)


Lesenswert?

900ss D. schrieb:
> Karl heinz Buchegger schrieb:
>> .... Vorteil des Ganzen: ....
>
> Ja du hast ja Recht. Aber trotzdem ist das schon eine Stufe komplexer

Funktionen mit Argumenten sind komplex?

OK, ich zieh meinen Einwand zurück.

von 900ss (900ss)


Lesenswert?

Karl heinz Buchegger schrieb:
> Funktionen mit Argumenten sind komplex?

Mensch, heute hast du deinen Hut wohl mit dem Hammer aufgesetzt ;-)

> OK, ich zieh meinen Einwand zurück.

Und auch noch beleidigt. Tzzzz Tzzzz Tzzzz.... ;-)

Ich meinte dein Gesamtkonstrukt, also das umschalten der States u.s.w. 
u.s.w.

Sicher zu verstehen, aber als Anfänger mußt du da auch erst drauf 
kommen. Da überlegst du dir doch erstmal was SEHR einfaches, einfach 
gerade runter.

von Karl H. (kbuchegg)


Lesenswert?

Nein.
Aber einen gewissen Grundstock an Kentnissen setzte ich schon vorraus, 
wenn jemand ein Projekt durchziehen will.
Arrays und Funktionen mit Argumenten gehören dazu.

Wer Klemptnerarbeiten machen will, wird auch nicht weit kommen, wenn 
alles was er kann ein Rohr mit Isolierband umwickeln ist.

Ist nun mal so.
(Kann auch sein, das ich es einfach nur leid bin, wieder und immer 
wieder mit anzusehen, wie Menschen glauben Computer programmieren ist so 
ähnlich wie Wurstbrötchen essen. Kann doch jeder, muss man nichts können 
oder lernen. Und hinterher ist das Geschrei groß ....

von Dennis (Gast)


Lesenswert?

Deine Vergleiche find ich etwas unpassend zumal, dass das was ich 
geschrieben habe nicht direkt falsch ist sondern einfach 
ressourcenraubend.
Mir war es ehrlich gesagt beim schreiben nicht bewusst, dass es auch 
eleganter geht aber mit den aufgezeigten Beispielen wird mir auch 
einiges klarer und nur so lernt man ja auch dazu. Nebenbei bilde ich mir 
absolut nicht ein dass ich perfekt programmieren kann...keine ahnung wie 
ich so einen eindruck hinterlassen habe...
Trotzdem Danke für die Hilfe...werde es morgen ausprobieren...

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.