Hallo,
ich lese hier immer das man für das einsetzen des AVR als TWI-slave eine lib brauchen soll, wenn ich aber ins Datenblatt sehe, schaut das doch relativ einfach aus einen Slave ans laufen zu bekommen.
Deshalb hab ich mir vor Weihnachten noch schnell ein paar PCF8574 bestellt, und mich in das TWI-Thema eingelesen, da es im Wiki noch keine Seite dazu gab, diese auch noch angelegt und die ersten Infos reingeschrieben. -> TWI
Testumgebung: RN-Control (Master), PCF8574 (zum testen ob Master auch richtig geht), RN-Mega8 (Slave).
Jetzt hab ich eine Quick dafür Dirty Version in Bascom gebaut, um zu sehen wie man den M8 als Slave hinbekommen kann, das Ergebnis ist dieses:
Am Master wird über den PC eine Zahl eingegeben, 0-255, die dann zum Slave gesendet wird und dort an PortD ausgegeben wird. (PortD weil hier alle Bits der Reihe nach an den LEDs zu sehen sind)
Master:
	Code:
	' TWI Testprogramm aus der Hilfe (abgespeckt)
' mit PCF8574
'The chip will work in TWI/I2C master mode
'Connected is a PCF8574 8-bits port extender
$regfile = "M32def.dat"                                     ' the used chip
$crystal = 16000000                                         ' frequency used
$baud = 9600                                                ' baud rate
$lib "i2c_twi.lbx"                                          ' we do not use software emulated I2C but the TWI
Config Twi = 100000                                         ' wanted I2C clock frequency
TWCR = &H04                                                   ' TWEN
Dim B As Byte
Print "TWI master"
Do
  Input B
  I2csend &H40 , B                                          ' send the value
  Print B ;
  Print " Error : " ;
  Print Err                                                 ' show error status
Loop
End
 Slave:
	Code:
	' TWI-slave test
' zum simulieren eines PCF8574
$regfile = "m8def.dat"                                      ' the used chip
$crystal = 7372800                                          ' frequency used
Config Portd = Output                                       ' kopletter PortD als Ausgang
Dim Twi_status As Byte
Dim Twi_data As Byte
Declare Sub Twi_init_slave
Declare Function Twi_wait() As Byte
Twi_data = 0
Call Twi_init_slave                                         ' TWI aktivieren
' Hauptschleife
Do
    Twi_status = Twi_wait()
    If Twi_status = &H80 Then
        Portd = Twi_data                                    ' Daten auf PortD ausgeben
    End If
Loop
End
' Unterprogramme
' TWI als slave aktivieren
Sub Twi_init_slave
    Twsr = 0                                                ' status und Prescaler auf 0
    Twdr = &HFF                                             ' default
    Twcr = &B00000100                                       ' erstmal nur TWI aktivieren
    Twar = &H40                                             ' Slaveadresse setzen
    Twcr = &B01000100                                       ' dann ACK einschalten
End Sub
' schauen ob was gekommen ist, Status zurückgeben, Daten in globale variable
Function Twi_wait() As Byte
    Local Twcr_local As Byte
    Twi_wait = &HF8
    ' warten bis TWINT gesetzt ist
    Twcr_local = Twcr And &H80
    If Twcr_local = &H80 Then
        Twi_data = Twdr                                     ' Daten sichern
        Twi_wait = Twsr And &HF8                            ' status zurückgeben
        Twcr = Twcr Or &B10000000                           ' TWINT löschen, erzeugt ACK
    End If
End Function
 Das lässt sich natürlich noch ausbauen, da mit diesem Testprogramm der Slave nur empfangen kann. Interupt wird auch nicht benutzt.
						
					
Lesezeichen