PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (gelöst) I2C -> ATMega als Slave?



mhribernik
04.01.2008, 14:35
Hey Leute!

Hab mich in den letzten Wochen etwas mit Mikrocontrollern und BASCOM beschäftigt..

Nun will ich mich an ein I2C Bus-System zwischen zwei ATMega16 wagen und habe folgende Frage: Wie kann ich einen der ATMega als Slave definieren und ihm eine I2C Adresse zuweisen?


Ich danke euch im Voraus für euer Bemühen!
mfg. Marko

PicNick
04.01.2008, 15:12
Gugge mal:
https://www.roboternetz.de/wissen/index.php/TWI_Praxis

mhribernik
04.01.2008, 16:09
Danke erstmal für deine Antwort!

Hab mir die Seite durchgelesen. Muss man bei den Bespielen keine Lib einbinden?

Über welche Pins läuft eig. der TWI Bus? Muss man da erst welche Pins definieren?

Oder läuft der Code für einen Slave so:



$regfile = "m16def.dat" ' the used chip
$crystal = 7372800 ' frequency used
' $baud = 9600 ' keine baud rate angeben !

Config Portd = Output ' kompletter PortD als Ausgang

Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte

Dim Neuesbyte As Byte ' Bytemerker

Declare Sub Twi_init_slave

Twi_data = 0
Call Twi_init_slave ' TWI aktivieren

' alle LEDs ein
Portd = 0

' Hauptschleife
Do

' Merker zurücksetzen
Neuesbyte = 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
Twi_data = Twdr ' neue Daten merken
Neuesbyte = 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, dieses an PortD ausgeben
If Neuesbyte <> 0 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
Twar = &H40 ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten

End Sub

StevieL
04.01.2008, 18:53
Hallo Marco,

wenn du Hardware-TWI nutzt, brauchst du keine Lib einbinden. TWI läuft auf den Pins C.0 (SCL) und C.1 (SDA). Die Adresse des Slaves legst du im Unterprogramm Twi_init_slave mit Twar = &H40 (oder beliebige andere Adresse) fest.

mhribernik
04.01.2008, 19:04
Ok.. danke.. langsam geht das Lichtlein auf..


Muss ich den TWI-Bus (wie z.B. I2C) mi +5V incl. Wiederstand (zb. 1K) versorgen?

StevieL
04.01.2008, 19:10
Hallo Marco,

Pullups müssen rein. TWI ist nur ein anderer Name für I2C bei den Atmel-Prozessoren! (Hat glaub' ich irgendwelche Lizenzgründe).

mhribernik
04.01.2008, 23:36
hey danke für die antwort! Habs hinbekommen! Es funktioniert einwandfrei!

Eine Frage hab ich allerdings noch:
Wenn ich einen chip, der den i2c bus unterstützt, ansteuern/auslesen möchte, kann ich da anstatt dessen einfach den twi bus verwenden?


P.s. Und allen hilfesuchenden in sachen twi kann ich meinen fertigen und funktionierenden code via pm schicken..

peterfido
05.01.2008, 09:46
Wenn ich einen chip, der den i2c bus unterstützt, ansteuern/auslesen möchte, kann ich da anstatt dessen einfach den twi bus verwenden?

Ja

StevieL
05.01.2008, 11:56
Hallo Marco,

und wenn du mit

$lib "i2c_twi.lbx"
die Library einfügst, kannst du mit den Bascom-Hochbefehlen
wie I2cstart, I2cwByte und I2cstop das Hardware-TWI auf dem Master benutzen.

mhribernik
13.01.2008, 10:53
thx an alle!

Klappt jetzt alles prima!
mfg.

PS. Wie kann ich einen Beitrag als gelöst markieren?

jo_robot
26.04.2010, 13:45
Kann ich eigentlich auch während der Laufzeit von slave receiver auf slave transmitter umstellen, also quasi, dass der beides macht? Wenn ja, könnt ihr mir sagen wie? weil wenn ich die zwei Beispiel codes (entsprechend angepasst) laufen lasse, dann funktionieren sie einwandfrei, wenn ich sie aber nun verknüpfe gehts stückweise nichtmehr bis gar nicht mehr.

grüße Jo