Die zwischenzeitlich verbesserten und überarbeiteten Routinen zum Ansteuern gibt es HIER (einfach drauf klicken)!
Hallo zusammen!
Wie der Eine oder Andere von euch vielleicht bekommen hat, habe ich ja schon einige Male versucht die alten 27x4 Pollindisplays am I2C-Bus zu betreiben.
Wie ihr einmal in diesem Beitrag und in diesem Beitrag sehen könnt, war das gar nicht so einfach.
Da es zum Betrieb eines HD44780-LCD`s schon seit Jahren eine LIB von Kent Andersson dazu gibt, basierten auch alle meine Versuche auf dieser LIB.
Leider kann man mit der LIB das Display nicht betreiben!
Das liegt zum Einen daran, dass es im INIT der LIB einen Fehler gibt!
Zur Initialisierung des LCD`s im 4-Bit Modus muss folgendes gesendet werden:
&H03, &H03, &H03, &H02,......
Durch einen Fehler in der Kent Andersson LIB wird aber immer:
&H03, &H00, &H00, &H02,......
gesendet!
Das war aber NICHT der alleinige Grund, warum das 27x4 LCD nicht funktionieren wollte.
Ich möchte aber an dieser Stelle jetzt nicht alles wiederholen, was mir so aufgefallen ist und was ich alles ausprobiert habe.......
Aus dem Grunde komme ich zum Wesentlichen!
Da ich keine Möglichkeit gefunden habe das Display mit der Kent Andersson LIB zu betreiben, habe ich das Übermitteln der Daten dann selbst in die Hand genommen.
Es werden also alle Steuer- und Datensignale im Programm selbst erzeugt und per I2C auf den Weg gebracht.
Hierfür habe ich einige Subroutinen geschrieben, die zum Einen das Aufteilen der Bytes für den 4-Bit Modus erledigen und zum Anderen die genaue Zeichenstelle am Display berechnen.
Diese Daten werden teilweise in ein Array zusammen gefasst und dann über den I2C-Bus zum Display übertragen.
Damit die "Bedienung" beim Programmieren möglichst einfach ist, kann ich zur Displayausgabe folgendes verwenden:
Die Angabe "LCD_" kombiniert dabei zwei BASCOM-Anweisungen.....
Einmal "Locate" und einmal "Lcd" !
Mit meiner Anweisung "Lcd_" kann man also die Displayzeile (1-4) auswählen, die Ziffernstelle (1-27) festlegen und sofort noch den Text (27 Zeichen maximale Länge) mit angeben.
Es muss zum Verarbeiten der Daten auch kein "GOSUB" oder "CALL" ausgeführt werden!
Lange Rede, kurzer Sinn.....
Ich stelle hier jetzt einfach mal den ersten Teil von meinen Programmcode ein.
Schließlich kann man Ausführungen zu einem Programm meistens besser nachvollziehen, wenn man das Programm im Ganzen schon mal gesehen hat.
Da ich mit dem vollständigen Programm leider die max. Zeichengrenze des Beitrags überschreite, hier der erste Teil:
Obendrein mal ein kleiner Ausschnitt von der Ansteuerung des Displays am PCf8574:
.....gleich gehs dann weiter mit dem Programm!
Hallo zusammen!
Wie der Eine oder Andere von euch vielleicht bekommen hat, habe ich ja schon einige Male versucht die alten 27x4 Pollindisplays am I2C-Bus zu betreiben.
Wie ihr einmal in diesem Beitrag und in diesem Beitrag sehen könnt, war das gar nicht so einfach.
Da es zum Betrieb eines HD44780-LCD`s schon seit Jahren eine LIB von Kent Andersson dazu gibt, basierten auch alle meine Versuche auf dieser LIB.
Leider kann man mit der LIB das Display nicht betreiben!
Das liegt zum Einen daran, dass es im INIT der LIB einen Fehler gibt!
Zur Initialisierung des LCD`s im 4-Bit Modus muss folgendes gesendet werden:
&H03, &H03, &H03, &H02,......
Durch einen Fehler in der Kent Andersson LIB wird aber immer:
&H03, &H00, &H00, &H02,......
gesendet!
Das war aber NICHT der alleinige Grund, warum das 27x4 LCD nicht funktionieren wollte.
Ich möchte aber an dieser Stelle jetzt nicht alles wiederholen, was mir so aufgefallen ist und was ich alles ausprobiert habe.......
Aus dem Grunde komme ich zum Wesentlichen!
Da ich keine Möglichkeit gefunden habe das Display mit der Kent Andersson LIB zu betreiben, habe ich das Übermitteln der Daten dann selbst in die Hand genommen.
Es werden also alle Steuer- und Datensignale im Programm selbst erzeugt und per I2C auf den Weg gebracht.
Hierfür habe ich einige Subroutinen geschrieben, die zum Einen das Aufteilen der Bytes für den 4-Bit Modus erledigen und zum Anderen die genaue Zeichenstelle am Display berechnen.
Diese Daten werden teilweise in ein Array zusammen gefasst und dann über den I2C-Bus zum Display übertragen.
Damit die "Bedienung" beim Programmieren möglichst einfach ist, kann ich zur Displayausgabe folgendes verwenden:
Code:
Lcd_ 2 , 3 , "CASSIO by AVR-Praxis.de "
Die Angabe "LCD_" kombiniert dabei zwei BASCOM-Anweisungen.....
Einmal "Locate" und einmal "Lcd" !
Mit meiner Anweisung "Lcd_" kann man also die Displayzeile (1-4) auswählen, die Ziffernstelle (1-27) festlegen und sofort noch den Text (27 Zeichen maximale Länge) mit angeben.
Es muss zum Verarbeiten der Daten auch kein "GOSUB" oder "CALL" ausgeführt werden!
Lange Rede, kurzer Sinn.....
Ich stelle hier jetzt einfach mal den ersten Teil von meinen Programmcode ein.
Schließlich kann man Ausführungen zu einem Programm meistens besser nachvollziehen, wenn man das Programm im Ganzen schon mal gesehen hat.
Da ich mit dem vollständigen Programm leider die max. Zeichengrenze des Beitrags überschreite, hier der erste Teil:
Code:
'CASSIO by AVR-Praxis Forum
'25.12.2011
'I2C Ansteuerung eines 27x4 LCD
$regfile = "m16adef.dat"
$crystal = 8000000 ' Intern !
$hwstack = 128
$swstack = 128
$framesize = 128
' ATmega16
' +---v---+
' (XCK/T0) PB0 |1 40| PA0 (ADC0)------Taster1
' (T1) PB1 |2 39| PA1 (ADC1)------Taster2
' (INT2/AIN0) PB2 |3 38| PA2 (ADC2)--DB4
' (OC0/AIN1) PB3 |4 37| PA3 (ADC3)--DB5
' (SS) PB4 |5 36| PA4 (ADC4)--DB6
' (MOSI) PB5 |6 35| PA5 (ADC5)--DB7
' (MISO) PB6 |7 34| PA6 (ADC6)--RS
' (SCK) PB7 |8 33| PA7 (ADC7)
' RESET |9 32| AREF
' VCC |10 31| GND
' GND |11 30| AVCC
' XTAL2 |12 29| PC7 (TOSC2)--E1
' XTAL1 |13 28| PC6 (TOSC1)--E2
' (RXD) PD0 |14 27| PC5 (TDI)
' (TXD) PD1 |15 26| PC4 (TDO)
' (INT0) PD2 |16 25| PC3 (TMS)
' (INT1) PD3 |17 24| PC2 (TCK)
' (OC1B) PD4 |18 23| PC1 (SDA)-------I2C
' (OC1A) PD5 |19 22| PC0 (SCL)-------I2C
' (ICP1) PD6 |20 21| PD7 (OC2)-------LED
' +-------+
'
' ================================================
' Bestimme die Ein- und Ausgänge
Ddra = &B_0000_0000 '1 ist Ausgang 0 ist Eingang
Porta = &B1111_1111
Ddrb = &B_0000_0000 '1 ist Ausgang 0 ist Eingang
Portb = &B1111_1111
Ddrc = &B_0011_1111 '1 ist Ausgang 0 ist Eingang
Portc = &B1100_0000
Ddrd = &B_1111_1111 '1 ist Ausgang 0 ist Eingang
Portd = &B0000_0000 'auf Hi oder Low setzen
Led Alias Portd.7
Taster Alias Pina.0
Taster2 Alias Pina.1
' ==============================================================================
' I2C-Config
Config Scl = Portc.0 'I2C SCL
Config Sda = Portc.1 'I2C SDA
Config I2cdelay = 1
I2cinit
Const Pcf8574_lcd = &H74 'I2C-Adresse des PCx8574(A)
Gosub Lcd_init
' 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
' ==============================================================================
Declare Sub Lcd_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 27)
Dim Pos As Byte 'Locate Berechnung
Dim Text As String * 27 'LCD Ausgabe
Dim Lcd_text(27) As Byte At Text Overlay 'ASCII-Werte der LCD Ausgabe
Dim Ascii_zeichen(4) As Byte 'getrennte ASCII-Werte zur Übermittlung
Dim Zz As Byte 'Zeichenzähler
Dim Zi As Byte 'Zeichen-Indexzähler
Dim Init(4) As Byte 'Byte-Array für LCD-Parameter
Dim I As Byte 'Indexzähler
Dim Tb As Bit 'Toggle-Bit
Dim Ab As Bit 'Anzeige-Bit
' #############################################################################
' Anfangswerte:
Tb = 0 'Toggel-Bit auf 0
Ab = 0 'Taster-Bit auf 0
' ################################################
' # #
' #---------------Arbeitsschleife----------------#
' # #
' ################################################
Do 'Hauptschleife-Beginn
If Taster2 = 0 Then 'CLS und Zähler-Test
Gosub Lcd_cls 'beide Displayhälften löschen
Waitms 250
Bitwait Taster2 , Set
For I = 0 To 255 Step 5 'Variablenausgabe-Test
Text = Str(i) 'Binär zu String wandeln
Lcd_ 2 , 13 , Text
Lcd_ 3 , 13 , Text
' Waitms 1
Next I
Waitms 500
Gosub Lcd_cls 'beide Displayhälften löschen
Reset Tb 'Toggel-Bit auf 0
Reset Ab 'Taster-Bit auf 0
Else
End If
If Taster = 0 Then 'Displayanzeige wechseln
Toggle Tb
Reset Ab
Waitms 250
Bitwait Taster , Set
Else
End If
If Tb = 0 Then
If Ab = 0 Then
Led = 0
Gosub Lcd_cls
Lcd_ 1 , 1 , "27x4 LCD mit E + E2 via I2C"
Lcd_ 2 , 3 , "CASSIO by AVR-Praxis.de "
Lcd_ 2 , 1 , "*"
Lcd_ 2 , 27 , "*"
Set Ab
Else
End If
Else
If Ab = 0 Then
Led = 1
Lcd_ 3 , 2 , "fertig gestellt: 25.12.11 "
Lcd_ 4 , 4 , "I2C manuell gesteuert "
Lcd_ 4 , 1 , "!!"
Lcd_ 4 , 26 , "!!"
Set Ab
Else
End If
End If
Loop 'Hauptschleife-Ende
End 'end program
Obendrein mal ein kleiner Ausschnitt von der Ansteuerung des Displays am PCf8574:
.....gleich gehs dann weiter mit dem Programm!