Bascom I2C : LCD ( auch Arduino ) mit PCF8574 OHNE LIB betreiben

:) Ach jee Cassio: Du wolltest dir doch den Code mal genauer anschauen... dann siehst du...

Prinzip wie deine Lösung, Umsetzung mit der flexiblen Pin-Ansteuerung aber doch
wirklich anders und neu und ohne Bit-Rechnerei ... :)

Habe immer offen erwähnt, dass dein Code die Grundlage war ...

Viele Grüsse
Thomas
 
Hallo Cassio
Hab da mal ein kleine proplem wie ne Frage zu dein code

Hier mal mein Propier Code:


CodeBox BascomAVR
 
'-----------------------------------------------
$lib "Lcd_i2c.lib"       'ersetzt die Standard LCD Library
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config I2cdelay = 15     'delay von 15=20µs=50kHz,10=10µs=100kHz;5=5µs=200KHz
Config Scl = Portc.5     'I2C SCL Pin
Config Sda = Portc.4     'I2C SDA Pin
I2cinit

' Subroutinen für LCD==SCHLAFZIMMER====================================================
Declare Sub Lcd2_(byval X1 As Byte , Byval X2 As Byte , Byval Text2 As String * 16)
Declare Sub Lcd2_cls
Declare Sub Lcd2_init
Dim Text2 As String * 16 'LCD Ausgabe
Dim Lcd2_text(16) As Byte At Text2 Overlay       'ASCII-Werte der LCD Ausgabe
Dim Pos2 As Byte         'Locate Berechnung
Const Pcx_lcd2 = &H72    'I2C-Adresse des PCF8574A

'-----------PCF8574A-----------
'             __
'      A0  -o|1 |o-  Vdd
'      A1  -o|  |o-  SDA
'      A2  -o|  |o-  SCL
'      D4  -o|  |o-  n.c. (INT)
'      D5  -o|  |o-  E1
'      D6  -o|  |o-  E2
'      D7  -o|  |o-  RW
'     GND  -o|_9|o-  RS


' Subroutinen für LCD==SCHREIBTISCH=================================================
Declare Sub Lcd1_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 20)
Declare Sub Lcd1_cls
Declare Sub Lcd1_init
Dim Text1 As String * 20 'LCD Ausgabe
Dim Lcd1_text(20) As Byte At Text1 Overlay       'ASCII-Werte der LCD Ausgabe
Dim Pos1 As Byte         'Locate Berechnung
Const Pcx_lcd1 = &H70    'I2C-Adresse des PCF8574A

'-----------PCF8574A-----------
'             __
'      A0  -o|1 |o-  Vdd
'      A1  -o|  |o-  SDA
'      A2  -o|  |o-  SCL
'      D4  -o|  |o-  n.c. (INT)
'      D5  -o|  |o-  E1
'      D6  -o|  |o-  E2
'      D7  -o|  |o-  RW
'     GND  -o|_9|o-  RS


Dim Init(8) As Byte      'Byte-Array für LCD-Parameter
Dim Ascii_zeichen(10) As Byte       'getrennte ASCII-Werte zur Übermittlung
Dim Zz As Byte           'Zeichenzähler
Dim Zi As Byte           'Zeichen-Indexzähler


Lcd1_init                'LCD zum Betrieb initialisieren
Lcd2_init                'LCD zum Betrieb initialisieren



Do
Lcd1_ 1 , 1 , "display 1"
Lcd1_ 2 , 1 , "Wunderbar"
Wait 3
Lcd2_ 1 , 1 , "Display 2"
Lcd2_ 2 , 1 , "Es Geht"
Wait 3
Lcd1_cls
Lcd2_cls
Loop







' #############################################################################
Sub Lcd1_(x1 As Byte , X2 As Byte , Text1 As String * 16)       'Sub zur Zeichenausgabe am Display
$include "_1_2704_i2c.bas"

' #############################################################################
Sub Lcd1_cls:            'Sub zum löschen beider Displayhälften
$include "_1_2704_CLS.bas"

' #############################################################################
Sub Lcd1_init:           'Sub zum initialisieren beider Displayhälften
$include "_1_2704_init.bas"

' #############################################################################
Sub Lcd2_(x3 As Byte , X4 As Byte , Text1 As String * 16)       'Sub zur Zeichenausgabe am Display
$include "_2_2704_i2c.bas"

