Forum: Mikrocontroller und Digitale Elektronik Funktionsaufruf mit Array als Parameter klappt nicht (einfach;))


von Lisa (Gast)


Lesenswert?

Hallo zusammen

Ich experimentiere zur Zeit mit meinem ersten grafischen Display (KS0108 
Controller). Dazu nutze ich die apetech Library, Download hier von der 
Seite.

Ich wollte mir eine Funktion zum Laden von (quadratischen) Bitmaps 
schreiben, da das nicht klappte habe ich die Funktion mal auf das 
allermindeste Runtergebrochen, klappen will es aber immer noch nicht. 
Ich bin überzeugt, dass es ein einfacher Fehler ist, klappen wills 
trotzdem nicht;)
1
/*
2
 * GraphicLCD.c
3
 *
4
 * Created: 19.06.2014 19:21:26
5
 *  Author: Lisa
6
 */ 
7
8
9
#define F_CPU 8000000
10
#include <util/delay.h>
11
#include <avr/io.h>
12
13
#include "glcd_ks0108/ks0108.h"
14
#include "glcd_ks0108/arial8.h"
15
16
17
static const uint16_t bitmap[] PROGMEM  = {0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00};
18
19
20
//PC1 ist RW
21
22
void quadraticBitmapLoader(const uint16_t * bmp){
23
  
24
  ks0108GotoXY(5, 5);
25
  
26
  ks0108WriteData(bmp[0]);
27
  ks0108WriteData(bmp[1]);
28
  ks0108WriteData(bmp[2]);
29
  ks0108WriteData(bmp[3]);
30
  ks0108WriteData(bmp[4]);
31
  ks0108WriteData(bmp[5]);
32
  ks0108WriteData(bmp[6]);
33
  ks0108WriteData(bmp[7]);
34
}
35
36
int main(void)
37
{
38
  
39
  // Initialize the LCD
40
  ks0108Init(0);
41
  
42
  /*
43
  ks0108GotoXY(5,5);
44
  
45
  ks0108WriteData(bitmap[0]);
46
  ks0108WriteData(bitmap[1]);
47
  ks0108WriteData(bitmap[2]);
48
  ks0108WriteData(bitmap[3]);
49
  ks0108WriteData(bitmap[4]);
50
  ks0108WriteData(bitmap[5]);
51
  ks0108WriteData(bitmap[6]);
52
  ks0108WriteData(bitmap[7]);
53
  */
54
  
55
  quadraticBitmapLoader(bitmap);
56
}

In dem Code seht ihr einmal die Funktion quadraticBitmapLoader, als 
Parameter nimmt die ein Pointer auf ein Array.
Ich rufe die Funtkion mit meinem Bitmap-Array auf.
Auskommentiert habe ich dabei den eigentlich identischen Code in meiner 
main-Routine.

Wenn ich die Funktion so umschreibe, dass Sie keinen Parameter erwartet 
und direkt aus der Funktion direkt auf das Array bitmap zugreiffe dann 
klappts, also muss es ein Problem mit der Übergabe des Arrays sein.

Das Problem ist, wie geschrieben, dass der identische Code in main 
fnktioniert, in der quadraticBitmapLoader Funktion dann nicht mehr.
Nicht funktionieren heisst dabei, dass nur Kauderwelsch auf dem Display 
ankommt, anstatt 4 schöner vertikaler Linien.

Übrigens: Der Anschluss des Displays muss korrekt sein, Text anzeigen 
etc klappt nämlich.
Wer weiss Rat? ;)

Liebe Grüsse

von Pit S. (pitschu)


Lesenswert?

Das Problem ist, dass das array im PROGMEM liegt. Dann funktioniert 
normale Pointer-Arithmetic nicht mehr. Die konstante Variante mit 
direkten Aufrufen klappt, weil der Compiler direkt die Arraywerte an die 
Funktion übergibt. In der Variante mit Funktionsparameter musst du 
selbst mit den entsprechenden Funktionen die Werte aus dem PROGMEM 
holen.

von Falk B. (falk)


Lesenswert?


von Lisa (Gast)


Lesenswert?

Hallo zusammen

Vielen Dank für die hilfreichen Antworten, da wäre ich nicht drauf 
gekommen;)

Hier noch der Code für alle die das selbe Problem haben:
1
/*
2
 * GraphicLCD.c
3
 *
4
 * Created: 19.06.2014 19:21:26
5
 *  Author: Lisa
6
 */ 
7
8
9
#define F_CPU 8000000
10
#include <util/delay.h>
11
#include <avr/io.h>
12
#include <avr/pgmspace.h>
13
14
#include "glcd_ks0108/ks0108.h"
15
#include "glcd_ks0108/arial8.h"
16
17
18
static const uint8_t bitmap[] PROGMEM  = {0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00};
19
20
21
//PC1 ist RW
22
23
void quadraticBitmapLoader(const uint8_t * bmp){
24
  ks0108GotoXY(5, 5);
25
  for(int i=0; i<8; ++i){
26
    ks0108WriteData( (uint8_t) pgm_read_byte (&bmp[i]) );    
27
  }
28
}
29
30
int main(void)
31
{
32
  
33
  // Initialize the LCD
34
  ks0108Init(0);
35
  
36
  quadraticBitmapLoader(bitmap);
37
}

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.