Hallo, Ich möchte ein LCD - Display ansteuern. Ich habe dafür die Pins PC0 - PC5 an einem ATMega 16 zur Verfügung. Es werden folgende Leitungen auf die Pins verteilt: - DATA4 - DATA7, - E(nable), - RS. Das Display wird im 4 - Bit - Mode betrieben. Es handelt sich um ein zweizeiliges Display. Der Controller auf dem Display ist der Standartcontroller. Mein Problem: Ich habe eine Routine vorliegen unter der das Display 100 % funktioniert. Die Routine setzt aber vorraus, dass DATA4 - DATA7 an den Pins 4 - 7 und so weiter liegen, sprich es sind bei der Routine NUR die Ports und nicht die Pins varriabel. Da meine Schaltung aber bereits aufgebaut ist benötige ich nun so eine "varriable Routine". Ich hänge den Header für das Display mal an. Da ich selbst noch nicht so fit bin im Programmieren möchte ich Euch um Hilfe bitte. Wie stelle ich die Pin´s varriabel ein ? Wenn es nicht allzuviel Arbeit macht, könnt mir dass einer Einstellen bzw. mir Tips geben wie ich selber vorgehen soll ? In der Codesammlung habe ich nichts geeignetes gefunden. Vielen Dank
Und nun muss ich meine Pins im Block
1 | #define LCD_PORT PORTA /**< port for the LCD lines */ |
2 | #define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */ |
3 | #define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */ |
4 | #define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */ |
5 | #define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */ |
6 | #define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */ |
7 | #define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */ |
8 | #define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */ |
9 | #define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */ |
10 | #define LCD_RS_PORT LCD_PORT /**< port for RS line */ |
11 | #define LCD_RS_PIN 4 /**< pin for RS line */ |
12 | #define LCD_RW_PORT LCD_PORT /**< port for RW line */ |
13 | #define LCD_RW_PIN 5 /**< pin for RW line */ |
14 | #define LCD_E_PORT LCD_PORT /**< port for Enable line */ |
ändern ?
->#define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */ ->#define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */ ->#define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */ ->#define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */ #define LCD_RS_PORT LCD_PORT /**< port for RS line */ ->#define LCD_RS_PIN 4 /**< pin for RS line */ #define LCD_RW_PORT LCD_PORT /**< port for RW line */ ->#define LCD_RW_PIN 5 /**< pin for RW line */ #define LCD_E_PORT LCD_PORT /**< port for Enable line */
Danke. Ich möchte nun aber doch versuchen meine Routine so aufzubauen, dass ich die Pins varrieren kann. Ich habe nun angefangen die Deffinitionen auf meinen Header zu übertragen. 1. Wie greife ich nun auf diese zu, bzw. was muss mein nächster Schritt sein ? 2. Unter welchen Punkten kann ich im Toturial schauen (Möchte es ja lernen)? 3. Unter welchen Begriffen kann ich googlen? (C - Grundkenntnisse vorhanden) 4. Könnte mich einer Schritt für Schritt über diesen Post anleiten ? (Ich weiß ist viel verlangt, aber vielleicht hat ja einer Spass dran und es fällt einem sehr leicht.) Ich betone nochmal erwarte nicht, dass einer mir dass macht. Bin bereit selbst zu schauen, probieren und so ... brauche nur Anstöße.
1 | #include <util/delay.h> //Einbinden der Datei 'util/delay.h' |
2 | #include <inttypes.h> //Einbinden der Datei 'inttypes.h' |
3 | |
4 | |
5 | |
6 | |
7 | unsigned char Port; //'Port' wird eingestellt. |
8 | unsigned char Position_X; //'Position_X' wird eingestellt. |
9 | unsigned char Position_Y; //'Position_Y' wird eingestellt. |
10 | |
11 | |
12 | |
13 | |
14 | #define F_CPU 8000000UL //CPU-Frequenz wird festgelegt.
|
15 | |
16 | #define LCD_PORT PORTD //Festlegen des Ports, an dem dass Display angeschloßen ist
|
17 | |
18 | #define LCD_DATA0_PORT LCD_PORT //Port für das erste Datenbit DATA0 im 4 - Bit - Mode wird festgelegt.
|
19 | #define LCD_DATA1_PORT LCD_PORT //Port für das zweite Datenbit DATA1 im 4 - Bit - Mode wird festgelegt.
|
20 | #define LCD_DATA2_PORT LCD_PORT //Port für das dritte Datenbit DATA2 im 4 - Bit - Mode wird festgelegt.
|
21 | #define LCD_DATA3_PORT LCD_PORT //Port für das vierte Datenbit DATA2 im 4 - Bit - Mode wird festgelegt.
|
22 | |
23 | #define LCD_DATA0_PIN 0 //Pin für das erste Datenbit DATA0 im 4 - Bit - Mode wird festgelegt.
|
24 | #define LCD_DATA1_PIN 1 //Pin für das zweite Datenbit DATA1 im 4 - Bit - Mode wird festgelegt.
|
25 | #define LCD_DATA2_PIN 2 //Pin für das dritte Datenbit DATA2 im 4 - Bit - Mode wird festgelegt.
|
26 | #define LCD_DATA3_PIN 3 //Pin für das vierte Datenbit DATA3 im 4 - Bit - Mode wird festgelegt.
|
27 | |
28 | #define LCD_RS_PORT LCD_PORT //Port für 'RS' wird festgelegt.
|
29 | #define LCD_RS_PIN 4 //Pin für 'RS' wird festgelegt.
|
30 | #define LCD_RW_PORT LCD_PORT //Port für 'R/W' wird festgelegt.
|
31 | #define LCD_RW_PIN 5 //Pin für 'R/W' wird festgelegt.
|
32 | #define LCD_E_PORT LCD_PORT //Port für 'E(nable)' wird festgelegt.
|
33 | #define LCD_E_PIN 4
|
Vielen Dank
Ich seh schon zu komplex meine Bitte. Also nun kurz: Ich habe zum Beispiel folgendes geschrieben:
1 | #define LCD_PORT PORTC
|
2 | #define LCD_DATA0_PORT LCD_PORT
|
3 | #define LCD_DATA0_PIN 1
|
Damit deffiniere ich doch für das Datenbit DATA0 die Adresse. In diesem Fall liegt Data0 an PC1. Es handelt sich hierbei doch nur um eine Zuordnung zur besseren Übersicht. Hinter dieser Diffinition müssen nun doch auch noch "Adressen" liegen. Für PIN1 zum Beispiel sowas wie 0x01. Wie geht man nun weiter vor? Gruß Timo
Die Adressen wurden schon im def. File festgelegt. Darum brauchst du dich nicht zu kümmern. LCD_PORT ist schon die Adresse.
Timo wrote: > Ich seh schon zu komplex meine Bitte. Das ist in der Tat nicht so einfach. Die Hauptarbeit besteht in der Auswertung. Also im Code der mit diesen Definitionen dann tatsächlich die Bits am Port setzt. >
1 | > #define LCD_PORT PORTC |
2 | > #define LCD_DATA0_PORT LCD_PORT |
3 | > #define LCD_DATA0_PIN 1 |
4 | >
|
> > Damit deffiniere ich doch für das Datenbit DATA0 die Adresse. In diesem > Fall liegt Data0 an PC1. > > Es handelt sich hierbei doch nur um eine Zuordnung zur besseren > Übersicht. Hinter dieser Diffinition müssen nun doch auch noch > "Adressen" liegen. > > Für PIN1 zum Beispiel sowas wie 0x01. Wie geht man nun weiter vor? Du musst dir ansehen, wo LCD_DATA0_PORT im Code benutzt wird. Die #define da oben sind ja nur ANweisungen für Textersetzungen. Irgendwo im Code steht dann mal: LCD_DATA0_PORT = irgendwas und dort passiert dann die Umsetzung deiner Definitionen in den realen Code. Aber wie gesagt: Den Port auf diese Art variabel zu halten, ist nicht weiter schwer. Bei den einzelnen Bits wirds schon haariger. Ein Beispiel: Du machst eine 4 Bit Ausgabe für das Datennibbel. Normalerweise würdest du das so schreiben: unsigned char Nibble; Nibble = Byte & 0x0F; // um das untere Nibbel zu extrahieren LCD_PORT &= 0xF0; // mal am Port die unteren 4 Bits definiert // auf 0 setzen LCD_PORT |= Nibble; // und die 4 Bits neu setzen Willst du jetzt die Pins auch noch variabel halten, dann wird das komplizierter, weil ja * a priori keine Beziehung zwischen den Datenbits und den zu beeinflussenden Port-Bits besteht * die einzelnen Bits ja noch nicht mal am selben Port liegen muessen Also muss jedes Datenbit einzeln betrachtet werden. Ist es gesetzt, dann muss auch das vereinbarte Port-Bit am vereinbarten Port gesetzt werden und umgekehrt. unsigned char Nibble; Nibble = Byte & 0x0F; // um das untere Nibbel zu extrahieren if( Nibble & 0x01 ) // das unterste Bit ist gesetzt LCD_DATA0_PORT |= ( 1 << LCD_DATA0_PIN ); else LCD_DATA0_PORT &= ~( 1 << LCD_DATA0_PIN ); if( Nibble & 0x02 ) // das nächste Bit ist gesetzt LCD_DATA1_PORT |= ( 1 << LCD_DATA1_PIN ); else LCD_DATA1_PORT &= ~( 1 << LCD_DATA1_PIN ); if( Nibble & 0x04 ) // das dritte Bit ist gesetzt LCD_DATA2_PORT |= ( 1 << LCD_DATA2_PIN ); else LCD_DATA2_PORT &= ~( 1 << LCD_DATA2_PIN ); if( Nibble & 0x08 ) // das vierte Bit ist gesetzt LCD_DATA3_PORT |= ( 1 << LCD_DATA3_PIN ); else LCD_DATA3_PORT &= ~( 1 << LCD_DATA3_PIN ); Auf sowas läuft das dann immer hinaus. Jedes Bit muss einzeln bearbeitet werden. Mit dieser Flexibilität erkauft man sich dann allerdings einen Nachteil: Im Falle von LCD_PORT |= Nibble; // und die 4 Bits neu setzen werden die 4 Bits gleichzeitig gesetzt. Bei der flexibleren Lösung werden die Bits aber hintereinander gesetzt. Bei einer LCD Ansteuerung ist das noch kein Problem, aber wenn am Port ein Gerät hängt, bei dem dieser Timing Unterschied nicht egal ist, dann hat man ein Problem. Mann könnte dann zb. im Code abfragen (ev. sogar mit dem Präprozessor) ob die Ports für Bit0, Bit1, Bit2, Bit3 alle gleich sind, und dann wieder zusammenfassen. Aber auch das artet in Arbeit aus (sowohl für den Programmierer als auch für das Programm/Compiler) Wie gesagt: Flexibilität kann manchmal schon sehr aufwändig werden.
O kay, danke. Ich hatte mir zuvor folgendes überlegt (Viel viel Schreibarbeit, ich weiß) ..: Ich nehme mir den ATMega16 vor. Und schreibe nun folgende Abfragen: if (DATA0 == PA0) { //Hier wird die Adresse des PIN 0 des Port A angegeben } if (DATA0 == PA1) { //Hier wird die Adresse des PIN 1 des Port A angegeben } if (DATAn == Pnn) { //Hier wird die Adresse des PIN n des Port n angegeben }.... Würde soetwas auch gehen? Von der Überlegung her meine ich.
Das wären pro Leitung 8 x 4 Ports Möglichkeiten. Das macht 32 x 6 Abfragen.
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.