Forum: Mikrocontroller und Digitale Elektronik LCD auf 2 Ports verteilen


von Hendrik (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

mein Proplem ist volgendes.
Momentan habe ich mein LCD am Atmega8 auf PortD verteilt (PD0 = RS, PD1 
= EN, PD4-PD7 = Data(4bit)). Nun möchte ich mein "Wissen" erweitern und 
mit UART anfangen und dafür brauche ich ja PD0 und PD1. Nun kommt das 
Proplem das ich als einzige Möglichkeit PC2 und PC3 noch frei zur 
Verfügung habe.
PB1 - PB3 ist für Servos
PC4 und PC5 für Später mal I²C
PD2 und PD3 für INT0 und INT1
Gibt es eine möglichkeit die LCD Routines so um zuschreiben das RS und 
EN auf PortC und die 4 Datenleitungen auf PortD verteilt sind?
Wenn nicht, müsste ich mich von Int0 und Int1 trennen wollen.
1
//  LCD RS      <-->  PORTB Bit PC2     (RS: 1=Data, 0=Command)
2
#define LCD_RS        PC2
3
//  LCD EN      <-->  PORTB Bit PC3    (EN: 1-Impuls für Daten)
4
#define LCD_EN        PC3
5
6
//  LCD DB4-DB7 <-->  PORTB Bit PD4-PD7   
7
#define LCD_PORT      PORTD
8
#define LCD_DDR       DDRD
9
#define LCD_DB        PD4                // 1. DB von 4

hab ich schon probiert, aber auf Display kommt nix an

von LCDFreak (Gast)


Lesenswert?

Hendrik schrieb:
> Gibt es eine möglichkeit die LCD Routines so um zuschreiben das RS und
> EN auf PortC und die 4 Datenleitungen auf PortD verteilt sind?

Ja gibt es.

von Peter D. (peda)


Lesenswert?


von Hendrik (Gast)


Lesenswert?

LCDFreak schrieb:
> Ja gibt es.

Würde mich sehr freuen wenn du mir verätst wie

von Wolfgang (Gast)


Lesenswert?

Hendrik schrieb:
> hab ich schon probiert, aber auf Display kommt nix an

Es ist auch wenig sinnvoll, Register Select und Enable an Port C 
anzuschließen und über Port D anzusprechen. Da musst du auch die 
entsprechenden Änderungen in der Bibliohek machen und LCD_PORT 
aufspalten

von Hendrik (Gast)


Lesenswert?

Wolfgang schrieb:
> Änderungen in der Bibliohek machen und LCD_PORT
> aufspalten

davon hab ich schon gelesen,
LCD_CTRL_PORT und LCD_DATA_PORT meinst du das so @Wolfgang ?

von M. K. (sylaina)


Angehängte Dateien:

Lesenswert?

Hendrik schrieb:
> Wolfgang schrieb:
>> Änderungen in der Bibliohek machen und LCD_PORT
>> aufspalten
>
> davon hab ich schon gelesen,
> LCD_CTRL_PORT und LCD_DATA_PORT meinst du das so @Wolfgang ?

Kann man so machen. Wenn man lustig ist (und genügend Ports hat) kann 
man jeden Port eines Displays auf jeweils einen Pin eines Ports legen.
Die LCD-Lib umschreiben ist dann ausschließlich Fleißarbeit. Hier im 
Anhang mal ein Beispiel für ein grafisches Display, dass ich 
(layoutbedingt) auf drei Ports verteilt hatte. Ursprünglich gabs nur 
einen LCD_CMD_PORT und einen LCD_DATA_PORT.

von Wolfgang (Gast)


Lesenswert?

Hendrik schrieb:
> davon hab ich schon gelesen,
> LCD_CTRL_PORT und LCD_DATA_PORT meinst du das so @Wolfgang ?

Ja, aber Namen sind Schall und Rauch. Du kannst auch z.B. RS, E, D5, D7 
auf einen Port legen und D4 mit D6 auf einen anderen.
Guck dir z.B. mal die LCD-Bibliothek von Arduino an. Da kannst du bei 
der Initialisierung jeden der Pins irgendwo hin legen.
https://www.arduino.cc/en/Reference/LiquidCrystalConstructor

von Philipp K. (philipp_k59)


Lesenswert?

Ich hab vor einiger zeit den Daten-Port aufgesplittet.. theoretisch kann 
man das als Routine bis auf einzelne Pins umändern.
1
//Header
2
#define GLCD_DATA_PORT1   PORTD
3
#define GLCD_DATA_PIN1    PIND  //Arduino Pins 2-7
4
#define GLCD_DATA_DDR1    DDRD
5
#define GLCD_DATA_SHIFT1  <<2
6
#define GLCD_DATA_RSHIFT1  >>2
7
#define GLCD_DATA_MASK1    0xFC
8
9
#define GLCD_DATA_PORT2   PORTB
10
#define GLCD_DATA_PIN2    PINB  //Arduino Pins 8,9
11
#define GLCD_DATA_DDR2    DDRB
12
#define GLCD_DATA_SHIFT2  >>6
13
#define GLCD_DATA_RSHIFT2  <<6
14
#define GLCD_DATA_MASK2    0x03
15
16
//write Routine
17
  GLCD_DATA_PORT1 &= ~GLCD_DATA_MASK1;
18
  GLCD_DATA_PORT1 |= (data GLCD_DATA_SHIFT1);
19
  GLCD_DATA_PORT2 &= ~GLCD_DATA_MASK2;
20
  GLCD_DATA_PORT2 |= (data GLCD_DATA_SHIFT2);
21
  GLCD_CTRL_PORT &= ~((1 << GLCD_WR) | (1 << GLCD_CE) | (1 << GLCD_CD));
22
  n_delay();
23
  GLCD_CTRL_PORT |= ((1 << GLCD_WR) | (1 << GLCD_CE) | (1 << GLCD_CD));

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

In der h Datei rumspielen reicht eben nicht, in der lcd-routines.c 
musste noch ein paar Funktionen umschreiben, sodass deine neuen defines 
auch Wirkung zeigen.

Da ja nur die Steuerleitung an einen anderen Port sollen ist das sogar 
recht einfach.
Änderungen nötig in:
lcd_enable
lcd_init (nur Pin init)
lcd_data

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Nur noch der Hinweis, das das Verteilen der LCD Anschlüsse auf 
verschiedene Ports bei Peter Fleurys LCD Library ein Kinderspiel ist:
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> Ja, aber Namen sind Schall und Rauch. Du kannst auch z.B. RS, E, D5, D7
> auf einen Port legen und D4 mit D6 auf einen anderen.
> Guck dir z.B. mal die LCD-Bibliothek von Arduino an. Da kannst du bei
> der Initialisierung jeden der Pins irgendwo hin legen.

Ja, kann man. Wie gesagt, das ist nur Fleißarbeit da die Bibliothek 
eigentlich so geschrieben wurde, dass der Command-Port einen Port 
benutzt und der Data-Port einen anderen. Man wird aber von niemanden 
daran gehindert eine eigenen Bibliothek zur Displayansteuerung zu 
schreiben. Schwer ist das auch nicht, es dauert halt nur seine Zeit da 
es, im Vergleich zu "üblichen" uC-Programmen, doch etwas umfangreicher 
ist. Zumindest wenn ich meine Programme so anschaue. Aber ein Hexenwerk 
ist das bei weitem nicht.

von Hendrik (Gast)


Lesenswert?

Danke für die zahlreichen Tips. Bis jetzt war es ja auch "einfach" da 
ich den kompletten Port gewechselt habe, doch nun wo immer neue Ideen 
dazukommen, ist jeder Pin auf dem ATmega8 Goldwert, aber das kenn ihr ja 
sicherlich alle zu gut. Arbeitskollege hat mir auch schon angeboten das 
LCD über I²C anzusteuern, aber da hab ich noch überhaupt keine Ahnung, 
was wie und wo.

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.