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

Hi Thomas,

Ein Problem besteht aber mit dem selbstdefinierten Zeichen chr(0). Es scheint, dass chr(0)
nicht in Strings verwendet werden kann, respektive wohl als Null ignoriert wird. Als Workaround
kann man das Zeichen chr(0) zwar definieren, aber dann halt nicht verwenden (wie in meinem
Beispiel-Code, das Grad-Zeichen ist dann nochmals als chr(7) definiert), oder mit der Funktion
"lcd4_data 0" direkt schreiben. Mit lcda y,x,"" den Cursor vorher setzen.
da bei Bascom das Stringende mit 0x00 definiert wird (in C ja auch) wird dir da wohl die Programmiersprache einen Strich durch die Rechnung machen. Du kannst das Zeichen nicht in einem normalen Textstring setzen da er sonst vor diesem Zeichen aus Bascom-Sicht beendet wäre.

Die Zeichenkette ... 0x03 , 0x00 , 0x34 , 0x53 , 0x00 ... hätte aus Bascom-Sicht nur die Länge von einem Zeichen. Nur das erste 0x03 da ja das zweite Zeichen 0x00 als String-Ende gilt.

Gruß
Dino
 
Hallo Dino
Vielen Dank für die Erklärung. In dem Fall wird der Workaround zum MUSS. Oder ich definiere einen andern
Wert "intern" als 0, z.B. 255 und prüfe bei der Ausgabe auf diesen Wert, um dann 0 zu senden.

Dankesgrüsse
Thomas
 
.. So, nun kann ich doch ohne "Altlast" an die Ansteuerung von andern Dislpays. Es gibt ja noch sooo vielen interessante Dislpays, z.B. die Kleinen OLED-Dinger mit SPI und SSD1306-Controller ...

Ist eigentlch da was draus geworden ?

Ich bin gerade an genau dem gleichen Problem dran, diese Zwergendisplays zum Rennen zu bekommen.

Thomas
 
Hallo Thomas

Leider nein, bin da mit ST7920 und dem neuen Code für die I2C/HD44780 Displays beschäftigt gewesen.
Der neue Code soll weitere Adaptionen erleichtern, ohne immer die Hex-Werte für andere PCF8574-
Belegungungen neu berechnen zu müssen.

Wie ich gesehen habe, hast du einen neuen Thread eröffnet zu den OLED-Displays, habe da schon ganz
interessiert mal reingeschaut. Gibt es denn noch Probleme mit dem Code?

Gruss
Thomas
 
Hi.

Nun ja, sagen wir es mal so. Der letztgepostete Code funktioniert, auch wenn ich ihn nicht komplett verstehe. Ich weiß nicht, wie der Author da die etwas größere Schrift rein bekommen hat ohne Fontabelle und so.

Ich möchte da aber auch Schriften größter als 16Pixel Höhe rein bekommen. Vor allem aber mit Kerning und "runden" Kanten, nicht einfach nur aus 1 Pixel 4 machen oder so. So ganz verstehe ich auch den Memoryzugriff in den Controller nicht, hier schweigt sich meiner Meinung nach das Datenblatt etwas aus. Ich meine, hier fehlen ein paar grundlegende Commands.

Aber bleiben wir hier beim PCF8574 und "drüben" beim SSD1306.

Thomas
 
Der neue Code soll weitere Adaptionen erleichtern, ohne immer die Hex-Werte für andere PCF8574-
Belegungungen neu berechnen zu müssen.


Hallo Thomas (riesen)!

Also wenn es dir nun darum gehen sollte......

"MWS" (MagicWhiteSmoke aus dem BASCOM-Forum) hat dazu mal vor einiger Zeit die LIB von Kent Andersson so angepasst, dass man jeden Pin frei definieren kann. :wink:
Einziger Wermutstropfen dabei ist, dass er das fehlerhafte INIT mit übernommen hat. Das sollte man also besser noch ändern!
Die LIB gibt es auch zum Beispiel bei MCS ganz offen im Forum.

Ansonsten bietet diese Variante aber alle Annehmlichkeiten, die eine BASCOM-LIB so mit sich bringt. :cool:
Beudetet also..... du kannst alle LCD-Standardbefehle in deinen Programmen verwenden und musst z.B. kein "Lcda_" benutzen.


