Forum: Mikrocontroller und Digitale Elektronik Frage zum LCD - Header: Pins selber einstellen


von Timo (Gast)


Angehängte Dateien:

Lesenswert?

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

von M80 (Gast)


Lesenswert?

Benutze die Lib. von Fleury mit der geht das.

von Timo (Gast)


Lesenswert?

Wo bekomme ich diese Lib her?

von M80 (Gast)


Lesenswert?


von Timo (Gast)


Lesenswert?

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 ?

von M80 (Gast)


Lesenswert?

->#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     */

von Timo (Gast)


Lesenswert?

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

von Timo (Gast)


Lesenswert?

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

von M80 (Gast)


Lesenswert?

Die Adressen wurden schon im def. File festgelegt.
Darum brauchst du dich nicht zu kümmern.
LCD_PORT ist schon die Adresse.

von M80 (Gast)


Lesenswert?

Mit was Prog. du?
AVR-Studio und GCC?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Timo (Gast)


Lesenswert?

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.

von Christopher (Gast)


Lesenswert?

Das wären pro Leitung 8 x 4 Ports Möglichkeiten. Das macht 32 x 6 
Abfragen.

von Timo (Gast)


Lesenswert?

@ M80
Arbeite mit AVR Studio

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.