Forum: Mikrocontroller und Digitale Elektronik LCD 4x40 ansteuern über PCF8574 (I2C)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hendrik (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hab mir bei Conrad volgendes LCD "Anag Vision AV4040BNBW-WJ" 
gekauft, hat 4 Zeilen a 40 Zeichen.
Bisher hatte ich immer 4x20 Displays, erst normal angeschlossen über 
AVR-Port und später über I2C  mit einem PCF8574 IC. IM Anhang meine 
bisher, funktionierende Display.h für I2C

Nun steh ich vor dem Proplem , wie die Datei so umschreiben das ich die 
beiden Chips ansprechen kann. Enable1 hab ich auf P7 und Enable2 ist auf 
P6.

Ich hab zum einen die Idee das ich LCD1 oder LCD2 auswähle und dann 
jeweils Zeile 1 oder 2,
oder zum andern das wenn ich Zeile 3 und Zeile 4 angebe über SetCursor, 
automatisch auf LCD 2 umgeschalten wird.

Wie gesagt, zu beiten Ideen fehlt mir das Wissen zur Umsetzung und hoffe 
hier auf Antworten.

MFG Hendrik

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@Hendrik (Gast)

>Nun steh ich vor dem Proplem , wie die Datei so umschreiben das ich die
>beiden Chips ansprechen kann.

Sieht so aus.

>Enable1 hab ich auf P7 und Enable2 ist auf
>P6.

>Ich hab zum einen die Idee das ich LCD1 oder LCD2 auswähle und dann
>jeweils Zeile 1 oder 2,

Kann man machen.

>oder zum andern das wenn ich Zeile 3 und Zeile 4 angebe über SetCursor,
>automatisch auf LCD 2 umgeschalten wird.

Das ist besser. Denn im Normalfall will die Anwendung von den 
"dreckigen" Internas der Ansteuerung nichts wissen und nur einfach die 
Daten in die Zeilen schreiben.

>Wie gesagt, zu beiten Ideen fehlt mir das Wissen zur Umsetzung und hoffe
>hier auf Antworten.

Was willst du denn noch hören? Eine Schritt für Schritt Anleitung, was 
man ändern muss?

Du musst dir die aktuelle Zeile und Spalte in Variablen merken, daraus 
wird die Auswahl LCD1/2 abgeleitet. Dann vielleicht noch die Erzeugung 
von nutzderdefinierten Zeichen auf beide LCDs erweitern, aber das ist 
Kosmetik.
Viel mehr muss man nicht machen.

Idealerweise solltest du eine etwas bessere Software nutzen, dann ist 
auch das Umbauen einfacher.

Beitrag "Re: I2CLCD Library für HD44780 LCDs"

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Idealerweise solltest du eine etwas bessere Software nutzen, dann ist
> auch das Umbauen einfacher.
>
> Beitrag "Re: I2CLCD Library für HD44780 LCDs"

Diese Library hatte ich schonmal ausprobiert, wegen HintergrundLED 
ein/aus schalten, habs aber wieder beiseite gelegt weil mir AtmelStudio 
ständig Fehler brachte.

von roehrenvorheizer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Im Prinzip sind Deine Ideen richtig, denn das 4x40 besteht aus zwei 
"normalen" 2x40 LCDs mit zwei getrennten Enable-Eingängen. Du kannst 
einfach ausprobieren, wie es reagiert und dem entsprechend mal den 
oberen oder den unteren Teil ansprechen. Die Initialisierung muß in 
jedem Schritt beide Teile ansteuern.

MfG

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen

hab mir das wesentlich komplizierter vorgestellt als wie es 
warscheinlich ist.
Da brauch ich wohl nur bei
void I2C_SetDisplayCursor(uint8_t y, uint8_t x)
reinschreiben,
wenn zeile 1 und 2 dann #define E_HIGH1   0b10000000
wenn zeile 3 und 4 dann #define E_HIGH2   0b01000000
sozusagen, oder muss ich woanders noch was ändern ?

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@ Hendrik (Gast)

>sozusagen, oder muss ich woanders noch was ändern ?

Natürlich. Überall dort, wo ein Schreib- ode Lesezugriff auf das LCD 
erfolgt. Z.B. bei der Datenausgabe . . .

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Natürlich. Überall dort, wo ein Schreib- ode Lesezugriff auf das LCD
> erfolgt. Z.B. bei der Datenausgabe . . .


Ich denke das ich erstmal direkt LCD1 und 2 anspreche:

// Wechsel zwischen LCD1 und LCD2
void I2C_UseDisplay(uint8_t lcd)
{
  if (lcd==1)
  {
    #define E_HIGH   0b10000000 // Enable LCD 1 = High
  }
  IF (lcd==2
  {
    #define E_HIGH   0b01000000 // Enable LCD 2 = High
  }
}
Ist denke erstmal die einfachere Lösung für mich zumindest, wenn ich 
soweit alles fertig gelötet habe, werd ich es mal so testen.
Muss ich die  LCD_I2C_Init da jetzt 2 x aufrufen für jedes LCD einzeln ?

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@ Hendrik (Gast)

>Ich denke das ich erstmal direkt LCD1 und 2 anspreche:

Ich denke, du solltest erstmal ein bischen in einem C-Buch blättern

>  if (lcd==1)
>  {
>    #define E_HIGH   0b10000000 // Enable LCD 1 = High
>  }

Das geht so nicht. Lerne den Unterschied zwischen einer Textersetzung 
per #define und einer echten Variable.

>Muss ich die  LCD_I2C_Init da jetzt 2 x aufrufen für jedes LCD einzeln ?

Sinnvollerweis natürlich nicht, weil man beide Initialisierungen in der 
Funktion vornimmt.

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Das geht so nicht.


Warning  1  "E_HIGH" redefined [enabled by default]

So in etwa meckert AtmelStudio auch gerade rum.

Na ich verschiebe das erstmal auf nächstes Jahr^^, ich wünsch euch einen 
guten Rutsch.

MFG Hendrik

von LCD_40x4 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
#define LCD_ENA1     0x10;  /*  PA4  */
2
#define LCD_ENA2     0x20;  /*  PA5  */
3
4
    if ( curr_lcd_line > 1 )  /* Zeile 0,1 --> ENA1, Zeile 2,3 --> ENA2 */
5
    {
6
        lcd_ena = LCD_ENA2;
7
    }
8
    else
9
    {
10
        lcd_ena = LCD_ENA1;
11
    }
12
    PORTA = PORTA |  lcd_ena;  /* Enable strobe aufuehren */
13
    _delay_us (LCD_STROBE_DELAY);
14
    PORTA = PORTA & ~lcd_ena;

... sonst dauert das hier noch endlose Wochen ...

von LCD_40x4 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiss das das nicht ganz auf die I2C-Version passt.
Hoffentlich sehen das die anderen auch ...

von Christian S. (roehrenvorheizer)


Bewertung
0 lesenswert
nicht lesenswert

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo und ein "Gesundes Neues" von mir.
Ich hab mir nochmal meine Gedanken gemacht,sprich gegoogelt und 
folgendes geschrieben


void I2C_UseDisplay(uint8_t LCD)
{
  if ( LCD == 1 )  // LCD 1 ( Zeile 1 und 2 )
  {
    #undef E_HIGH        // löscht E_HIGH
    #define E_HIGH 0b10000000   //  definiert E_HIGH neu (Enable1(PA7))
  }
  if ( LCD == 2 )    // LCD 2 (Zeile 3 und 4)
  {
    #undef E_HIGH         // löscht E_HIGH
    #define E_HIGH 0b01000000   // definiert E_HIGH neu (Enable2(PA6))
  }
}

von Atmelstudio kommt erstmal ein "Programm soweit okey".
Sollte das so funktionieren ?

von Joachim B. (jar)


Bewertung
-1 lesenswert
nicht lesenswert
Hendrik schrieb:
> Enable1 hab ich auf P7 und Enable2 ist auf
> P6.

warum 2 Bit verschwenden?
1 Bit reicht doch für 2 Zustände high low, ggffs. ein Inverter zum 
Display

Wenn nicht gerade am I2C Umstzer das die Hinrgrundbeleuchtung geschaltet 
werden soll dann kann man dieses Bit nutzen.

Die Hintergrundbeleuchtung würde ich lieber auf einen PWM Ausgang legen 
um zu dimmen

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@Hendrik (Gast)

>Ich hab mir nochmal meine Gedanken gemacht,sprich gegoogelt und
>folgendes geschrieben

Aber kein C-Buch gelesen, dann das dauert deutlich länger, bringt aber 
meist auch DEUTLICH mehr Erkenntnisse!

>    #undef E_HIGH        // löscht E_HIGH
>    #define E_HIGH 0b10000000   //  definiert E_HIGH neu (Enable1(PA7))
>  }

AUA!!! NEIN! Vergiss #define und sämtliche Präprozessoranweisungen! Du 
brauchst eine normale Variable.

>Sollte das so funktionieren ?

NEIN!

von LCD_40x4 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hendrik schrieb:
> Ich hab mir nochmal meine Gedanken gemacht

Ich glaub das dauert doch so lange.

LCD_40x4 schrieb:
> ... sonst dauert das hier noch endlose Wochen ...

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
LCD_40x4 schrieb:
> Ich glaub das dauert doch so lange.

Sorry wenns zu lang dauert,
wie Falk schon richtig erkannt hat, es fehlt ein richtiges C-Buch. Hab 
bis jetzt nur das "AVR" von Florian Schäffer.
Für mich ist das hier alles Neuland, da nur Hobby. Bis jetzt kopier ich 
meine display.h ins neue Programm und schreibe meinen Text und oder 
zahlen , fertig. Die display.h hab ich bis jetzt in keiner Zeile 
verändern müssen.

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Abend zusammen,

ich habe gestern zufällig diesen Adapter im Netz gefunden für 4x40 LCDs.

https://www.cctools.eu/download/Anleitungen/1040_V1-1.pdf

Ist, denke ich, eine gute Alternative und ich muss die vorhandene LCD 
Routinen nicht unnötig verändern.

Ich danke trotzdem für eure Hilfe...

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@ Hendrik (Gast)

>https://www.cctools.eu/download/Anleitungen/1040_V1-1.pdf

Naja.

>Ist, denke ich, eine gute Alternative und ich muss die vorhandene LCD
>Routinen nicht unnötig verändern.

Das wäre aber ein gute Übung gewesen. Wenn du schon vor so einer eher 
kleinen Anpassung wegläufst, wird das nie was mit dem Programmieren.

von Hendrik (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Das wäre aber ein gute Übung gewesen. Wenn du schon vor so einer eher
> kleinen Anpassung wegläufst, wird das nie was mit dem Programmieren.

da geb ich dir voll und ganz recht,  aber

LCD_40x4 schrieb:
> LCD_40x4 schrieb:
>> ... sonst dauert das hier noch endlose Wochen ...

In diesem Sinne

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.