@Klebwax
Tut mir leid, jetzt kommen eher Fragen
Und was passiert tatsächlich mit folgenden beiden C-Codezeilen?
Erzeuge STOP mit sofort folgendem START in der TWI-Hardware:
TWCR = (1<<TWSTO)|(1<<TWINT) | (1<<TWEN)|(1<<TWIE);
TWCR = (1<<TWSTA) |(1<<TWINT) | (1<<TWEN)|(1<<TWIE);
Der Compiler macht daraus:
4d6: 85 e9 ldi r24, 0x95 ; 149
4d8: 80 93 bc 00 sts 0x00BC, r24 <<== Register für TWI-Hardware im mega168 und anderen AVRs.
4dc: 85 ea ldi r24, 0xA5 ; 165
4de: 80 93 bc 00 sts 0x00BC, r24
Hier liegen wir garantiert unter den 1.3 us und nun stellen sich mir folgenden Fragen:
Was macht die Hardware tatsächlich, wenn sie STOP'en und sofort wieder START'en soll?
Wird dann der Softwareteil beim START'en verzögert? Kann ich mir beim besten Willen nicht vorstellen.
OK, nach dem START wird es etwas dauern, bis im TWSR das Bit TWINT wieder gesetzt wird. Klar, das macht die Hardware.
Wenn ich die TWI-Hardware benutze, dann sollte ich natürlich nicht dein angegebenes "... und im Code darauf gewartet wird. ..." dahingehend wörtlich nehmen, dass ich nun eine Schleife im Code bauen soll, die zwischen STOP und START prüft, "... das sich der Status ändert ..."?
Kannst du deine Erklärung genauer formulieren, bzw. mir eine Erklärung geben, die ich verstehe?
Da die TWI-Hardware, nach einem durch die Software angegebenem STOP-Kommando an das Register TWCR, sich nicht mehr per Interrupt meldet, da nämlich kein Status-Wert für diese Aktion definiert ist im TWSR-Register (ODER habe ich diese Info noch nicht gefunden!), kann ich somit den nächsten START-Aufruf tatsächlich nur ohne Interrupt-Kontrolle erzeugen.
Also auch im Extremfall wie oben angegeben.
Im Handbuch finde ich folgendes: (mega48 bis 328 )
Im Kapitel "Overview of the TWI Module" Unterpunkt "Bus Interface Unit":
"When in Transmitter mode, the value of the received (N)ACK bit can be determined by the value in the TWSR."
Also hier noch keine Angabe, was im TWSR nach einem STOP steht.
Im Kapitel "Using the TWI" ist das Bild "Interfacing the Application to the TWI in a Typical Transmission" angegeben, welches die Aktionen von Software und Hardware sehr schön im (typischen) Zusammenspiel zeigt.
Hinter dem STOP wird hier nichts mehr angegeben.
Hast du hier eine Info, ob, und wie, der STOP-Zustand auf dem BUS im TWSR 'zu sehen' ist?
Und das dazu wohl wichtigste Kapitel:
"Overview of the TWI Module" Unterpunkt "Control Unit" ist zu finden, wann das Bit TWINT im TWSR gesetzt wird um anzuzeigen, das die Hardware fertig ist.
• After the TWI has transmitted a START/REPEATED START condition.
• After the TWI has transmitted SLA+R/W.
• After the TWI has transmitted an address byte.
• After the TWI has lost arbitration.
• After the TWI has been addressed by own slave address or general call.
• After the TWI has received a data byte.
• After a STOP or REPEATED START has been received while still addressed as a Slave.
• When a bus error has occurred due to an illegal START or STOP condition.
Dort ist KEINE ANGABE vorhanden, das ein STOP das Bit setzt.
Aus meiner Sicht ist somit nicht zu prüfen, wann das STOP 'fertig' ist. --> Alles eben beim ATmega und nicht in einem PIC.
Gruß aus dem frühen neuen Tag
Sternthaler
Nachtrag:
Vielleicht doch ne' Lösung vorhanden?
In "Transmission Modes" Unterkapitel "Miscellaneous States" steht natürlich noch etwas zu diesem "illegal START or STOP condition"
Table 22-6. Miscellaneous States
0x00 Bus error due to an illegal START or STOP condition
No TWDR action 0 1 1 X
Only the internal hardware is affected, no STOP condition is sent on the bus. In all cases, the bus is released and TWSTO is cleared.
Lesezeichen