' #############################################################################
Sub Lcd2_cls:            'Sub zum löschen beider Displayhälften
$include "_2_2704_CLS.bas"

' #############################################################################
Sub Lcd2_init:           'Sub zum initialisieren beider Displayhälften
$include "_2_2704_init.bas"


soweit so gut jetzt habe ich das

CodeBox BascomAVR
LCD16_
und das

CodeBox BascomAVR
LCD_
in


CodeBox BascomAVR
LCD1_
und

CodeBox BascomAVR
LCD2_
geändert weil:
ich würde mit diesen code 2 2x16LCD Module ansteuern bascom sagt Fehler in
Bascom Fehler 2x16 LCD an PCF8574.PNG
ich habe auch diese sub abgespeichert ( lcd_1_ ) (lcd1_cls:)(lcd1_init)

Habe ich irgendwo was vergessen.... Bitte um rat und Hilfe Bitte

Gruß Thorsten Sch.
 
Hallo Thorsten!

Ich müsste mich jetzt selber erst mal wieder reindenken....
schließlich ist es schon über fünf Jahre her. :eek:

Schau doch dir einfach mal das Beispiel mit der Combi aus PCx8574 und dem PCx8575 an.
Das ist letztlich nichts anderes als deine Idee mit den zwei Displays. :)
Musst halt nur die Matrix-Tastatur weglassen. ;)


Die Fehlermeldung von BASCOM deutet lediglich darauf hin, dass die Routinen nicht beendet werden können.
Schau einfach noch mal genau nach und im Zweifel mach es nacheinander.
Also erst das eine Display mit den entsprechenden Routinen und dann das Zweite.
Wenn beide fehlerfrei laufen machst du aus beiden Programmen ein Ganzes. :)

Grüße,
Cassio
 
Hi Cassio,

Ich hab mir jetzt Deine eigentlichen Routinen noch nicht angesehen, aber ist mein obiger Vorschlag damit umsetzbar (wird jede Routine vor weiteren Aktionen komplett abgearbeitet, oder laufen die im Hintergrund weiter)?
Also statt zweimal identische Routinen(mit unterschiedlichen konstanten SLA-Adressen) die bestehenden Routinen um eine SLA-Adresse als Parameter erweitern, und die dann in den Routinen statt der konstant vorgegebenen Adresse verwenden...
 
Ok, ich bin lange aus Bascom raus, aber würde es nicht reichen Pcx_lcd nicht als Const sondern als Variable, also Byte zu deklarieren? Denn könnte man sich das ganze gedoppel sparen.

Pseudocode:
Pcx_lcd = &H70 ' Display 1
LCD_Init
Pcx_lcd = &H72 ' Display 2
LCD_Init
...
Pcx_lcd = &H70 ' Display 1
LCD_ 1, 1, "Test"
Pcx_lcd = &H72 ' Display 2
LCD_ 1, 1, "Text"
 
Das wäre ja quasi dasselbe wie bei meinem Vorschlag, nur eben ... minimal-invasiv...
(Hier wäre die Variable global definiert, bei mir würde sie immer erst bei einem Funktionsaufruf allokiert werden, und nur während der Laufzeit der Funktion existieren. Dafür müßten allerdings alle Deklarationen, Aufrufe und die (extern ausgelagerten) Funktionen selbst um den Parameter modifiziert werden.)

Beide Methoden bringen nur was, wenn (wie oben gesagt) jeder Funktionsaufruf immer erst komplett abgearbeitet wird, bevor das Programm was anderes tut.
Gerade bei eher langsamen Kommunikationsprotokollen, und unter zeitkritischen Bedingungen macht es Sinn, die Kommunikation selbst nur anzustoßen, und dann zB Interruptgesteuert fortzusetzen/überwachen...
 
Huch, der Post ist an mir vorbei gegangen. Sorry
 
Naja, Dein Vorschlag sollte halt verblüffend einfach umzusetzen sein (gerade unter Bascom usw).
 
Tach,
in Deinem Programm kommt vor:
$include "_2704_CLS.bas"
allein, trotz langem Guhgeln kann ich dieses Programm nicht finden.
Was mache ich falsch ?
<ToS>
 
Habe nun die drei Include-Dateien ausgelagert und kriege nur Fehlermeldungen:

