mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I²C/TWI in Avr-studio betreiben


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;)

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja klar aber wenns erklärt wird is es 1. immer besser und in dem fall 
auf Deutsch :D
MFG Chris

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Marcel Papst (phpmysqlfreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. ;)

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wenn ich für den TWPS1/TWPS0 "0" setze gibt das doch einen 
Prescaler von 1 also rennt SCL dann nicht mit 1MHZ ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Rate mal, was die 16 in der Formel bewirkt.

Danke für den Tipp ;)
Okay dann setzte ich den mal auf 0
und was ist mit TWBR ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>und was ist mit TWBR ?

Mit TWPS=0 wird 4^TWPS=1. Damit hat die Formel nur noch eine Unbekannte. 
Den Rest solltest du selbst können.

MfG Spess

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Den Rest solltest du selbst können.

-.-* erlichgesagt nein

ist 4^1=4 oder ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ist 4^1=4 oder ?

Ja. Simple Potenzrechnung.

MfG Spess

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Ja. Simple Potenzrechnung.

peinlich :]

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Langsam verzweifele ich....
ich habe jetzt ffolgende Programme geschrieben;

ersmal der Master Transmiter:
 
.include "m32def.inc"

iniatall:

  ldi r16, LOW(RAMEND)
    out SPL, r16
    ldi r16, HIGH(RAMEND)
    out SPH, r16

ldi r16,255
out DDRA,r16
ldi r16,0
out DDRB,r16
ldi r16,255
out portb,r16


ldi r16, 0<<TWPS1 | 0<<TWPS0
out TWSR,r16

ldi r16,255
out TWBR,r16



loop:

ldi r16, (1<<TWINT) | (1<<TWSTA) | (1<<TWEN)      ;1 START condition senden
out TWCR, r16


wait1:                                       ;Wait for TWINT Flag set. This indicates that the START condition has been transmitted
in r16,TWCR
sbrs r16,TWINT
rjmp wait1


ldi r16,0b11001100                      ;Load SLA_W into TWDR Register. Clear TWINT bit in TWCR to start transmission of address
out TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)  ;MARK 1 /// MARK 1 //// MARK 1 /// MARK 1 //// MARK 1 /// MARK 1 //// 
out TWCR, r16

wait2:                                       ;Wait for TWINT Flag set. This indicates that the SLA+W has been transmitted, and ACK/NACK has been received.
in r16,TWCR
sbrs r16,TWINT
rjmp wait2


ldi r16, 0b11011101                          ; daten reinladen
out TWDR, r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR, r16

wait3:
in r16,TWCR
sbrs r16,TWINT
rjmp wait3


ldi r16, (1<<TWINT) |(1<<TWSTO)  | (1<<TWEN)                  ; STOP condition senden
out TWCR, r16

rcall wait
rjmp loop

wait:
ldi r17,255
ws1:
ldi r18,255
ws2:
dec r18
brne ws2
dec r17
brne ws1
ret

und den slave Receiver
.include "m8def.inc"

iniatall:

  ldi r16, LOW(RAMEND)
  out SPL, r16
  ldi r16, HIGH(RAMEND)
  out SPH, r16

ldi r16,255
out DDRd,r16


ldi r16, 0<<TWPS1 | 0<<TWPS0
out TWSR,r16

ldi r16,255
out TWBR,r16

ldi r16,0b11001101
out TWAR,r16



loop:
ldi r16, 1<<TWEA | 1<<TWEN
out TWCR,r16

wait1:                                       ;Wait for TWINT Flag set. This indicates that the START condition has been transmitted
in r16,TWCR
sbrs r16,TWINT
rjmp wait1

rjmp match

rjmp loop

match:
ldi r16,255
out portd,r16
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 ?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mag mit keiner helfen ?
MFG Chris

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.