Forum: Mikrocontroller und Digitale Elektronik ks0108 library funktionen und der stm32


von stm32 (Gast)


Angehängte Dateien:

Lesenswert?

ich habe folgende zur biliothek "Universal KS0108 driver library STM32 
MCU low-level driver" von (c) Rados³aw Kwiecieñ, radek@dxp.pl.

in dieser bibliothek wird der port GPIOE als gesamtes verwendet(d.h. 
alle display pins liegen auf diesem port) bei meinem eval board sind 
aber leider nicht alle pins ausgeführt somit habe pins von verschiedenen 
ports(von A bis F) in verwendung.

das ist auch kein problem bei RS, RW, EN, CS1/2, RST nur bei den 
datenports D0-D7 fehlt es mir am wissen um den quelltext richtig zu 
lesen/umzuschreiben.

in der KS0108-STM32.c steht #define KS0108_D0   0  und für den 
KS0108_Port wird GPIOE angegeben.

in den c files tauchen immer wieder (shift)ausdrücke wie z.B. 
GPIO_InitStructure.GPIO_Pin = 0xFF << KS0108_D0;
oder
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin  = (0xFF << KS0108_D0);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(KS0108_PORT, &GPIO_InitStructure);
auf

meine frage was bewirkt ein GPIO_InitStructure.GPIO_Pin  = 0b11111110
bzw. wie könnte ich z.B.: GPIO_Init(KS0108_PORT, &GPIO_InitStructure); 
geschickt umschreiben ?

im anhang findet ihr die besagte bibliothek


Danke

von Florian (Gast)


Lesenswert?

Hallo,

du kannst mit der folgenden Struktur die Portpins Konfigurieren:

z.B.
GPIO_InitTypeDef  GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_Out_PP; // Ausgang PushPull
GPIO_InitStructure.GPIO_Pin      = 0xFF << 7;        //PE7..14
PIO_InitStructure.GPIO_Speed     = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);

Du kannst auch GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7 | GPIO_Pin_8 | 
...
schreiben, damit Kannst Du die Portpins einzeln verodern. Ist 
übersichtlicher.

Zum Einlesen der Pins musst Du auf "GPIO_Mode_IN_FLOATING" schalten.

Gruß
Florian

von stm32 (Gast)


Lesenswert?

hallo,

danke für deine antwort deine erklärung leuchtet mir ja ein, aber wieso 
wird bei der von mir genannten
GPIO_InitStructure.GPIO_Pin  = (0xFF << KS0108_D0); ein 0er hinein 
geschoben wozu ist das gut, da initialisiere ich ja gar keinen pin oder 
?


danke !

von Florian (Gast)


Lesenswert?

Hallo,

so wie ich das verstehe steht in dem #define "KS0108_D0" eine 
Bitkombination, die die Pins auf dem ges. Port initialisiert.

Wenn Du "GPIO_InitStructure.GPIO_Pin = 0" angibst wird keine Portpin 
initialisiert.

Ich gehe mal davon aus, das Du das #define selber festlegen musst, je 
nachdem an welchen zusammenhängenden Portpins dein LCD hängt.


z.B. LCD an PORTx 7..14
GPIO_InitStructure.GPIO_Pin = 0xFF << 7; //P7..P14

Gruß
Florian

von stm32 (Gast)


Lesenswert?

hallo,

"Ich gehe mal davon aus, das Du das #define selber festlegen musst, je
nachdem an welchen zusammenhängenden Portpins dein LCD hängt."

....weißt du was ich daran komisch finde, dass in keiner funktion ein 
anderer pin auftaucht als der 0er(#define KS0108_D0   0) also auch wenn 
ich die restl. pins per #define setzen würde greift keine der funktionen 
darauf zu.
heißt das, das programm "arbeitet" nur mit dem pin D0 des displays ????
...kann ich mir nicht vorstellen.

deswegen meinte ich ja dass es mir an verständnis fehlt

danke

von Florian (Gast)


Lesenswert?

Hallo,

das Display arbeitet mit den 8 Datenleitungen D0 bis D7. So wie ich das 
sehe hängen die Datenleitungen des Displays am PORTE von Bit 0 bis Bit 
7. Die Portpins 0..7 werden gleichzeitig auf lesen geschaltet und dann 
parallel eingelesen. Beim schreiben werden sie parallel beschrieben.

Der Funktion "void GLCD_WriteData(unsigned char dataToWrite)
" werden 8 Bits als char übergeben und dann mit 
"GPIO_SetBits(KS0108_PORT, (dataToWrite << KS0108_D0));
" auf PORTE ausgegeben. Sie werden dazu um 0 Stellen geshiftet. Wenn Du 
die Datenleitungen an einem anderen Port hast musst Du ev. shiften. Das 
sieht hier nur komisch aus, weil Du die 8 Bits um 0 shiftest. Soll eben 
allgemein gültig sein.

Gruß
Florian

von stm32 (Gast)


Lesenswert?

servus florian,

.......so wies aussieht ist gegen dummheit kein kraut gewachsen
diesmal tut mein code ausnahmsweise das was er soll(hab ich mit 
breakpoints und Vmeter überprüft)

das problem ist folgendes: mein eval board von iar wird zwar über ein 5V 
netzteil versorgt. nur die GPIOS geben halt nur knappe 3.3V aus und im 
"0815" datenblatt dieser KS0108 displays steht drinnen:

Supply voltage for Logic 4.5V - 5.5V;
(min)Input voltage 'H' level 0.7*VDD

......in meinem fall ist VDD knappe 6V(unstab. netzteil) 
0.7*6V = 4.2V und das liegt halt doch fast 1V über den 3.3V der GPIO's

............aber wer denkt schon an solche kleinigkeiten ;+)
zumind. weis ich jetzt was es mit den shifts auf sich hat !!

Danke nochmal für deine tips
mfg

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.