Verständnis Frage zu twi

#2338541
Lesenswert?

Hey Leute
Ich steh mal wieder an. Möchte gerne mal mit TWI arbeiten. Die ersten 
Versuche mit Bascom und einem Luftdrucksensor gelangen mir vor einiger 
Zeit schon recht gut. Doch jetzt wollte ich mehr und ging über den gcc. 
Um einigermaßen zu verstehen nahm ich mir die Lektüre vor: 
http://www.mikrocontroller.net/articles/AVR_TWI#Grundlagen

Nach ein wenig stöbern im Datenblatt fand ich raus das sich alles sehr 
ähnelt und das Beispiel sogar gleich ist.
Ich denke ich habe es jetzt so einigermaßen verstanden. Jedes Mal wenn 
das TWINT Bit gesetzt wird führt die Hardware den Datenaustausch durch 
(zumindest im Mastermode). Ist das richtig? Denn irgendwie wiederspricht 
sich das mit dem Datenblatt wo steht:

This bit is set by hardware when the TWI has finished its current job 
and expects application
software response.

Und auch steht: Also note that clearing this flag starts the operation 
of the TWI, so all accesses to the TWI Address Register (TWAR), TWI 
Status Register (TWSR), and TWI Data Register (TWDR) must be complete 
before clearing this flag.

Warum wird das Bit dann immer gesetzt wie z.B. um das Startsignal zu 
erzeugen:

TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);


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

}

Dieses Beispiel findet sich im Datenblatt wie in meiner Lektüre gleich.

Leider funktioniert das Beispiel auch nicht. Mein Programm befindet sich 
im Anhang. Wenn mal jemand so nett wär und mal drüber sehen könnte, 
vielleicht ist es auch nur ein dummer Fehler (Meine starke Vermutung) 
aber beim ersten Fehler kommt schon eine Meldung. Oder könnte das auch 
Hardware verbunden sein? Ich benütze zurzeit das Pollin Board mit einem 
24C04 EEPROM und 10k Pullup Widerständen

Wäre für  Hilfe sehr Dankbar!
MFG Stephan
Angehängte Dateien:
#2338569
Lesenswert?

Stephan Hochmüller schrieb:
> Die ersten
> Versuche mit Bascom und einem Luftdrucksensor gelangen mir vor einiger
> Zeit schon recht gut. Doch jetzt wollte ich mehr und ging über den gcc.

Hört sich für mich etwas nach I²C an. Wieso nimmst du nicht einfach was 
fertiges: http://homepage.hispeed.ch/peterfleury/avr-software.html (i2c 
Lib). Geht bei mir wunderbar mit allen erdenklichen I2C Sensoren 
(Luftdruck => MPL115A2, Temperatur etc.)
Gast #2338676
Lesenswert?

Hi

>Warum wird das Bit dann immer gesetzt wie z.B. um das Startsignal zu
>erzeugen:

Es wird nicht gesetzt, sondern gelöscht .

Datenblatt:

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

MfG Spess
Gast #2338859
Lesenswert?

Hi

>Ist das wieder eins der Bits wo 0=1 und 1=0? Ich komme da nicht ganz mit

Ganz einfach. Das Bit wird gelöscht indem man eine 1 an die Stelle 
schreibt. Gleichzeitig wird damit die mit den anderen Bits bestimmte 
TWI-Operation gestartet. Das Schreiben einer 0 bewirkt bei TWINT nichts.

Das Löschen durch Schreiben einer 1 trifft auch auf viele andere 
'INT-Bit' zu.

MfG Spess
#2338908
Lesenswert?

OK verstehe. Vielen Dank kann es jetzt kaum erwarten wieder ans 
Programmieren zu gehen aber jetzt steht mal Lernen und Trainieren am 
Programm


Und sorry habe den vorigen Beitrag aus Versehen gelöscht. Hier nochmal:

Vielen Danke für eure Antworten!
Nur eins versteh ich dann nicht! Dann müsste es ja eigentlich heißen:
TWCR = (1<<TWSTA)| (1<<TWEN);
TWCR &= ~(1<<TWINT);

Und nicht:

TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

Wobei im Datenblatt steht auch (betrifft aber eigentlich nur die 
Interrups):
The TWINT Flag must be cleared by software by writing a logic one to it.

Ist das wieder eins der Bits wo 0=1 und 1=0? Ich komme da nicht ganz mit 
:/.

MFG Stephan

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