Hallo zusammen
Ich bin derzeit noch Anfänger in der AVR Programierung und möchte jetzt
einen kleinen Versuch zum Verstehen von I²C/TWI starten.
Ich habe da auch schon gegoogelt aber ich habe es entweder nicht
verstanden oder es war für GCC was ich (noch nicht) behersche und möchte
es mit mit dem Atmel AVR Assembler programieren.
Geht das Überhaupt in Atmel AVR Assembler?
Ich habe hier ein selbstgebautes Bord für Atmega32 und eins für den
Atmega8 liegen
Ich möchte hier jetzt einfach nur eine Zahl übertragen. Daher Atmega32
--> Master || Atmega8 --> Slave (oder andersherum)
Ich stelle mir das so vor das ich an dem Master an porta (bzw pina) ein
paar Taster anschließe und den Wert der an den Pins "gedrückt wird"
einfach dann an den Slave übertrage und der mir den Dann anhand von 8
LED´s an portb ausgibt
Das alles hat natürlich keine Funktion und dient erstmal nur zum
Verstehen
Es wäre nett wenn ihr mir mal erklären würdet wie ich I²C/TWI
initialisiere und dann etwas übertrage.
Das es einen Start und Stop bit gibt habe ich schon herausgefunden und
das eine Übertragung auf 9 Bit`s erfolgt.
aber wie mache ich dem einen µc klar das er ein Master is und dem
anderen ein Slave. Wie gebe ich dem slave dann eine Adresse und sage dem
Master das er den Slave ansprechen soll, und dann auchnoch eine
Übertragung der eigendlichen Daten?
Wäre echt nett wenn Ihr mir da ein bisschen helfen könntet.
Danke im voraus
MFG Chris ;)
Lies die Datenblätter und - sobald Du TWI im Datenblatt wirklich
verstanden hast - die entsprechenden Application Notes. Im übrigen
solltest Du erst einmal derartige Dinge im Single-Prozessor-Betrieb zum
Laufen bringen.
Bernhard
Okay danke
Ich werde mir jetzt mal die Datenblätter durchlesen aber wie soll das
mit einem Prozessor klappen ich dachte TWI ist zum Übertragen von daten
auf verschiede Bausteine
Hi
>Das es einen Start und Stop bit gibt habe ich schon herausgefunden und>das eine Übertragung auf 9 Bit`s erfolgt.
Bist du sicher, das du TWI meinst? Bei I2C/TWI gibt es
Start-/Stop-Conditions, aber keine entsprechenden Bits.
>aber wie mache ich dem einen µc klar das er ein Master is und dem>anderen ein Slave. Wie gebe ich dem slave dann eine Adresse und sage dem>Master das er den Slave ansprechen soll, und dann auchnoch eine>Übertragung der eigendlichen Daten?
Was ist eigentlich naheliegender, als die Datenblätter zu lesen? Dort
findest du eine umfassende Beschreibung und Codebeispiele in Assembler
und C.
MfG Spess
So ich habe jetzt ein bisschen Datenblatt Literatur intus
aber es ist immernoch schwer verständlich für mich.
also ich habe jetzt folgende fragen auf jeden fall offen:
stimmt diese Reihenfolge :
initialisieren des Masters -->start condition senden --> adresse des
anzusprechenden Atmegas senden --> Daten senden --> stop condition
senden
Wofür ist das TWI Bit Rate Register – TWBR und woher weiß ich was ich da
eintrgen soll. ich vermute das das irgendwas mit der Geschwindigkeit von
SCL zu tuhen hat (mein Prozessor läuft mit 1hz Internen takt) wenn ihr
mir sagt das ich den höher stellen soll, mache ich das :)
wie sende ich den die Adresse des anzusprechenden Controllers
Helft mir bitte,
habt doch mitleid mit einem noob :)
MFG Christian
Christian schrieb:> (mein Prozessor läuft mit 1hz Internen takt)
Ich hoffe doch, du meinst 1 M Hz?
TWBR ist im Datenblatt beschrieben - damit lässt sich der Teiler und
damit die SCL-Frequenz festlegen.
Gruß, Marcel
EDIT:
Beachte die Maximal-Frequenz der TWI-Verbindung sowohl beim Master als
auch beim Slave.
Zur Adresse: Im Forum sind genug Beispiele dazu zu finden - ich selbst
habe bisher aber keines davon getestet. Die Resonanz ist aber eher
positiv, kommentare sind auch genug vorhanden. ;)
Marcel Papst schrieb:> Ich hoffe doch, du meinst 1 M Hz?
Ja meine ich, hab mich verschrieben
aber wie errechne ich was ich da eintragen muss?
Im Datenblatt steht ja man soll die formel ;
CPU Clock frequency
__________________
16 + 2(TWBR) ⋅ 4^TWPS
anwenden das würde in meinem Fall ja bedeuten
1
__________________
16 + 2(TWBR) ⋅ 4^TWPS
Um das auszurechnen muss ich ja für TWBR und TWPS etwas einsetzten
aber was ?
Hi
Nimm für TWPS Null. Aber mit 1MHz Taktfrequenz bekommst du auf maximal
62,5 kHz TWI-Takt. Und die Taktfrequenz des Slaves muss 16x höher wie
der TWI-Takt sein.
MfG Spess
Hi
>Aber wenn ich für den TWPS1/TWPS0 "0" setze gibt das doch einen>Prescaler von 1 also rennt SCL dann nicht mit 1MHZ ?
Rate mal, was die 16 in der Formel bewirkt.
MfG Spess
wait1: ;Wait for TWINT Flag set. This indicates that the START condition has been transmitted
30
in r16,TWCR
31
sbrs r16,TWINT
32
rjmp wait1
33
34
rjmp match
35
36
rjmp loop
37
38
match:
39
ldi r16,255
40
out portd,r16
41
rjmp match
In dem Transmitter code ist die stelle "MARK1" zu finden ....
da muss die adresse des anzusprechenden µc´s rein oder ?
ich wollte erstmal nur den portb des atmega8 auf high stellen sobald er
merkt das er über twi angesprochen wird aber das funzt alles nicht :(
kann mir einer veraten was ich falsch mache ?
Hi
>Mag mit keiner helfen ?
Nicht gleich weinen. Ich habe dir mal Routinen für einen Master von mir
angehängt. Versuche dich mal rein zu finden.
An deiner Stelle würde ich als Slave erst mal einen einfachen I2C-IC,
wie PCF8574 nehmen. Erst wenn du den als Master korrekt ansprechen
kannst, lohnt es sich mit dem Slave weiter zu machen. So wie du es
angehst hast du zwei Baustellen. Und du weisst nicht auf welcher Seite
es klemmt.
MfG Spess
Das ist Gut denn ich habe in dem ganzen Datenblatt keine Infos zum
Register TWSB gefunden... war wahrscheinlich wieder zu dämlich:D... ich
habe zwar mitbekommen das sich da der zustand des buses befindet aber
wusste nich welcher Wert was bedeutet???? naja mit dem informationen in
deinem Routine Programm oben kann ich eine Menge anfangen und werde sie
jetzt einmal in mein Programm einbauen, den mitlerweile bekomme ich nun
nach 2 Tagen fummeln meinen wert vom atmega 32 auf den Atmega8 :)