Was mache ich falsch ?

43903547470_28b157f3ae_o_d.jpg
 
Richtiges Einrücken würde schon helfen... (dem Compiler ist es egal, aber dem Auge würde es auffallen.

Sub mach was
include datei

Sub machwasanderes
include anderedatei

In nahezu jeder Sprache muss man abschließen, Python ausgenommen. Wenn man da nicht richtig einrückt hat man von vorn herein verloren.



CodeBox BascomAVR
If
    ...
End If
Do
    ...
Loop
While
    ...
Wend
Sub
   ...
End Sub


Also. Wo ist dein End Sub? Bzw. warum ist die Sub Deklaration im Hauptprogramm?

Auf den ersten Blick (verkürzt aber eingerückt):
Code:
sub abc
    include def
        sub ghi
            include jkl
...

Offensichtlich, da passt was nicht ;)
 
Hat Bascom das mittlerweile? Bei .Net ist sowas ja Standard...
 
Ja, allerdings mußt Du es manuell auslösen, und irgendwo hat es bei mir auch mal hartnäckig nicht gepaßt (war irgendwie mit bedingter compilierung und includes oder so).
ist sowas ja Standard...
Da rückt er ja schon beim schreiben ein. Außerdem kannst Du da auch Blöcke "einklappen" - das kann Bascom nicht...
Das automatische vervollständigen von "Rümpfen" hingegen (.NET) kann aber auch stören - wenn Du nachträglich um irgend'nen CodeBlock 'nen If-Then-Else konstruieren willst, und Dir der Compiler ständig an der falschen Stelle 'n End hinballert…
Aber wir sind :offtopic:

SUB blablub .. ist ja quasi der Anfang der Subroutine, der Einsprungpunkt. beendet wird sie mit einem End Sub oder so.

Zeilentrafo inkludiert danach je externen Code, wenn der das fehlende End Sub (ohne weiteres SUB blablub) enthält, paßts - es macht nur den Code weniger lesbar/schwerer zu debuggen (insbesondere für Fremde)…
In dem Zusammenhang: Normalerweise bekommst Du ja bei einem Fehler 'ne Zeile genannt, und kannst mit einem Klick direkt dahin navigieren - sind Code-Teile extern, und tritt dort der Fehler auf, ist die Zeilenangabe manchmal absurd, und der Sprung geht nicht...
 
Hallo @Cassio,
kannst du mir helfen?

Ich habe ein 16*2 LCD, allerdings mit einem PCF8547T I2C (China-Produkt).
I2C.jpg
Leider bekomme ich weder mit der "Lcd_i2c.lib" noch nach der Beschreibung in diesem Thread nicht einmal die einfachste Anzeige zustande.
Das LCD ist ok, den auf einem Arduino hat es funktioniert.
Hat die Endbezeichnung "T" etwas ausschlagendes damit zu tun?
 
Zuletzt bearbeitet:
Hier noch der Code, von dem ich glaube alles richtig gemacht zu haben.


CodeBox BascomAVR
$regfile = "m32adef.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 40
$framesize = 40
Declare Sub Lcd_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 27)
Declare Sub Lcd_cls
Declare Sub Lcd_init
Dim Text As String * 27                 'LCD Ausgabe
Dim Lcd_text(27) As Byte At Text Overlay       'ASCII-Werte der LCD Ausgabe
Dim Init(8) As Byte                     'Byte-Array für LCD-Parameter
Const Pcx_lcd = &H72                    'I2C-Adresse des PCx8574(A)
' I2C-Config
Config Scl = Portc.0                    'I2C SCL
Config Sda = Portc.1                    'I2C SDA
Config I2cdelay = 1
I2cinit
' ==============================================================================
Do
   Lcd 1 , 1 , "display 1"
   Lcd 2 , 1 , "Wunderbar"
   Wait 3
Loop
End
' #############################################################################
Sub Lcd_(x1 As Byte , X2 As Byte , Text1 As String * 27)       'Sub zur Zeichenausgabe am Display
   $include "_2704_i2c.bas"
' #############################################################################
   Sub Lcd_cls:                            'Sub zum löschen beider Displayhälften
   $include "_2704_CLS.bas"
' #############################################################################
   Sub Lcd_init:                           'Sub zum initialisieren beider Displayhälften
   $include "_2704_init.bas"
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)