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
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.
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
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.