-
Ich will ja von nix abhalten, will nur selber wissen obs das auch braucht.
Es wird auf jeden Fall interessant sein zu sehen wie lange das TWSTO nun gesetzt bleibt, das DB meint ja :
"When the STOP condition is executed on the bus, the TWSTO bit is cleared automatically."
Das können doch max. 2 Takte zu, sagen wir mal, 100kHz sein,
kommt dann auf 320 Takte bei 16MHz ? oder :-k
schau ma mal ... 8-[
-
Hi,
dabei musst du bedenken, dass I²C auch wesentlich langsamer (Slave-Drosselung) und wesentlich schneller (FastMode) sein kann.
Aber ansich ein schönes Experiment. Freu mich auf deine Ergebnisse ;)
Gruß, CowZ
-
Ja dann sind wir mal nicht so ;-)
ich hab als Testprogramm das aus der Wiki-Seite verwendet, und gleich nach der Stop übergabe diese Warteschleife eingebaut:
Code:
Do
Incr Testcnt
Loop Until Twcr.twsto = 0
Print "stop: " ; Testcnt
Bei 16Mhz komme ich auf den Wert 9.
So schaut das ganze in Assembler aus:
Code:
# Do
# Incr Testcnt
+00000106: E6A4 LDI R26,0x64 Speicherort von Testcnt
+00000107: E0B0 LDI R27,0x00
+00000108: 918C LD R24,X Wert aus SRAM holen
+00000109: 5F8F SUBI R24,0xFF +1
+0000010A: 938C ST X,R24 Wert wieder ins SRAM
+0000010B: 2700 CLR R16 Clear Register
+0000010C: 27BB CLR R27 Clear Register
+0000010D: E5A6 LDI R26,0x56 TWCR über SRAM holen
+0000010E: 918C LD R24,X Load indirect
+0000010F: FB84 BST R24,4 Bit store from register to T, TWSTO ist Bit4
# ... Twcr.twsto = 0 ?
+00000110: F40E BRTC 0x0112 Branch if T flag cleared
+00000111: E001 LDI R16,0x01 Load immediate
+00000112: E040 LDI R20,0x00 Load immediate
+00000113: 1704 CP R16,R20 Compare
+00000114: F011 BREQ 0x0117 Branch if equal, fertig
# loop
+00000115: 940C0106 JMP 0x00000106
+00000117: ....
kann ja mal jemand nachrechnen wieviel Takte das sind ;-)
-
Hi,
mhh...
15 Takte pro Schleife, 9 Schleifen
=> 135 Takte
Kommt natürlich nich ganz hin, weil am Ende das BRTC schon anschlägt usw. aber so ~100 Takte sollten hinkommen.
Viel genauer brauchen wir das ja aber auch nicht, da ja - wie gesagt - die Busgeschwindigkeit variieren kann.
Gruß, CowZ
-
Also dauert der Vorgang keinen ganzen Takt auf TWI-seite,
jetzt müsste man noch mit höherer Busgeschwindigkeit probieren, ob es da auch schneller geht, und das man sieht ob der Vorgang von der TWI-Geschwindigkeit abhängt.
Denn es muss ja nur SDA losgelassen werden.
-
Dann kommt auch noch das Ergebnis zu der Busgeschwindigkeit von 400kHz,
nach dem STOP zählt er jetzt nur noch bis 3.
Ist dann auch ca. die Dauer eines Taktes vom TWI.
-
Ja, sollte ja auch so sein ;)
Und die 300 µC-Takte sollte er dann keine neuen Sachen anfangen. Daher ist also ein warten auf das STOP schon sinnvoll. (Oder? ;))
Gruß, CowZ
-
Ich würde trotzdem sagen, das Warten der falsche Begriff ist, nach dem Stop würde ich jetzt immer noch nicht warten, wenn ich sehe was man da nur machen kann in der Zeit, das braucht man ja schon um zu entscheiden das man ein neues Start will, besser ist es noch vor einem neuen Start nachzuschauen ob das STOP evtl. noch gesetzt ist !
Ist ja sonst nur Zeitverschwendung ;-)
-
Hi,
ja ok, so wollte ich es ja auch machen :P
Gruß, CowZ