Hallo
Meine I2C Übertragung läuft ,
Im Empfangsarray steht der gesendete Wert.
Variable übernimmt den Wert nicht
Was mache ich falsch????
Das Prog
$regfile = "M328pdef.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 19200
'Waitms 100
' --- Constante
Const Eigene_slave_adr = &H20 ' Adresse evtl. Anpassen
Const Maxanzahlbyte = 10 ' Wenn mehr Zeichen kommen werden diese verworfen !
' --- DIM
' --- I2C
Dim Messagebuf(maxanzahlbyte) As Byte
Dim Anzahlbuf As Byte ' Anzahl Zeichen die gesendet wurde
Dim Neuemsg As Byte ' zeigt an wenn eine neue Message gültig ist
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
' --- Servo
Dim S_sol1 As Byte
Dim S_sol2 As Byte
Dim S_sol3 As Byte
Dim S_sol4 As Byte
Dim S_sol5 As Byte
Dim S_sol6 As Byte
' --- Config
Config Servos = 6 , Servo1 = Portc.0 , Servo2 = Portc.1 , Servo3 = Portc.2 , Servo4 = Portc.3 , Servo5 = Portc.6 , Servo6 = Portc.7 , Reload = 10
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.6 = Output
Config Portc.7 = Output
Enable Interrupts
' --- Alias
' --- TWI init
Gosub Twi_init_slave
'$sim
Twi_data = 0
Neuemsg = 0 ' Paket ungültig
Anzahlbuf = 0 ' Anzahl empfangener Bytes
' alle LEDs aus
Print "{027}[2J{027}[1;1H"; ' ansi clear screen
Print "I2C-Motorrechner-Test1.bas"
Servo(1) = 100
Servo(2) = 100
Servo(3) = 100
Servo(4) = 100
Servo(5) = 100
Servo(6) = 100
S_sol1 = 100
S_sol2 = 100
S_sol3 = 100
S_sol4 = 100
S_sol5 = 100
S_sol6 = 100
Do
Toggle Portd.4
' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status
Portd = Not Twi_status ' test auf die LEDs
'Print "Status " ; Twi_status
Select Case Twi_status
'Slave Adress received, wir sind gemeint !
Case &H60 :
'Case &H20 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
Anzahlbuf = 0
Neuemsg = 0 ' Flag für Message ungültig
' Byte mit ACK
Case &H80 :
If Anzahlbuf < Maxanzahlbyte Then
Incr Anzahlbuf ' zähler +1
Messagebuf(anzahlbuf) = Twdr
End If
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' Stop oder restart empfangen
Case &HA0 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' es müssen 3 Byte sein, damit das Paket OK ist
If Anzahlbuf = 3 Then
Neuemsg = 1 ' Flag für Message gültig
Else
Neuemsg = 0 ' Flag für Message ungültig
End If
' letztes Byte mit NACK, brauchen wir nicht
Case &H88 :
Case &HF8 :
' Fehler, dann reset TWI
Case &H00 :
Print "Error=" ; Twcr
Twcr = &B11010100 ' TWINT löschen, reset TWI
' was anderes empfangen, sollte nicht vorkommen
Case Else :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End Select
End If
' ein gültiges Paket angekommen ?
If Neuemsg = 1 Then
Neuemsg = 0 ' Flag wieder löschen
If Messagebuf(1) = "s" Then ' nur wenn das erste Zeichen ein "s" ist für Servo, tun wir was damit !
If Messagebuf(2) = "1" Then
S_sol1 = Messagebuf(3)
Print S_sol1
Servo(1) = S_sol1
Elseif Messagebuf(2) = "2" Then
S_sol2 = Messagebuf(3)
Servo(2) = S_sol2
End If
Print "Servo" ; Messagebuf(2) ; "= " ; Messagebuf(3) ; " ; ist=" ; S_sol1
End If
Print S_sol2
Print S_sol3
Print S_sol4
Print S_sol5
Print S_sol6
End If
'Waitms 10
Servo(1) = S_sol1
Servo(2) = S_sol2
Servo(3) = S_sol3
Servo(4) = S_sol4
Servo(5) = S_sol5
Servo(6) = S_sol6
Loop
' --- TWI als slave aktivieren
Twi_init_slave:
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = Eigene_slave_adr ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
Return
End
Meine I2C Übertragung läuft ,
Im Empfangsarray steht der gesendete Wert.
Variable übernimmt den Wert nicht
Was mache ich falsch????
Das Prog
$regfile = "M328pdef.dat" ' the used chip
$crystal = 16000000 ' frequency used
$baud = 19200
'Waitms 100
' --- Constante
Const Eigene_slave_adr = &H20 ' Adresse evtl. Anpassen
Const Maxanzahlbyte = 10 ' Wenn mehr Zeichen kommen werden diese verworfen !
' --- DIM
' --- I2C
Dim Messagebuf(maxanzahlbyte) As Byte
Dim Anzahlbuf As Byte ' Anzahl Zeichen die gesendet wurde
Dim Neuemsg As Byte ' zeigt an wenn eine neue Message gültig ist
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
' --- Servo
Dim S_sol1 As Byte
Dim S_sol2 As Byte
Dim S_sol3 As Byte
Dim S_sol4 As Byte
Dim S_sol5 As Byte
Dim S_sol6 As Byte
' --- Config
Config Servos = 6 , Servo1 = Portc.0 , Servo2 = Portc.1 , Servo3 = Portc.2 , Servo4 = Portc.3 , Servo5 = Portc.6 , Servo6 = Portc.7 , Reload = 10
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.6 = Output
Config Portc.7 = Output
Enable Interrupts
' --- Alias
' --- TWI init
Gosub Twi_init_slave
'$sim
Twi_data = 0
Neuemsg = 0 ' Paket ungültig
Anzahlbuf = 0 ' Anzahl empfangener Bytes
' alle LEDs aus
Print "{027}[2J{027}[1;1H"; ' ansi clear screen
Print "I2C-Motorrechner-Test1.bas"
Servo(1) = 100
Servo(2) = 100
Servo(3) = 100
Servo(4) = 100
Servo(5) = 100
Servo(6) = 100
S_sol1 = 100
S_sol2 = 100
S_sol3 = 100
S_sol4 = 100
S_sol5 = 100
S_sol6 = 100
Do
Toggle Portd.4
' schauen ob TWINT gesetzt ist
Twi_control = Twcr And &H80 ' Bit7 von Controlregister
If Twi_control = &H80 Then
Twi_status = Twsr And &HF8 ' Status
Portd = Not Twi_status ' test auf die LEDs
'Print "Status " ; Twi_status
Select Case Twi_status
'Slave Adress received, wir sind gemeint !
Case &H60 :
'Case &H20 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
Anzahlbuf = 0
Neuemsg = 0 ' Flag für Message ungültig
' Byte mit ACK
Case &H80 :
If Anzahlbuf < Maxanzahlbyte Then
Incr Anzahlbuf ' zähler +1
Messagebuf(anzahlbuf) = Twdr
End If
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' Stop oder restart empfangen
Case &HA0 :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
' es müssen 3 Byte sein, damit das Paket OK ist
If Anzahlbuf = 3 Then
Neuemsg = 1 ' Flag für Message gültig
Else
Neuemsg = 0 ' Flag für Message ungültig
End If
' letztes Byte mit NACK, brauchen wir nicht
Case &H88 :
Case &HF8 :
' Fehler, dann reset TWI
Case &H00 :
Print "Error=" ; Twcr
Twcr = &B11010100 ' TWINT löschen, reset TWI
' was anderes empfangen, sollte nicht vorkommen
Case Else :
Twcr = &B11000100 ' TWINT löschen, erzeugt ACK
End Select
End If
' ein gültiges Paket angekommen ?
If Neuemsg = 1 Then
Neuemsg = 0 ' Flag wieder löschen
If Messagebuf(1) = "s" Then ' nur wenn das erste Zeichen ein "s" ist für Servo, tun wir was damit !
If Messagebuf(2) = "1" Then
S_sol1 = Messagebuf(3)
Print S_sol1
Servo(1) = S_sol1
Elseif Messagebuf(2) = "2" Then
S_sol2 = Messagebuf(3)
Servo(2) = S_sol2
End If
Print "Servo" ; Messagebuf(2) ; "= " ; Messagebuf(3) ; " ; ist=" ; S_sol1
End If
Print S_sol2
Print S_sol3
Print S_sol4
Print S_sol5
Print S_sol6
End If
'Waitms 10
Servo(1) = S_sol1
Servo(2) = S_sol2
Servo(3) = S_sol3
Servo(4) = S_sol4
Servo(5) = S_sol5
Servo(6) = S_sol6
Loop
' --- TWI als slave aktivieren
Twi_init_slave:
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = Eigene_slave_adr ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
Return
End