Code:
'*******************************************************************************
' um mit dem master zu senden folgenden code benutzen
'
' I2cstart
' i2cwbyte &H22 'slave-id
' I2cwbyte 1 'für motor 1
' I2cwbyte PWM1
' I2cwbyte PWM1b 'falls die pwm variable größer als ein byte ist
' I2cstop
'
'pb4,pb5,pd5,pd6,pd7,pb3,pd3,pb1 klappen
'*******************************************************************************
'===============================================================================
'***| Mikrocontroller Config |**************************************************
'===============================================================================
'Microcontroller
'================
$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
'TWI
'====
Declare Sub Twi_init_slave
Dim Twi_control As Byte
Dim Twi_status As Byte
Dim Befehl As Byte
Dim Anzahl_bytes As Byte
Dim Neuesb_flagge As Byte
Dim Buffer(8) As Byte
Dim N As Byte 'zähler/index variable
'sound
'====
Config Portb.2 = Output 'sound
Dim Dauer As Word 'für peep
'Klappenabfrage
Dim Bytex As Byte 'rechenvariable
Dim Klappen As Byte
Dim Soll_motor_r As Byte
Dim Soll_motor_l As Byte
Config Portb.4 = Input
Config Portb.5 = Input
Config Portd.5 = Input
Config Portd.6 = Input
Config Portd.7 = Input
Config Portb.3 = Input
Config Portd.3 = Input
Config Portb.1 = Input
'pullups
Config Portb.4 = 1
Config Portb.5 = 1
Config Portd.5 = 1
Config Portd.6 = 1
Config Portd.7 = 1
Config Portb.3 = 1
Config Portd.3 = 1
Config Portb.1 = 1
Enable Interrupts
'Init
'=====
Portb.2 = 0
For N = 1 To 8
Buffer(n) = 0
Next N
Befehl = 0
Anzahl_bytes = 0
Soll_motor_r = 100
Soll_motor_l = 100
Call Twi_init_slave
'-------------------------------------------------------------------------------
'***| Hauptprogramm |***********************************************************
'-------------------------------------------------------------------------------
'auf Befehle vom master warten
Do
Neuesb_flagge = 0
'schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status
'wurde ein Byte geschickt?
If Twi_status = &H80 Or Twi_status = &H88 Then
Befehl = Twdr ' neue Daten merken
Neuesb_flagge = 1 ' merken das ein neues Byte da ist
End If
'TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End If
'wenn ein neues Byte gekommen ist verarbeiten
If Neuesb_flagge <> 0 Then
'Register zuordnen -> Befehl
Select Case Befehl
Case 1
Gosub Klappen_abfrage
Case 10
Gosub Beep
Case 255
Gosub Softreset
End Select
End If
Loop
End
'-------------------------------------------------------------------------------
'***|KLappenabfrage|*****************************************************************
'-------------------------------------------------------------------------------
Klappen_abfrage:
Incr Soll_motor_r
Incr Soll_motor_l
Buffer(1) = Soll_motor_r
Buffer(2) = Soll_motor_l
Anzahl_bytes = 1
Gosub I2c_tx
Return
'-------------------------------------------------------------------------------
'***| beep |*****************************************************************
'-------------------------------------------------------------------------------
Beep:
Anzahl_bytes = 1 '1 Byte holen
Gosub I2c_rx
Dauer = Buffer(1) '1. byte aus buffer
Dauer = Dauer * 20
Portb.2 = 1
Waitms Dauer 'piiiiieep
Portb.2 = 0
Return
'-------------------------------------------------------------------------------
'***| softreset |*****************************************************************
'-------------------------------------------------------------------------------
Softreset:
Goto &H1C00
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Empfangsroutinen |******************************************
'-------------------------------------------------------------------------------
I2c_rx:
For N = 1 To Anzahl_bytes
'erstes Byte empfangen
Neuesb_flagge = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &H80 Or Twi_status = &H88 Then
Buffer(n) = Twdr
Neuesb_flagge = 2
End If
Twcr = &B11000100
End If
If Neuesb_flagge = 2 Then Exit Do
Loop
Next N
Return
'-------------------------------------------------------------------------------
'***| I2C-BUS Daten Senderoutinen |******************************************
'-------------------------------------------------------------------------------
I2c_tx:
For N = 1 To Anzahl_bytes
'erstes Byte empfangen
Neuesb_flagge = 0
Do
Twi_control = Twcr And &H80
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8
If Twi_status = &HA8 Or Twi_status = &HB8 Then
Twdr = Buffer(n)
Neuesb_flagge = 2
End If
Twcr = &B11000100
End If
If Neuesb_flagge = 2 Then Exit Do
Loop
Next N
' Slaveadresse setzen I2C-RX-Adr:Hex22
Return
'-------------------------------------------------------------------------------
'***| TWI: Slavekonfiguration |*************************************************
'-------------------------------------------------------------------------------
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &H22 ' Slaveadresse setzen I2C-RX-Adr:Hex22
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
End Sub
also falls du mal zeit hast kannst ja mal "klappenabfrage" angugn. 2 x-beliebige bytes, die in das array geschrieben werden und dann wird die TxRoutine aufgerufen.
Lesezeichen