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