Grüße,
Cassio
 
Hallo Cassio

Dann haben wir uns beide umsonst die Mühe gemacht, einen eigenen Code zu schreiben :) ???

Ja nun, unser Code macht das INIT sauber. Das Umwandeln von Zahlen in Strings und eventuell
Formatierungen sind ja schon toll, aber dafür hat man(n) was eigenes....

Habe übrigens im MCS-Forum die LIB (noch) nicht gefunden, hast du ev. den Link?

Gruss
Thomas
 
Hallo!

Kann man so nicht sehen......

Ich wusste zwar, dass es diese modifizierte LIB gibt, habe aber trotzdem eigene Routinen geschrieben. :wink:

Ich hatte ja vorher auch schon mal die original LIB für einen AVR-Praxis User auf sein Arduino-System geändert.....
und trotzdem wollte ich flexible Routinen erstellen, die OHNE LIB arbeiten!


Einen MCS-Link habe ich jetzt auch nicht für dich.
Sorry, da musst du halt selber schauen.
Außerdem möchte ich den Link in diesem Beitrag auch nicht lesen!

Allerdings bist du doch auch gerade so schön fleißig und ich bin der Meinung.....
Mach mit deinen Routinen ruhig erst mal weiter!

So eine fertige LIB kann ja schließlich jeder einbinden. :wink:


Grüße,
Cassio
 
Hallo Cassio

Wo du recht hast, hast du recht... einbinden kann jeder :)

Habe übrigens meinen Code noch modifizieren müssen. Ein 4x16 Display zeigte die Zeichen verschoben.
Deine Case-Steuerung für das Setzen des Cursor war da sehr hilfreich.

Bei mir reicht übrigens ein einziger Clear-Befehl, um das Display zu löschen, du hast ja da beide Hälften
separat gelöscht. Mein Code initialisiert immer 2 Zeilen-Displays (z.B. bei 20 Zeichen Displays sind das
ja dann 4 Zeilen). Habe da keine Nachteile festgestellt bei all meinen diversesn Displays.

Was meinst du übrigens sonst so zum Code? Er wird recht schnell abgearbeitet... kann diesen dann
auch gleich für die ST7920 Ansteuerung über I2C verwenden.

Abendgrüsse
Thomas
 
Hallo Thomas!

Zur Geschwindigkeit deines Programmes kann ich leider wenig sagen,
da ich es nicht ausprobiert habe.

Jedoch durch deinen "stückweisen" Aufbau der Daten und senden der einzelnen Werte gehe ich jetzt nicht davon aus, das es besonders schnell ist...... oder schneller als meins geworden ist. :wink:

Es kommt aber auch nicht immer auf die Geschwindigkeit an.... sondern eher auf Zuverlässigkeit. :)


Wenn ich mehr Zeit habe, kann ich mir deinen Programm ja mal genauer ansehen, oder sogar mal ausprobieren.


Grüße,
Cassio
 
Hallo Tefi,

2 Stunden keine Antwort im anderen Forum und schon probierst du es hier? Keine Geduld?
Bei Crosspostings darfst du auch hier nicht auf viel Resonanz hoffen.
 
Hallo Tefi

Deine Frage ist in diesem Thread wohl nicht richtig. Dein LCD besitzt eine komplett eigene Logik
und einen eigenen Befehlssatz. Hier im Thread ist ja beschrieben, wie man über einen "normalen"
I2C-Portbaustein PCF8574 die Standard-Befehle zum Standard-LCD mit HD44780 bringt.

Bei dir sollte die Sache einfacher sein, du brauchst ja nur die im Manual beschriebenen Befehle über
die I2C-Leitung an das LCD zu senden. Für das normale senden über I2C gibt es ja hier genügend
Beispiele. Wenn du viele komplett fertige LIB's verwenden möchtest, wechselst du vielleicht besser
auf die Auduino Oberfläche, hier findest du fast immer was. Aber wer will schon Mainstream .. :)

Gruss
Thomas
 
Hallo,
ich habe das Programm sowie die beiden subs (Beitrag #44, http://www.avr-praxis.de/forum/show...NE-LIB-betreiben&p=23642&viewfull=1#post23642) für das Pollin I2C LCD mal runtergeladen, bekomme beim Compilieren folgende Fehler:
Error : 1 Line : 171 Unknown statement [.EQU not found for:DDRA] , in File : D:\Program Files\Bascom\LCD\Pollin.bas
Error : 1 Line : 171 Unknown statement [.EQU not found for:DDRA] , in File : D:\Program Files\Bascom\LCD\Pollin.bas
Error : 1 Line : 171 Unknown statement [.EQU not found for:pORTA] , in File : D:\Program Files\Bascom\LCD\Pollin.bas
Error : 1 Line : 171 Unknown statement [.EQU not found for:pORTA] , in File : D:\Program Files\Bascom\LCD\Pollin.bas
Ich habe Bascom 2.0.7.6
Woran mag es liegen?
Gruss, elektroniklaie
 
Hallo elektroniklaie

Du hast wahrscheinlich den falschen AVR-Controllertyp ausgewählt, sieh
mal unter $REGFILE, ob da wirklich dein verwendeter Controller eingetragen
ist.

Tipp: Wenn du für den LCD-Anschluss beim Pollin-Board den doppelreihigen
Anschluss auf der Seite verwendest, unbdingt VCC und GND prüfen, für
meine Displays waren die genau vertauscht.

Hier noch der Link zu meinen Routinen, um ein LCD über I2C anzusteuern.
In diesem einen Code können alle Boards definiert werden.

http://www.avr-praxis.de/forum/show...rselle-Ansteuerung-(inkl-DEFLCDCHAR)-ohne-LIB

Gruss
Thomas
 
Thomas,
die Fehlermeldung kommt schon beim Compilieren des erwähnten Originalprogrammes, also ohne die Hardware anzuschliessen. Das komische ist, dass DDRA (PortA) angemeckert wird obwohl der ATmega8a das PortA gar nicht hat. Aber ich werde Deinen Code probieren, sobald ich ein Lebenszeichen auf dem LCD sehe... Oder muss man erst etwas auf das Board zu schreiben, um irgendetwas auf dem LCD zu bemerken? Muss man an den Jumpern auf dem Pollin-Board etwas einstellen?

Danke vielmals, elektroniklaie
 
Hallo,

die Fehlermeldung kommt schon beim Compilieren des erwähnten Originalprogrammes, also ohne die Hardware anzuschliessen. Das komische ist, dass DDRA (PortA) angemeckert wird obwohl der ATmega8a das PortA gar nicht hat.

Wenn im Programm DDRA drin steht, dann will der compiler natürlich diesen Registernamen in eine IO-Adresse umarbeiten. Wenn da aber in der Include-Datei (Definitionsdatei für den Controller) nix von DDRA drin steht dann kann er das nicht. Da ist ihm relativ egal was der Controller hat und was nicht. Wenn DDRA im Programm steht, dann ist da der Fehler. Also ein Programmierfehler oder du hast die Codeschnipsel nicht an deinen Controller angepaßt.

Gruß
Dino
 
Ich finde nirgendwo etwas von PortA (in dem Programm von Cassio aus Beitrag#44 und seinen beiden include-Dateien). Ist dann wohl ein Fall für das Bascom-Forum?
Gruss, elektroniklaie
 
Wo ist denn jetzt eigentlich Dein Problem?
Du schreibst, Du verwendest den ATmega8.
Dieser besitzt keinen A-Port.
Die Controllerdefinitionsdatei solltest Du inkludiert haben (Hinweis von risen).
Darin werden logischerweise die Registeradressen des A-Ports auch nicht benamst.
Deine Fehlermeldung besagt, daß der Compiler in Zeile 171 der (eventuell inkludierten) Datei "Pollin.bas" über "DDRA" und "PORTA" stolpert, und das mehrfach (in einer Zeile?)
Was steht denn in dieser Zeile?
(Diese Datei finde ich nämlich nicht in #44 von Cassio)

P.S.: vielleicht stellst Du Deinen kompletten Code mal hier in 'nem Code-Fenster ein.
Achso, ein Doppelklick auf die Fehlermeldung sollte Dich direkt dahin springen lassen...
 
Hallo LotadaC,
ich benutze die ungeänderten Dateien von Cassio (#44). Ich stelle das Hauptprogramm hier nochmal ein, da könnte natürlich ein Fehler durch das Copy und Paste sich eingeschlichen haben.
Zeile 171 gibt es nicht. Die include Dateien sind die aus Beitrag #44 heruntergeladenen -auch da kein PortA zu erkennen.
Gruss, elektroniklaie
Code:
         ' Polin I2C Platine
'http://www.avr-praxis.de/forum/showthread.php?2130-I2C-LCD-%28-auch-Arduino-%29-mit-PCF8574-OHNE-LIB-betreiben&p=23642&viewfull=1#post23642
$regfile = "m8adef.dat"
$crystal = 8000000                                          'intern !

$hwstack = 128
$swstack = 128
$framesize = 128


'                   +---v---+
'       (RESET) PC6 |1    28| PC5 (ADC5/SCL)
'         (RXD) PD0 |2    27| PC4 (ADC4/SDA)
'         (TXD) PD1 |3    26| PC3 (ADC3)
'        (INT0) PD2 |4    25| PC2 (ADC2)
'        (INT1) PD3 |5    24| PC1 (ADC1)
'      (XCK/T0) PD4 |6    23| PC0 (ADC0)
'               VCC |7    22| GND
'               GND |8    21| AREF
' (XTAL1/TOSC1) PB6 |9    20| AVCC
' (XTAL2/TOSC2) PB7 |10   19| PB5 (SCK)
'          (T1) PD5 |11   18| PB4 (MISO)
'        (AIN0) PD6 |12   17| PB3 (MOSI/OC2)
'        (AIN1) PD7 |13   16| PB2 (SS/OC1 B)
'        (ICP1) PB0 |14   15| PB1 (OC1A)
'                   +-------+

Ddrd = &B_0000_0000                                         '1 ist Ausgang 0 ist Eingang
Portd = &B1111_1111                                         'auf Hi oder Low setzen

Ddrc = &B_11_0000                                           '1 ist Ausgang 0 ist Eingang
Portc = &B00_1111                                           'auf Hi oder Low setzen

Ddrb = &B_0000_0000                                         '1 ist Ausgang 0 ist Eingang
Portb = &B1111_1111                                         'auf Hi oder Low setzen


' ==============================================================================
$include "_pollin_I2C_declare.bas"
'LCD-Funktionen sind:
'Lcd_          = zum Ausgeben von Zeichen/Text (nur String)
'Lcd_cls       = Clear Screen
'Lcd_init      = LCD initialisieren
'Hbl (Ein/Aus) = HintergrundBeLeuchtung Ein/Aus schalten

'**********************************************
'Angaben zum Display einstellen! Beispiel 4x16:
Lcd_zeilen = 4                                              'Anzahl der LCD-Zeilen eintragen!
Lcd_spalten = 16                                            'Anzahl der LCD-Charakter angeben
'**********************************************

'**********************************************
'TWI-Adresse des LCD-Bausteins angeben:
Const Pcx_pollin = &H40                                     'I2C-Adresse des PCx8574(A)
'**********************************************


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


' ==============================================================================
' I2C-Hardware-Config
$lib "i2c_twi.lbx"
'Config Twi = 250000                                         'BUS-Takt,


' I2C-Software-Config
'Config Scl = Portc.0                                        'I2C SCL
'Config Sda = Portc.1                                        'I2C SDA

'Config I2cdelay = 1

'I2cinit
' ==============================================================================


Lcd_init                                                    'LCD initialisieren
Waitms 50
Lcd_cls                                                     'Clear Screen
Waitms 200
' ################################################
' #                                              #
' #---------------Arbeitsschleife----------------#
' #                                              #
' ################################################
Do                                                          'Hauptschleife-Beginn

Hbl Ein                                                     'Beleuchtung ein

Lcd_ 1 , 1 , "CassioAVR-Praxis"
Waitms 500


Text = "PortD=" + Bin(pind) + "OK"
Lcd_ 2 , 1 , Text
Waitms 500


Lcd_ 3 , 1 , "1234567890123456"
Lcd_ 4 , 9 , "12345678"
Waitms 500


Hbl Aus                                                     'Beleuchtung aus
Waitms 250
Hbl Ein                                                     'Beleuchtung ein
Waitms 250
Hbl Aus                                                     'Beleuchtung aus
Waitms 250

Lcd_cls
Waitms 250

Loop                                                        'Hauptschleife-Ende


End                                                         'end program


' ####################
$include "_pollin_I2C_subs.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)