Bascom BASCOM ; Erste Schritte zum Ausprobieren

Na wenn die Adresse falsch ist, ist es ja kein Wunder. Teste das nachher mal aus.
 
Auf diesem Video ist der PCF8574T zu sehen
Der PCF8574T ist das Modul, das im Video zu sehen ist?
Das Modul ist speziell für diesen LCD-Typ gebaut und das Poti darauf für die Kontrasteinstellung?

Der PCF8574xy ist ein nacktes IC, xy steht hier für die ein bis mehrere Zeichen lange Endung (T alleine gibt es dabei nicht), mit der angegeben wird, welches Gehäuse (PDIP, SOIC, VQFN...) der Chip hat. Wenn die Endung zusätzlich noch mit einem A beginnt, hat der Chip eine andere Adresse, wie @TommyB schon schrieb. Auf dem Modul kann sich sowohl der eine, als auch der andere befinden. Das kannst Du herausfinden, wenn Du den Aufdruck auf dem Chip direkt ansiehst.

Das im Video zu sehende LCD selbst hat offensichtlich eine 4- bzw. 8-bit Parallelschnittstelle, sonst würde man ja keinen I2C-zu-parallel-Umsetzer wie den PCF8574 benutzen.
Die von Dir hier benutzten Controller haben alle mehr als genug I/O-Pins, um das LCD direkt im 4-bit-Mode zu betreiben. Dazu reichen in der Regel sieben Port-Pins aus. Zusammen mit Vcc, GND und Kontrast werden dann zehn Leitungen am LCD angeschlossen.

Für I2C braucht es nur vier Leitungen, aber zusätzlich natürlich den I2C-zu-parallel-Umsetzer.
Wenn man mit wenigen Controllerpins auskommen muß, kann man natürlich auch gleich ein LCD nehmen, das direkt mit I2C oder SPI angesteuert werden kann.
 
Per Direktverkabelung hat er ja schon hin bekommen, aber es soll ja das LCD Modul mit I2C sein ;)
 
Hallo @Mikro23,
wie @TommyB schon sagte, ist das betreiben eines LCD's kein Problem. Da ich mir wegen dem Kabelsalat und dem Aufwand der Hintergrundbeleuchtung, ein I2C Display zugelegt hatte und dann weil alles funktionierte auch gleich noch ein 40x4 I2C Display bestellte, war auf dem Arduino alles ok. Doch de Arduino Zeit ging nur so lange, wie ich zuvor schon beschrieben hab.
 
Mal zu Arduino: laut Wikipedia steht das Wort für Hard- und Software, also sowohl die IDE als auch den Controller (nebst etwas zusätzlicher Beschaltung).
Da Du von "dem Arduino" gesprochen hattest, war ich von der Hardware (also dem Controller) ausgegangen, und das ist nunmal 'n stinknormaler AVR (jaja, inzwischen gibt's auch ...uinos die auf ARM und was weiß ich sonst noch für Controllern basieren, aber die Klassiker sind irgendwelche standard-AVR).

Und die AVR verarbeiten eben nur Maschinencode.

Und mit welcher Programmiersprache unter welcher Entwicklungsumgebung der Code erzeugt wurde - egal; beim Compilieren wird Maschinencode erzeugt.

Bootloader: gibt's natürlich auch in C, Bascom und Assembler - meiner Meinung nach unterstützt das Atmel Studio sogar den üblichen Arduino-Bootloader...

Zu I²C/Display: daß das Display eigentlich parallel arbeitet, und der PCF ein Portexpander ist, wurde ja bereits gesagt. Der PCF ist also für Dich quasi ein, über irgendeine Bibliothek angebundener zusätzlicher Port. Die Verschaltung der eigentlichen Beine dieses PCF-Ports zu den (parallelen) Beinen des Displays müssen in der Bibliothek natürlich auch stimmen (hast Du selbst drauf hingewiesen).

Wenn die Bibliothek den Expander jetzt nicht nur als Expander, sondern gleich im Zusammenhang mit dem Display nutzen soll, muß natürlich auch (zusätzlich) die Initialisierung des Displays stimmen...

Das kann dann schwierig werden, wenn man nicht weiß, was für ein konkretes Display da eigentlich verbaut ist.

Wenn Du...

