TWI atmega8 Denkfehler TWINT

Gast #2420175
Hi @ all,

ich hab da ein paar bauteile die mal über TWI ansteuern wollte , also 
hab ich mich rangesetzt und gelesen.
irgentwie bin ich auf ein problem gestoßen das ich nicht verstehe:

Bsp.
Master transmitter Mode
ich will die start-condition senden.   also :
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

jetzt muss gewartet werden bis das TWINT flag von der hardware gestzt 
wird ( es wird auf 0 gesetzt ( wir erinnern uns das ich es eben mit 
meinem Code auf 1 gesetzt habe ))

jetzt kommen wir zum problem, überall wo ich nachgelesen haben kommt 
jetzt die warteschleife um zu sehen ob das flag gesetzt wurde :
        while(!(TWCR & (1<<TWINT)));

nach den beschreibungen soll die Schleife warten bis dercontoller fertig 
ist und TWINT wieder auf null gesetzt hat, ABER die schleife läuft doch 
die ganze zeit rund wenn TWINT 0 is.

das heist : ich setzte das ding 1
            die harware macht es wieder zur 0
            und dann läuft es in einer endlosschleife

aber so steht das überall
http://www.mikrocontroller.net/articles/AVR_TWI

wo ist mein FEHLER ?

thx im vorraus
Gast
Hi

>jetzt muss gewartet werden bis das TWINT flag von der hardware gestzt
>wird ( es wird auf 0 gesetzt ( wir erinnern uns das ich es eben mit
>meinem Code auf 1 gesetzt habe ))

Du hast es gelöscht:

The TWINT Flag must be cleared by software by writing a logic one to it.

MfG Spess
Gast
ja das is klar

ich habe es ge"cleared" auf eins gesetzt

die hardware arbeitet und setzt das flag wieder , dann ist es 0

und darauf soll die schleife warten.
aber die läuft endlos wenn es null ist
Gast
ok denke ich habs halbwegs verstanden.

aber wiso läuft mein programm dann immer endlos in dieser schleife fest?

egal was is ob das senden von start klapt oder nicht irgend wann muss 
die schleife sich doch verändern oder?
Gast
Hi

>aber wiso läuft mein programm dann immer endlos in dieser schleife fest?

Bin ich überfragt. Ich habe das in Assembler programmiert. Wie sieht 
deine Hardware aus?

MfG Spess
Black-Devel schrieb:
> Master transmitter Mode
> ich will die start-condition senden.   also :
>   TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

Wenn du wie hier eine START Bedingung gesendet hast, musst du jetzt auf 
das TWINT = '1' ? pollen. Denn die Hardware setzt das TWINT auf '1' wenn 
es eine Aktion ausgeführt hat.

Das heißt für dich:
Wenn TWINT Bit == '1' dann kannst du nächste Aktion ausführen!

Also:
1
while(!(TWCR & (1<<TWINT)));

Steffen
Gast
da mein programm aber immer in der schleife stecken bleibt muss ich doch 
davon ausgehen, dass das senden von start nich abgeschlossen wurde und 
ich nicht die nächste aktion ausführen kann, oder?
Gast
Hi

>Wenn du wie hier eine START Bedingung gesendet hast, musst du jetzt auf
>das TWINT = '1' ? pollen. Denn die Hardware setzt das TWINT auf '1' wenn
>es eine Aktion ausgeführt hat.

Macht er doch:

>while(!(TWCR & (1<<TWINT)));

MfG Spess
Es war schon etwas verwirrend nach obiger Beschreibung. Hat Black-Devel 
es jetzt so gemacht, oder hat er es nur so gelesen..
Wollte nur nochmal Klarheit schaffen Spess.

Dann hat er den TWI vieleicht nicht richtig initialisiert oder keine 
Pullup-Widerstände an SCL, SDA gegen Vcc.

Steffen
Gast
Hi

>Dann hat er den TWI vieleicht nicht richtig initialisiert oder keine
>Pullup-Widerstände an SCL, SDA gegen Vcc.

Oder er versucht es zu simulieren:

Two-wire Serial Interface (TWI)
TWI is not supported.

MfG Spess
Gast
Hi

>muss ich am mega8 externe pull_up's oder kann ich auch die internen
>nehmen?

Für Versuche mit kurzen Leitungen ja. Für den praktischen Einsatz um 
eine Zehnerpotenz zu gross.

MfG Spess
Gast
ja ich wollte es ja auch nur auf einem kleine board testen.
ich werds alles nochmal durchgehen und austesten .

wenn ich noch probleme habe melde ich mich nochmal


danke erstaml
Laut Datasheet sollte es auch mit internen Pullups gehen.

>>Note that the internal pull-ups in the AVR pads can be enabled by setting
>>the PORT bits corresponding to the SCL and SDA pins, as explained in the
>>I/O Port section. The internal pull-ups can in some systems eliminate the
>>need for external ones.

Allerdings hat es so bei mir noch nie funktioniert. Habe die Pullups 
immer als Externe dran.

Steffen
Ich habe letztens auch das TWI des ATmega8 in Betrieb genommen und habe 
das gleiche Problem gehabt.

Daher das ich es nicht mit Pollen des Register lösen konnte habe ich ein 
Flag-Byte mit verschiedenen Bits für verschiedene "Ereignisse".

Somit setze ich beim starten des TWI "Flag&= ~(1<<TWI);"
und sobald ich einen Interrupt bekomme (TWCR|= 1<<TWIE) setze ich 
"Flag|= 1<<TWI;".

Somit brauche ich nur while((Flag&= 1<<TWI)==0) {}; zu warten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.