Hallo zusammen!
Es hat mich einfach nicht in Ruhe gelassen und darum habe ich bei mir das LCD-Modul mal nachgestellt.
Testaufbau.....
Mega16 ---> PCF8574A ---> 4x16
Hier mal der Testcode und die Anschlussbelegungen:
Code:
'
$regfile = "m16def.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)
' (OC0/AIN1) PB3 |4 37| PA3 (ADC3)
' (SS) PB4 |5 36| PA4 (ADC4)
' (MOSI) PB5 |6 35| PA5 (ADC5)
' (MISO) PB6 |7 34| PA6 (ADC6)
' (SCK) PB7 |8 33| PA7 (ADC7)
' RESET |9 32| AREF
' VCC |10 31| GND
' GND |11 30| AVCC
' XTAL2 |12 29| PC7 (TOSC2)
' XTAL1 |13 28| PC6 (TOSC1)
' (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_1111_1111 '1 ist Ausgang 0 ist Eingang
Portc = &B0000_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
' ================================================
' Globale Interrupts einschalten
'Enable Interrupts
' ==============================================================================
' I2C-Config
Config Scl = Portc.0 'I2C SCL
Config Sda = Portc.1 'I2C SDA
Config I2cdelay = 1
I2cinit
'**************************************************************
' I2C LCD (Kent Andersson)-----------------------------------
$lib "Lcd_i2c-arduino2.lib" 'TEST-LIB für ein Arduino-I2C-LCD
Const Pca8574_lcd = &H70 'I2C-Adresse des PCx8574(A)
'!rcall _init_LCD
Dim _lcd_out As Byte
Const Bl_ein = 8
Const Bl_aus = 0
' PCx8574(A)
' __
' A0 -o|1 |o- Vdd
' A1 -o| |o- SDA
' A2 -o| |o- SCL
' RS -o| |o- n.c. (INT)
' RW -o| |o- DB7
' E -o| |o- DB6
' BL -o| |o- DB5
' GND -o|_9|o- DB4
' LCD 4x16
' ---------------o Vss----------+
' | o Vdd |
' | o Vo |
' | o RS |
' | o R/W----------+
' | LCD o E |
' | o DB0----------+
' | 4x16 o DB1----------+
' | o DB2----------+
' | o DB3----------+
' | o DB4 |
' | HD44780 o DB5 ===
' | o DB6 GND
' | o DB7
' | o LED+
' | o LED-
' | |
' | |
' | |
' | |
' | |
' | |
' | |
' | |
' | |
' ---------------
' ==============================================================================
Dim I As Byte 'Indexzähler
Dim Tb As Bit 'Toggle-Bit
Dim Ab As Bit 'Anzeige-Bit
Dim Licht As Bit 'Beleuchtungsbit
' #############################################################################
' Anfangswerte:
Cls
Tb = 0
Ab = 0
_lcd_out = Bl_aus
' ################################################
' # #
' #---------------Arbeitsschleife----------------#
' # #
' ################################################
Do 'Hauptschleife-Beginn
If Taster = 0 Then 'Displayanzeige wechseln
Toggle Tb
Reset Ab
Waitms 100
Bitwait Taster , Set
Else
End If
If Taster2 = 0 Then
Toggle Licht
If Licht = 0 Then
Reset Led
Else
Set Led
End If
Waitms 100
Bitwait Taster2 , Set
Reset Ab
Else
End If
If Tb = 0 Then
If Ab = 0 Then
If Licht = 0 Then
_lcd_out = Bl_aus
Else
_lcd_out = Bl_ein
End If
' !rcall _init_LCD
Locate 1 , 1
Lcd "AVR-Praxis Forum"
Locate 2 , 1
Lcd "-----Cassio-----"
Locate 1 , 17
Lcd "++++01:10:36++++"
Locate 2 , 17
Lcd "****05.06.11****"
Set Ab
Else
End If
Else
If Ab = 0 Then
If Licht = 0 Then
_lcd_out = Bl_aus
Else
_lcd_out = Bl_ein
End If
' !rcall _init_LCD
Locate 1 , 1
Lcd "Dies ist Zeile 1Dies ist Zeile 3"
Locate 2 , 1
Lcd "Dies ist Zeile 2Dies ist Zeile 4"
Set Ab
Else
End If
End If
Loop 'Hauptschleife-Ende
End 'end program
Es ist schon so, wie Wolf geschrieben hat......
Die Ansteuerung der Pins "RS", "E" und "BL" funktionieren wie gewünscht.
Leider ergeben die ausgegebenen Zeichen auf dem Display keinen Sinn.
Zahlen, Buchstaben und Sonderzeichen sind zu sehen.......
aber nicht in der vorgegebenen Reihenfolge sondern durcheinander.
Es wird wohl doch so sein wie ich es zu Beginn vermutet hatte...
Die Steuerpins kann man in der LIB anpassen, aber die 4Bit-Daten werden bestimmt an den falschen Pins ausgegeben.
In der Standard-LIB werden die Daten ja an P0-P3 am PCF ausgegeben.
Nun müssten die Daten aber an P4-P7 anliegen!
Mal eine Idee.....
Kann man VOR dem Senden der Daten diese nicht einfach in der LIB um 4-Bit nach Links schieben?
Hey Dino, wie realisier man das in ASM?
Was ich jedoch nicht bestätigen kann ist die Tatsache,
dass ich immer wieder ein "INITLCD" oder ein "!RCALL _INIT_LCD" benötige um etwas angezeigt zu bekommen.
Ich denke mal, dass könnte am Programmcode von WerWolf liegen (z.B. Dauerfeuer an das LCD).
Grüße,
Cassio