also den physischen Aufbau geklärt hast (und in der Bibliothek angepaßt), und es auf einem Arduino läuft, demselben AVR (und identisch verdrahtet) unter Bascom aber nicht, wäre es am einfachsten, die Initialisierung unter Arduino-IDE mal mit einem Logicanalysator mitzulesen, und dann die Versuche unter Bascom damit zu Vergleichen.

Manchmal ist es lediglich ein Timing-Problem...
 
Also ich habe jetzt mal das Arduino rausgeholt den vorhandenen Code mit diesem Anfang


CodeBox C
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup()
{
  lcd.begin();
  lcd.backlight();
}

geladen. Alles perfekt. Warum da nur und nicht bei Bascom bzw. was mach ich an meinem Board falsch.
 
Da ich die Routine von Bascom nicht kenne... Die Adresse hat eigentlich nur 7 Bit, das Überbliebene definiert Read/Write Zugriff.
Probier unter Bascom mal &H4E als Adresse.
Unter der Voraussetzung dass alle Adressleitungen vom PCF auf Low liegen.
 
Der Code

CodeBox BascomAVR
$regfile = "m8def.dat"                  'ATMega8
$crystal = 8000000                      '8 MHz
$lib "Lcd_i2c.lib"
$hwstack = 64
$swstack = 10
$framesize = 40
'**********************************************************
'******************* Deklarationen ************************
Const Pcf8574_lcd = &H4E                'Adresse des I2C-LCDs  A0 - A2 =0
Dim _lcd_e As Byte
'****************** Initialisierung ***********************
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit
I2cstart                                'Die Schnittstelle öffnen
I2cwbyte &B10010000                     'Schreibadresse auf den Bus senden
I2cstop                                 'Die Schnittstelle Wieder Freigeben
Config Lcd = 16 * 2                     'nicht unbedingt nötig
Config I2cdelay = 1
Waitms 300                              'warte bis LCD-Initialisiert ist!

'******************** Hauptprogramm ***********************
Cls
Lcd "Hallo BASCOM LK"
Wait 1
Locate 1 , 1
Lcd "Thanks for help"
Wait 2
Locate 2 , 1                            'Damit Backlight-Zustand an LCD übermittelt wird
Do
nop
Loop
End
keine Anzeige
 
I2cwbyte &B10010000
Das passt auch überhaupt nicht.
Ergibt Hex 90.

Wirf mal n Blick in das Datenblatt:

Speziell:
8103
Das Adressbyte muss immer mit 0100 anfangen (0101 bei A Version). Dann kommen die 3 Adress Bits die du per Hardware festlegen kannst. Das letzte Bit definiert Lese-/Schreibzugriff.
 
Üben ;)
Du musst ja wissen auf welche Adresse der Chip hört.
Die hatte ich übrigens schon mehrfach gesagt, &H40.
Bei komplexeren Dingen, wie I2C Speicher, kommst du da überhaupt nicht drum herum.
 
Du sagst Üben. Wie soll ich das anstellen, wenn ich nicht einmal weiß, wo ich anfangen soll. Besser gesagt, woraus besteht und wie setzt sich so eine Adresse zusammen.
Könntest du das morgen mit mir mal durchgehen?
 
aber wo wird denn das LCD initialisiert?
Config Lcd = 16 * 2 'nicht unbedingt nötig
Wobei das die Einstellungen in den Compilersettings ersetzt - wenn das nicht dasteht, gelten die Compilersettings. Bascom initialisiert das selbst wegen Verwendung von "LCD blablub".
(Das einfachste Hello-World-Programm unter Bascom lautet

CodeBox BascomAVR
Print "diedeldum"
, wodurch genau dieser Text über den UART ausgegeben wird. Das Init erledigt Bascom dann bei Bedarf selbst, mit den Vorgaben aus den Comilersettings).

