Nachdem ich schon Forum die Möglichkeit der Datenübertragung zwischen zwei AVR über TWI gezeigt habe möchte ich es hier noch mal zusammenfassend zeigen.
Es gibt zwei Varianten der Verbindung zwischen zwei AVR über TWI.
Die erste ist die mit der kauf LIB von MCS für derzeit 14,95 Euro.
Diese LIB benötigt man hauptsächlich für AVR-Typen die kein Hardware TWI haben. In dem Download sind folgende Dateien enthalten
- i2cslave.lib (für AVR ohne TWI)
- i2c_twi-slave (für AVR mit TWI)
- i2c_twi-slave-acknack (für AVR mit TWI)
- xmega-twi-slave (für XMEGA)
- I2C_USI_SLAVE.LIB (für AVR mit USI)
Über diese LIB lässt sich der TWI-Bus relativ einfach aufbauen.
Mit
lässt sich ein AVR zum TWI Slave machen. &H70 ist dabei die Slave-Adresse, Btr = 2 die Anzahl an Byte die vom Master gelesen werden, Bitrate = 100000 ist die Busfrequenz (100KHz).
Die LIB erfordert noch einige Unterprogramme im Slave für die Übertragung
Alles anzeigen
Über die LIB werden auch einige Variablen zur Verfügung gestellt. Diese sind folgende:
- Twi_btw ist ein Zähler der nach jedem I2cwbyte um eins erhöht und mit I2cstop zurück gesetzt wird.
- Twi_btr wird nach jedem I2crbyte um eins erhöht.
- Twi ist eine Variable in der dann die Daten nach jedem I2cwbyte/[b]I2crbyte zur Verfügung stehen.
Bei I2crbyte muss der Variablen Twi ein Wert übergeben werden z.B. Twi = 25.
Hier mal ein Beispiel-Code für den Slave
Alles anzeigen
Der Master wird bei dieser Variante wie bei jeder anderen I2C Verbindung konfiguriert.
Beispiel-Code für den Master
Alles anzeigen
Es gibt zwei Varianten der Verbindung zwischen zwei AVR über TWI.
Die erste ist die mit der kauf LIB von MCS für derzeit 14,95 Euro.
Diese LIB benötigt man hauptsächlich für AVR-Typen die kein Hardware TWI haben. In dem Download sind folgende Dateien enthalten
- i2cslave.lib (für AVR ohne TWI)
- i2c_twi-slave (für AVR mit TWI)
- i2c_twi-slave-acknack (für AVR mit TWI)
- xmega-twi-slave (für XMEGA)
- I2C_USI_SLAVE.LIB (für AVR mit USI)
Über diese LIB lässt sich der TWI-Bus relativ einfach aufbauen.
Mit
Die LIB erfordert noch einige Unterprogramme im Slave für die Übertragung
BASCOM-Quellcode
- Twi_stop_rstart_received:
- 'wird angespungen wenn der Master ein STOP oder REPSTART sendet
- Return
- Twi_addressed_goread:
- 'Der Slave wurde adressiert und der Master will Daten lesen
- Return
- Twi_addressed_gowrite:
- 'Der Slave wurde adressiert und der Master will Daten schreiben
- Return
- Twi_gotdata:
- 'Daten empfangen
- Return
- Twi_master_needs_byte:
- 'Der Master benötigt Daten
- Return
- Twi_master_need_nomore_byte:
- 'Der Master benötigt keine Daten mehr
- Return
Über die LIB werden auch einige Variablen zur Verfügung gestellt. Diese sind folgende:
- Twi_btw ist ein Zähler der nach jedem I2cwbyte um eins erhöht und mit I2cstop zurück gesetzt wird.
- Twi_btr wird nach jedem I2crbyte um eins erhöht.
- Twi ist eine Variable in der dann die Daten nach jedem I2cwbyte/[b]I2crbyte zur Verfügung stehen.
Bei I2crbyte muss der Variablen Twi ein Wert übergeben werden z.B. Twi = 25.
Hier mal ein Beispiel-Code für den Slave
BASCOM-Quellcode
- 'I2C Slave
- 'Test von I2C/TWI mit ATMega8
- $regfile = "m8def.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 64
- $framesize = 64
- $lib "i2c_twi-slave.lbx" 'Für Hardware TWI
- Config Twislave = &H70 , Btr = 2 , Bitrate = 100000
- Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3
- Config Lcd = 16 * 2
- Enable Interrupts
- Dim Befehl As Byte , Wert As Byte
- Cursor Off
- Cls
- Do
- Loop
- End
- Twi_stop_rstart_received:
- Return
- Twi_addressed_goread:
- Return
- Twi_addressed_gowrite:
- Return
- Twi_gotdata:
- Select Case Twi_btw
- Case 1 : Befehl = Twi
- Case 2 : Wert = Twi
- End Select
- Select Case Befehl
- Case 0 :
- 'Begrüßung
- Locate 1 , 1
- Lcd " I2C Slave Test "
- Locate 2 , 1
- Lcd " Bascomforum.de "
- Case 1 :
- 'Befehl 1 mit drei Werten
- Locate 1 , 1
- Lcd "Befehl " ; Befehl ; " "
- Select Case Wert
- Case 0 :
- Locate 2 , 1
- Lcd "Wert " ; Wert ; " "
- Case 1 :
- Locate 2 , 1
- Lcd "Wert " ; Wert ; " "
- Case 2 :
- Locate 2 , 1
- Lcd "Wert " ; Wert ; " "
- End Select
- Case 2 : Cls
- End Select
- Return
- Twi_master_needs_byte:
- Return
- Twi_master_need_nomore_byte:
- Return
Der Master wird bei dieser Variante wie bei jeder anderen I2C Verbindung konfiguriert.
Beispiel-Code für den Master
BASCOM-Quellcode
- 'I2C Master
- 'Test von I2C/TWI mit ATMega8
- $regfile = "m8def.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 64
- $framesize = 64
- $lib "i2c_twi.lbx" 'Für Hardware TWI
- Config Scl = Portc.5
- Config Sda = Portc.4
- Config Twi = 100000
- Dim Befehl As Byte , Wert As Byte
- I2cinit
- Do
- 'Begrüßung
- Befehl = 0
- Wert = 0
- Gosub Sende_twi_daten
- Wait 2
- 'Befehl 1 mit Wert 0
- Befehl = 1
- Wert = 0
- Gosub Sende_twi_daten
- Wait 2
- Befehl = 1
- Wert = 1
- Gosub Sende_twi_daten
- Wait 2
- Befehl = 1
- Wert = 2
- Gosub Sende_twi_daten
- Wait 2
- 'Display löschen
- Befehl = 2
- Wert = 0
- Gosub Sende_twi_daten
- Wait 5
- Loop
- End
- Sende_twi_daten:
- I2cstart
- I2cwbyte &H70 'Slave Adresse
- I2cwbyte Befehl
- I2cwbyte Wert
- I2cstop
- Return
- 'Ende
6.829 mal gelesen