Forum: Compiler & IDEs LCD Ansteuerung 4 bit-mode unter "C"_Anfänger


von Rudi D. (rulixa)


Lesenswert?

AVR-Tutorial: LCD
Hier wird, in Assembler, den ich bisher auch erfolgreich benützte, das 
Halbbyte,als Beispiel, von PD0...3 weg ans Display gesendet.

Wenn man nun C lernt und vorzugsweise wiederverwendbare Routinen 
schreiben möchte, so habe ich schon von peda den Rat gehört, die 
#defines für das pinning des LCD's am µC in der main.c unterzubringen. 
Enable und RS ist klar.

Wenn nun aber das Halbbyte einmal Px0...3 und ein anderes Mal, je nach 
Printlayout, Px4...7 verwendet werden soll, so komme ich, als Anfänger, 
auf keine Lösung wie ich das machen soll, ohne eine umfangreiche 
ifdef......endif in einer lcd_my.h oder lcd-my.c unterzubringen.

Geht so was in C eleganter?
So wie in Assembler es auch in C zu lösen, das kann ich inzwischen.
In Assembler war eine Ansteuerung eben speziell für ein PCB-Layout.

LG Rudi

von Karl H. (kbuchegg)


Lesenswert?

Rudi D. schrieb:

> schreiben möchte, so habe ich schon von peda den Rat gehört, die
> #defines für das pinning des LCD's am µC in der main.c unterzubringen.
> Enable und RS ist klar.

main.c ist aber die falsche Stelle. Wie soll denn der Code in lcd.c dann 
das Pinning mitkriegen?

> Wenn nun aber das Halbbyte einmal Px0...3 und ein anderes Mal, je nach
> Printlayout, Px4...7 verwendet werden soll, so komme ich, als Anfänger,
> auf keine Lösung wie ich das machen soll,

In dem Fall geht es noch. Denn im Prinzip hast du dann deine 4 
Datenleitungen immer noch nebeneinander in gleicher Reihenfolge an einem 
Port liegen.

D.h. die 'Position deiner 4 Datenleitungen' ist einfach nur um einen 
(konstanten) Offset verschoben. Das ist auch in C kein Problem, Die 
Datenleitungen werden dann ausgegeben durch
1
  DATA_PORT &= ~( 0x0F << DATA_OFFSET );           // bewusste Pins auf 0
2
  DATA_PORT |=  ( Daten & 0x0F ) << DATA_OFFSET;   // je nach Bedarf wieder 1 einsetzen

Unangenehm wird es dann, wenn auch diese Annahme nicht mehr greift und 
die 4 Datenleitungen wild verteilt an einem oder mehreren Ports liegen.

> ohne eine umfangreiche
> ifdef......endif in einer lcd_my.h oder lcd-my.c unterzubringen.
>
> Geht so was in C eleganter?

Kommt immer drauf an, wie universell das ganze sein muss. Wer 
hardwaremässig in die Situation rutscht, dass er die 4 Datenleitungen 
nicht beisammen lassen kann/will, muss dieses "Vergehen" mit Mehraufwand 
im Code bezahlen. Die Frage ist, ob man diesen Mehraufwand nur für den 
Fall der Fälle immer in Kauf nimmt oder ob man sagt: Lass den Scheiss 
und sieh zu, dass du die Datenleitungen hardwaremässig beisammen lässt.

> ohne eine umfangreiche ifdef......endif in einer lcd_my.h oder
> lcd-my.c unterzubringen.

Na ja. So umfangreich ist es dann auch wieder nicht. Man muss sich halt 
unter Umständen erst mal ein paar Makros und/oder Funktionen oder einen 
sontigen Mechanismus zurechtlegen, damit die Schreiberei nicht ausartet. 
Es ist nicht ungewöhnlich, dass man in C sein eigener "Werkzeugmacher" 
ist, so dass man erst mal ein wenig Aufwand investiert um dafür dann an 
anderen Stellen den (Tipp-)Aufwand massiv zu drücken.

von Peter D. (peda)


Lesenswert?

Die Version im Tutorial ist mit dem Pinning nicht flexibel.

Viel besser geht es so:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296


Peter

von Rudi D. (rulixa)


Lesenswert?

Ich danke für die ausführlichen Antworten, die mir das Thema klarer 
erscheinen lassen. Wild verteilte Datenleitungen hatte ich nie im Sinn.

Manche Schreibweisen für Platzhalter "##" sind mir noch neu.
Aber ich werde jetzt gut zurechtkommen.
LG Rudi

von Karl H. (kbuchegg)


Lesenswert?

Rudi D. schrieb:

> Manche Schreibweisen für Platzhalter "##" sind mir noch neu.

Nicht ganz.
Das ist der Stringize-Operator des Präprozessors. Mit Platzhalter hat 
das so erst mal nicht viel zu tun.

von Rudi D. (rulixa)


Lesenswert?

Danke, für den Hinweis. Verstehe jetzt:

3.1.6. Präprozessor-Operatoren
Der Präprozessor kennt den stringize-Operator # und den pasting-Operator 
##. Ersterer verwan-
delt den nachfolgenden Text in einen String, letzterer verknüpft zwei 
Argumente:
1
#include <stdio.h>
2
#define stringize(s) # s
3
#define makestring(s) stringize(s)
4
#define concatenate(a,b) a ## b
5
int main()
6
{
7
int var12=32;
8
printf(makestring(C ist seltsam und sonderbar));
9
printf("\nund %s hat den Wert %d\n",
10
makestring(concatenate(var,12)),
11
concatenate(var,12));
12
}

Je mehr ich kenne umso umfangreicher wird das, das ich nicht kenne!
LG Rudi

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Rudi D. schrieb:
>
>> Manche Schreibweisen für Platzhalter "##" sind mir noch neu.
>
> Nicht ganz.
> Das ist der Stringize-Operator des Präprozessors. Mit Platzhalter hat
> das so erst mal nicht viel zu tun.

Mein Fehler.
## ist Token-Pasting, wie du ja selber auch schon rausgefunden hast.
Mea culpa.

von Rudi D. (rulixa)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Mea culpa.

Steht eher mir zu das zu sagen!
Danke, LG Rudi

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.