Beim LCD ist jedenfalls 4-Bit-Parallelmode Standard - es sei denn, irgend'ne Bibliothek übersteuert das. Im Code in #731 geschieht dies wahrscheinlich in Zeile 3 - was genau die Bibliothek macht, ist mir(!) unklar.
In Zeile 9 scheint eine Konstante festgelegt zu werden, die möglicherweise die Adresse des verwendeten Portexpanders festlegt. Wenn die Bibliothek vernünftig umgesetzt ist, sollte die Verwendung von standard-I²C-Instruktionen (Zeilen12..19) unnötig/unsinnig sein (möglicherweise wird sogar erst I²C für das LCD entsprechend der Bibliothek initialisiert, und danach wegen Zeile 16 alles reinitialisiert (also überschrieben!!)- das automatisch von Bascom aufgerufene Init des LCD sollte wegen der Bibliothek ja auf I²C umgeleitet werden, und dieses seinerseits entsprechend initialisieren. Ausgaben auf dem LCD sollten dann mit den LCD-Standard-Instruktionen erfolgen...

Aber dazu könnte vielleicht ein Bascom-Profi was sagen (ich bin keiner)… Cassio vielleicht?
 
Wobei das die Einstellungen in den Compilersettings ersetzt - wenn das nicht dasteht, gelten die Compilersettings. Bascom initialisiert das selbst wegen Verwendung von "LCD blablub".
Das heißt dann also man kann nur LCDs mit dem Standard-Controller HD44780 anschließen, wenn es automatisch erkannt werden soll. Wie sollte Bascom sonst erkennen, ob ein ST7036, UC170 , ST7565, UC1610 oder irgendein anderer LCD-Controller angeschlossen ist, wenn man es ihm nicht mitteilt?
 
irgendein anderer LCD-Controller angeschlossen ist, wenn man es ihm nicht mitteilt?
Wenn nichts angegeben wird, gilt das was bei den defaults steht. Config LCD ersetz/übersteuert die defaults, und da kannst Du optional auch einen LCD-Chipsatz angeben.
Config LCD ist Bestandteil der Bascom-Standard-Bibliothek. Bei Funktions/Subroutinen usw wird immer zuerst der Code durchsucht, dann die eingebundenen Bibliotheken (Reihenfolge wie im Code eingebunden), und zuletzt die Standard-Bibliothek. In der "Lcd_i2c.lib" die in Zeile 3 eingebunden wurde, können also durchaus Routinen enthalten sein, die die LCD-Routinen der Standard-Bibliotheken ersetzen.

Soweit ganz gut, und das gibt es (wahrscheinlich) auch bei anderen Sprachen - das Problem ist für mich die Dokumentation (der Biblioheken). Ich weiß eben nicht, ob durch die Einbindung dieser zusätzlichen Bibliothek die Initialisierung von I²C und danach dem Display bereits automatisch vorgenommen wird, und wie. Und die (Online)Hilfefunktionen liefern dann natürlich die Angaben, die eigentlich die Standard-Bibliothek betreffen...
Die Bibliotheken können quasi als Quelltext oder verschlüsselt angelegt werden - letztere lassen sich nicht wirklich einsehen (Du kannst natürlich das Compilat reassemblieren, aber...)


Das heißt dann also man kann nur LCDs mit dem Standard-Controller
Nein, Du kannst natürlich problemlos selbst auch alles im Code schreiben, ohne die vorgegebenen LCD-Instruktionen zu verwenden - Du kannst auch nahezu Problemlos mitten im Code Assembler einfügen (sogar auf Rechenregister-Ebene). Du kannst das ganze natürlich auch in eigene Bibliotheken packen. Und Du kannst in Deinen Bibliotheken Routinen verwenden, die Routinen anderer Bibliotheken ersetzen.
z.B. kannst Du mit Config SDA und Config SCL die I²C-Beine bekannt machen. Bascom legt dann intern Variablen/Konstanten für die Pin- und Port- und DDR-Register und Bits an. Und zwar, wenn im Code "I2Cinit" oder so aufgerufen wird. in der aufrufenden Bibliothek wird dann außerdem die TWI scharfgemacht (mit Parametern usw, glaub ich.)

Nun haben einige Controller ja kein I²C, sondern lediglich 'n USI. Wenn man jetzt aber 'ne Bibliothek dazu implementiert, die da Multi-Master-Arbitrierung unterstützen soll, und die Controllerunabhängig sein soll, und die die Satndard-I²C-Instruktionen von Bascom verwenden soll, muß man eben in der eigenen Bibliothek Routinen anlegen, die genauso heißen - insbesondere auch die I2Cinit-Routine.

Am Rande: wenn die I2Cinit als leere Routine entsprechend eingebunden wurde, werden trotzdem die Konstenten für die Beine angelegt - keine Ahnung wo Bascom das macht (wäre bei einigen anderen Sachen ja auch nützlich, bei OC-Pins von Timern zB...)
 

Ü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)