LCD 4x40 ansteuern über PCF8574 (I2C)

Gast #5260398
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
Angehängte Dateien:
#5260442
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"
Gast #5260483
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.
Gast #5260501
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
Gast #5261029
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 ?
Gast #5261210
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 ?
#5261234
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.
Gast #5261289
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 ...
Gast #5263315
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 ?
#5263322
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
#5263327
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!
Gast #5263372
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren