Alle Slaves die selbe Adresse sollte gehen. Aber das blockiert auch den Bus bis der letzte Slave reagiert hat. Vielleicht hilft der Ansatz. Das ist nie geprüft worden (ich bin auf 485 geschwenkt)
Alles anzeigen
Quellcode
- $regfile = "m8def.dat"
- $crystal = 8000000
- $hwstack = $40
- $swstack = $40
- $framesize = $100
- $eepleave
- $baud = 9600
- Config Base = 0
- '$sim
- 'b0=Db4 b1= b2=Bled b3=Mosi b4=Mi/Db5 b5=Sk/Rs b6=nc b7=nc
- 'c0= c1= c2= c3=nc c4=Sda c5=Slc c6=/res c7=nu
- 'd0=Rx d1=Tx d2=dir d3=nc d4=nc d5=Db7 d6=E d7=Db6
- Ddrb = $c4
- Ddrd = $f2
- Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.6 , Rs = Portb.7
- Config Lcd = 16 * 2 'Db7 von b1 auf D5 umlöten
- Lcd_backlight Alias Portb.2 : Set Lcd_backlight
- Initlcd
- Cursor Off
- Cls
- Dim Temp As Byte , Tempi As Integer , Tempw As Word , Tempstr As String * 6
- Dim Templ As Byte At Tempw Overlay
- Dim Temph As Byte At Tempw + 1 Overlay
- Dim I2cinbuf(16) As Byte , I2csendbuf(16) As Byte
- Dim I2cinstr As String * 16 At I2cinbuf Overlay
- Dim I2csendstr As String * 16 At I2csendbuf Overlay
- Dim I2cin As Byte , I2cout As Byte , I2cein As Byte , I2cneu As Byte
- Dim I2cstat As Byte , I2c2send As Byte
- Const I2cadr = $a0 'At24 eerom adresse
- Twsr = 0
- Twar = I2cadr
- Twcr = $c4
- On Twi Twi_isr:
- Enable Twi
- Enable Interrupts
- I2csendstr = "Keine Daten"
- Do
- Locate 1 , 1
- Lcd "Empfangen:"
- Lcd I2cein
- If I2cneu = 1 Then
- Lowerline
- Lcd I2cinstr
- Print I2cinstr
- I2csendstr = I2cinstr '
- I2cout = Len(i2csendstr)
- End If
- Waitms 200
- Loop
- End
- Twi_isr:
- I2cstat = Twsr And $f8
- Select Case I2cstat
- Case Is = 96 'Slave adr empfangen Ack angefordert
- I2cein = 0
- I2cneu = 0
- Case Is = 128 '
- I2cinbuf(i2cein) = Twdr
- Incr I2cein
- Case Is = 160 'Stop
- If I2cein > 0 Then I2cneu = 1
- Case Is = 168 'Slave Read
- I2c2send = 0
- Goto Letztes
- Case Is = 184 'Ack nach gesendetem Byte
- Goto Letztes
- 'Case Else
- ' Twcr = $c5
- End Select
- Twcr = $c5 'int,ack,twiEn,intEn
- Return
- Letztes:
- Twdr = I2csendbuf(i2c2send)
- Incr I2c2send
- If I2c2send >= I2cout Then
- Twcr = $85 'ohne Ack
- Else
- Incr I2c2send
- Twcr = $c5
- End If
- Return