Sry für die vielen Posts. Aber des sollte bald klappen...komme schon ein bisschen unter Zeitdruck!
Hab jetzt den Code hier mal genommen für den Master. Der kommt bei Twi_wait_int() in die Loop und bleibt darin hängen. Mit oder ohne Slave scheint ihm dabei egal zu sein.
Code:
$regfile = "M16def.dat" ' the used chip
$crystal = 16000000
$baud = 19200 ' frequency used
Declare Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte)
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim B As Byte ' Zeichen von UART
Dim Error As Byte ' Fehlermerker
' TWI init
Twcr = &B00000100 ' erstmal nur TWI aktivieren
Twsr = 0 ' Status und Prescaler Register
Twbr = 72 ' Bit Rate Register, 100kHz
' Startausgabe
Print "TWI Master Transmitter"
' Hauptschleife
B = 0
Do
Incr B
If B = 255 Then
B = 0
End If
Print B ; " ";
' Den Wert zum Slave senden
Call Twi_send_byte(&H40 , B)
Print B ; " ";
Wait 1
Loop
End
' Unterprogramme
' TWI send_byte
' sendet ein Byte und schliesst die Übertragung ab
Sub Twi_send_byte(slave As Byte , Zeichen As Byte)
Print "Twi_send_byte() ";
Error = 0 ' Fehler zurücksetzen
' Startbedingung
Print "Startbedingung ";
Twcr = &B10100100 ' TWINT
' warten bis TWINT gesetzt ist
Gosub Twi_wait_int
' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben
If Twi_status = &H08 Or Twi_status = &H10 Then
Print "Slaveadresse ";
Twdr = Slave And &HFE ' slave adresse + Write
Twcr = &B10000100 ' TWINT löschen, Byte senden
' warten bis TWINT gesetzt ist
Gosub Twi_wait_int
' Slave hat sich gemeldet
If Twi_status = &H18 Or Twi_status = &H20 Then
Print "Slave hat sich gemeldet ";
Twdr = Zeichen ' Daten
Twcr = &B10000100 ' TWINT löschen, Byte senden
' warten bis TWINT gesetzt ist
Gosub Twi_wait_int
' Zeichen wurden gesendet
If Twi_status = &H28 Or Twi_status = &H30 Then
Error = 0 ' kein Fehler
Else
Error = Twi_status ' Fehler
End If
Else
' kein slave
Print "Kein Slave da ";
Error = Twi_status ' Fehler
End If
' Stopbedingung kommt hier immer im Ablauf, egal welcher Status
Print "Stoppbedingung ";
Twcr = &B10010100 ' TWINT löschen, Stop senden
Else
' Bus belegt, wird er wieder freigegeben
Twcr = &B10000100 ' TWINT löschen, Bus freigeben
Error = Twi_status ' Fehler
End If
End Sub
' warten bis TWINT gesetzt ist, status auslesen
Twi_wait_int:
Print "Twi_wait_int() ";
Do
Twi_control = Twcr And &H80
'Print "Do - Loop " ;
Loop Until Twi_control = &H80
Print "Nach Do-Loop ";
Twi_status = Twsr And &HF8 ' status
Return
Also Ausgabe krieg ich:
Twi Master Transmitter
1
Twi_send_byte()
Startbedingung
Twi_wait_int
...und das wars. weiter kommt er nicht!
Lesezeichen