Interrupt setzt ein Flag -> I2C Kommunikation wird erst im Mainloop durchgeführt.
Interrupt setzt ein Flag -> I2C Kommunikation wird erst im Mainloop durchgeführt.
Kultuverein Metal Resurrection, für mehr Bands und Konzerte in Österreich (:
Hi,
@Kampi,
genau so dachte ich mir das auch, aber ich war nicht sicher, obs da nicht irgendeine Art Sicherung gibt...
@TheDarkRose,
du meinst, ich solle in der ISR nur ein Flag setzen und das ganze Programm dann in den Mainloop stecken und auf das Flag warten? So hatte ich es vorher, bis ich gemerkt hatte, dass ich da das Timing nicht so sauber hinbekomme... Deswegen ist es jetzt so und ich werde es auch so belassen.
Gruß
Chris
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Hm ok, dann werd ich mir mal was überlegen... Danke für eure Antworten!
Gruß
Chris
Wenn du I2C in Hardware nutzt, gibt es schon gewisse Sicherungen, ein Byte, daß gerade auf den Bus geschoben wird, kann man nachträglich nicht mehr ändern. Das rettet aber nicht den ganzen Frame.
Das mit dem Flag kann auch nicht gehen. Die Mainloop müßte schneller als die Interrupte sein, sonst verliert man Interrupte.
Die einzige Möglichkeit ist umgekehrt. Man muß sich das Timing ganz genau ansehen und die I2C Übertragungen so auf die Interrupte verteilen, daß sie nicht ineinander laufen. Das erfordert sorgfältige Planung.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Hallo Chris,
reicht denn 1/800 s nicht, um den zweiten Sensor abzufragen? Ist doch eigentlich jede Menge Zeit. Allerdings musst du davon noch die Ausführungszeit der I2C Befehle im Interrupt abziehen.
Wenn das reicht, musst du die I2C Kommunikation nur unmittelbar nach dem Interrupt machen, wie oben geschrieben mittels eines Flag.
Wenn nicht, bleibt noch die Möglichkeit, einzelne Teile der gesamten Kommunikation zwischen den interrupts durchzuführen, so wie Klabwax das vorgeschlagen hat.
Hi,
nunja, ich erklärs mal ein bisschen:
Alles, was in der ISR(1) abgearbeitet wird dauert im Worst-case ca. 0.666ms. Die ISR(1) wird alle 1.25ms aufgerufen, d.h. zwischen zwei ISR-Aufrufen bleiben ca. 0.6ms Zeit. Dann gibts allerdings noch einen zweiten und einen dritten Interrupt, diese sind für das einlesen des PWM-Summensignals verantwortlich. Wann diese genau kommen, hängt immer von der Stellung der Fernsteuerungsknüppel ab. Diese beiden Interrupts sind Hi-Level, d.h. sie können den anderen Interrupt (Lo-Level) jederzeit unterbrechen.
Es ist also so, dass selbst wenn ich die I2C-Kommunikation direkt nach der Regelschleifen-ISR(1) ausführe ich nicht weiß, ob nicht ein anderen Interrupt dazwischen kommt und direkt danach dann wieder die ISR(1).
Ich hoffe ihr versteht die Thematik.
Gruß
Chris
Was man machen kann, ist folgendes:
I2C wird nur in ISR(1) gemacht. Das kann dann auch mal von einem anderen Interrupt unterbrochen werden, solange weder in main() noch in einem anderen Interrupt die I2C-Hardware angefasst wird. Das schlimmste was passieren kann, ist das die Pause zwischen zwei I2C Bytes etwas länger wird.
Nicht in jedem ISR(1) wird das gleiche gemacht. Mal wird der eine Sensor, mal der andere abgefragt. Dadurch wird die ISR nie zu lang. Dazu kann man einen Zähler in der ISR mitführen, und die Sensoren je nach Zählerstand auswählen.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Lesezeichen