Hiho.
Mal wieder ein Problem.
Ich hab mir mal ein (preislich gesehen) billiges 40x4-LCD (DisplayTech 404B Series) besorgt. Um dieses universell und ohne viel Verkabelungsaufwand verwenden zu können, hab ich auf eine kleine Zusatzplatine nen ATMega8 draufgepackt, der sich wie ein I2C-Slave verhält, die empfangenen Daten umsetzt und auf dem Display darstellt. Mit nem RS232-I2C-Adapter klappt die Ansteuerung auch problemlos.
Nun wollte ich das Teilchen an nem ATMega2560 per I2C ansprechen: Es passiert garnichts. Häng ich statt dem Display das RNKeyLCD hin, rührt sich ebenfalls nix. Mit LED-Überwachung zeigt sich, dass beide Leitungen (SCL/SDA) ständig High sind. Lass ich in dem Code unten den "I2CINIT" weg, so ist SDA = Hi, SCL = Lo.
Verbindungstechnisch hängt die ganze Sache an nem Flachbandkabel mit 3 Steckern; Die Geräte werden alle auch über den Bus mit Strom versorgt.
Stecker 1: Stromversorgung für Bus + 10k-Pullups für SDA/SCL; Zuschaltbarer RS232-I2C-Adapter.
Stecker 2: ATMega2560 (Keine Pullups)
Stecker 3: RNKeyLCD oder 404B (bei letzterem keine Pullups)
Hier mal der bisherige Code:
Die Sub ist noch ein überbleibsel und wird später noch "wegoptimiert".
In der Mainloop soll nur Testweise der Buchstabe X bzw. Y mit 2 verschiedenen Möglichkeiten gesendet werden.
Code:' Wait for I2C-LCD to be ready Wait 2 $lib "i2c.lbx" $lib "i2c_twi.lbx" '------------------------------------------------------------------------------- ' Declarations - SUBs '------------------------------------------------------------------------------- Declare SUB I2CLCD_Send '------------------------------------------------------------------------------- ' Declarations - Ports & Pins '------------------------------------------------------------------------------- CONFIG PIND.0 = OUTPUT 'SCL CONFIG PIND.1 = OUTPUT 'SDA CONFIG PIND.5 = OUTPUT : LED ALIAS PORTD.5 'Onboard-LED '------------------------------------------------------------------------------- ' Declarations - Constants '------------------------------------------------------------------------------- CONST Timer1Preload = 100 CONST SID_RNKeyLCD = &H40 ' RNKeyLCD CONST SID_I2CLCD = &H42 ' 404B-Series CONST SID_Nokia6100 = &H44 ' Nokia 6100 Color LCD CONST SID_ServoBoard = &H46 ' MicroServo-Board CONST SID_GeneralCall = &H00 ' General Call '------------------------------------------------------------------------------- ' Declarations - Variables '------------------------------------------------------------------------------- 'Counting Variables DIM i as Byte DIM i2 as Byte 'Temporary Variables DIM tmpByte as Byte DIM tmpString as String * 1 'LCD Text DIM LCDString(4) AS String * 40 DIM LCDStringOld(4) AS String * 40 '------------------------------------------------------------------------------- ' Configs '------------------------------------------------------------------------------- CONFIG SCL = PORTD.0 CONFIG SDA = PORTD.1 CONFIG TIMER1 = TIMER , Prescale = 1024 Config Twi = 100000 '100 kHz Bus Frequency '------------------------------------------------------------------------------- ' Initialisations '------------------------------------------------------------------------------- I2CINIT TIMER1 = Timer1Preload On Timer1 ISR_Timer1 ENABLE Timer1 ENABLE Interrupts '******************************************************************************* ' MAIN LOOP START '******************************************************************************* DO I2cstart I2cwbyte SID_RNKeyLCD I2cwbyte 88 'Send "X" I2cstop I2CSend SID_RNKeyLCD , 89 'Send "Y" Toggle LED WAITms 500 LOOP END '******************************************************************************* ' MAIN LOOP END '******************************************************************************* '------------------------------------------------------------------------------- ' SUBs '------------------------------------------------------------------------------- SUB I2CLCD_Send For i = 1 to 4 If LCDString(i) <> LCDStringOld(i) Then tmpByte = LEN(LCDString(i)) ' Get length of String tmpByte = 40 - tmpByte ' Chars Needed to 40 if tmpByte > 0 Then LCDString(i) = LCDString(i) + SPACE(tmpByte) I2CStart 'Set Cursor to Line i I2CWByte SID_I2CLCD I2CWByte 027 'Send System-Command I2CWByte 079 'Set Cursor I2CWByte 001 'Column 1 I2CWByte i 'Line i I2CStop I2CStart 'Transfer selected Line I2CWByte SID_I2CLCD I2CWByte 001 'Send Text-Command I2CWByte 040 'Length: 40 Bytes For i2 = 1 to 40 'Send Text-Bytes Toggle LED tmpString = mid(LCDString(i) , i2 , 1) tmpByte = ASC(tmpString) I2CWByte tmpByte Next I2cstop LCDStringOld(i) = LCDString(i) End If Next i END SUB '------------------------------------------------------------------------------- ' Jump Labels / ISR '------------------------------------------------------------------------------- ISR_Timer1: Timer1 = Timer1Preload Return
Hab ich mit der Ansteuerung per I2C was übersehen?
Muss jedes Gerät selbst nochmal Pullups haben oder reichen die beiden bei der Versorgung?
MfG
S.C
Lesezeichen