Forum: Mikrocontroller und Digitale Elektronik Verständnis Frage zu twi


von Stephan H. (stiph5)


Angehängte Dateien:

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

von Timmo H. (masterfx)


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.)

von Michael L. (michaelx)


Lesenswert?

Timmo H. schrieb:
> Hört sich für mich etwas nach I²C an.

TWI ist ja auch die lizenzkostenfreie "Umschreibung" für I2C. ;-)

von heldvomfeld (Gast)


Lesenswert?

War die lizenskostenfreie "Umschreibung". Das Patent für I2C ist schon 
vor einigen Jahren abgelaufen und kann jetzt frei verwendet werden.

von spess53 (Gast)


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

von Volker S. (volkerschulz)


Lesenswert?

Michael L. schrieb:
> TWI ist ja auch die lizenzkostenfreie "Umschreibung" für I2C. ;-)

heldvomfeld schrieb:
> War die lizenskostenfreie "Umschreibung". [...]

Weder noch. Eine patentierte Technologie wird ja nicht lizenzkostenfrei 
nur weil man ihr einen neuen Namen gibt. Ausser vielleicht in China... 
;)

Volker

von Timmo H. (masterfx)


Lesenswert?

Michael L. schrieb:
> Timmo H. schrieb:
>> Hört sich für mich etwas nach I²C an.
>
> TWI ist ja auch die lizenzkostenfreie "Umschreibung" für I2C. ;-)
TWI kann noch etwas mehr als nur I²C.

von spess53 (Gast)


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

von Stephan H. (stiph5)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Stephan Hochmüller schrieb:
> TWCR &= ~(1<<TWINT);
Würde eine logical Zero schreiben.
Verlangt ist aber, dass man eine 1 reinschreibt und dann wird das Flag 
auch gelöscht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.