hallo liebe elektro kollegen,
ich hab da ein problem mit i2c. alles läuft soweit zwischen meinen 2
atmegas (schreiben und lesen bei beiden), jedoch wird bei beiden kein
interrupt ausgelöst. zuerst klatsche ich cli(), danach initialisiere ich
I2C und anschließend sei(). interrupt-bit ist während der I2C init.
gesetzt.
es soll eine led blitzen, dann 1000 ms warten und wieder blitzen.
jeweils beim slave und master passiert es nicht.
meine funkktionskopf sieht so aus für das interrupt:
ISR(TWI_vect).
danke liebe kollegen, ich liebe euch alle
der_elektro_thorben schrieb:> zuerst klatsche ich cli(), danach initialisiere ich> I2C und anschließend sei().
Schön, damit sind also global die Interrupts enabled. Das ist schonmal
eine wichtige Voraussetzung dafür, dass überhaupt irgendein Interrupt
ausgelöst werden kann.
> interrupt-bit ist während der I2C init.> gesetzt.
Welches Interupt-Bit ist da gesetzt? Das globale ja wohl nicht, dem
widerspräche deine obige Aussage. Bleibe also nur das lokale für I2C.
Aber welches, das Masken-Bit oder das Flag-Bit?
Und übrigens, egal welches von beiden: Das IST sicher keinesfalls
gesetzt, während I2C init, bestenfallsWIRD das Richtige von beiden
im Zuge der Initialisierung irgendwann von deinem Code gesetzt.
Nun brauchst du also nur noch zu zeigen, wo und wie du das machst...
danke für die antworten, kollegen.
ich erkläre kurz mal, wie ich es gemacht habe.
zuerst setze ich die frequenz, was auch klappt.
anschließend wird das TWIE bit in TWCR gesetzt.
so sieht mein befehl, nachdem die frequenz gesetzt wurde, aus:
TWCR |= (1 << TWIE);
beim master klappt es soweit, jedoch beim slave nicht.
der reagiert nicht dadrauf.
löst sich der interrupt aus, wenn die übertragung (lesen und schreiben)
erfolg ist?
besten dank
der thorben
Hi
>beim master klappt es soweit, jedoch beim slave nicht.>der reagiert nicht dadrauf.
Kann auch nicht. Im Slavemode wird das von der Hardware bedient.
MfG Spess
der_elektro_thorben schrieb:> uint8_t twbr = ( ( f_cpu / (1000*f_scl) ) - 16 ) / 2;> if( twbr <= 255)
Das ist für die Tonne, weil ein uint8_t Wert immer <= 255 ist.
der_elektro_thorben schrieb:> TWCR |= (1 << TWIE);
Das sieht irgendwie richtig aus.
Aber: Hast du auch TWEN gesetzt? Das ist zwingend erforderlich. Wenn die
Hardware überhaupt nicht läuft, kannst die Interrupt-Masken setzen,
soviel du willst, der Interrupt wird sicher niemals ausgelöst werden.
Ganz analog z.B. zur UART. Da kannst du RXCIE und TXCIE setzen bis zum
Abwinken, wenn nicht gleichzeitig auch TXEN und RXEN gesetzt ist,
passiert da garnix.
Fuck: RTFM.
Scheinbar habt ihr alle bessere Glaskugeln wie ich :-(
Das ist gemein! (Wo kann ich mich beschweren?)
Vielleicht kann der TO für Chancengleichheit sorgen, wenn er den
kompletten Code veröffentlicht?
ich probiere später es mit twint auch nochmal, dachte man muss twint
nicht setzen und es setzt sich von allein.
schaue dann und schreibe später, obs so geht
sorry, will nicht vollspawnen, aber das mit twbr und der if abfrage
mache ich, aufgrund der rechnung von oben :D. mein vorheriger post war
nicht korrekt.