TWI atmega8 Denkfehler TWINT

Gast #2420175
Lesenswert?

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 #2420181
Lesenswert?

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 #2420191
Lesenswert?

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 #2420215
Lesenswert?

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?
#2420253
Lesenswert?

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 #2420260
Lesenswert?

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 #2420261
Lesenswert?

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
Gast #2420291
Lesenswert?

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
#2420323
Lesenswert?

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
#2420477
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren