-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: I2C-Befehle unterbrechen

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544

    I2C-Befehle unterbrechen

    Anzeige

    Hi,

    bevor ich jetzt mit dem basteln und programmieren anfange, wollte ich mal fragen, was passiert wenn mehrere I2C-Befehle (Start, Send, Receive, Stop) durch andere I2C-Befehle unterbrochen werden?
    Hintergrund:
    Auf einem ATXMega32A4 wird mit 800Hz eine Routine aufgerufen, die einen Sensor über I2C abfrägt. Jetzt möchte ich in der Mainloop einen anderen I2C-Slave abfragen, weiß aber nicht so genau, was passiert wenn z.b. in der Mainloop schon die Adresse des einen Slave gesendet wurde und dann der Interrupt reinkommt und den anderen Slave anspricht? Den Interrupt disablen ist leider nicht möglich, da es eine Software für meinen Quadrocopter ist und dieser Interrupt die Regelschleife darstellt. Beide Slaves hängen an der selben Schnittstelle (TWIC).

    Wäre nett, wenn jemand da mal was schreiben könnte

    Gruß
    Chris

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Hey,

    ich denke mal, dass es dann zu einem komischen Verhalten der Busteilnehmer führen kann.
    Der Fall der am wenigsten schlimm wäre wäre der, wenn der Slave dann einfach nur ein Error ausgibt, weil er den Befehl nicht versteht.
    Wenn der Fall eintritt das schon ein Slave adressiert wurde, kannst du keinen anderen Slave adressieren, da der Slave ein Ack auf den Bus gibt wenn er adressiert wurde.
    Der Fall würde dann etwa so ablaufen:
    Slave 1 wird adressiert und bestätigt diese. Er wartet nun auf Befehle
    Du willst Slave 2 adressieren und der Slave 1 würde diese Adresse u.U. als Befehl werten
    Slave 1 reagiert auf den Befehl und Slave 2 wird nicht adressiert
    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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.08.2008
    Ort
    Hallein
    Alter
    26
    Beiträge
    802
    Interrupt setzt ein Flag -> I2C Kommunikation wird erst im Mainloop durchgeführt.
    Kultuverein Metal Resurrection, für mehr Bands und Konzerte in Österreich (:

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    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

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Zitat Zitat von Che Guevara Beitrag anzeigen

    @Kampi,
    genau so dachte ich mir das auch, aber ich war nicht sicher, obs da nicht irgendeine Art Sicherung gibt...
    Hey,

    hardwaremässig gibt es keine Sicherung (zumindest weiß ich nichts davon).
    Du musst sowas durch deine Software umgehen.
    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

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hm ok, dann werd ich mir mal was überlegen... Danke für eure Antworten!

    Gruß
    Chris

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.400
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Hi,

    @Kampi,
    genau so dachte ich mir das auch, aber ich war nicht sicher, obs da nicht irgendeine Art Sicherung gibt...
    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.

    Zitat Zitat von Che Guevara Beitrag anzeigen
    @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.
    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 !

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.400
    Zitat Zitat von for_ro Beitrag anzeigen
    Wenn nicht, bleibt noch die Möglichkeit, einzelne Teile der gesamten Kommunikation zwischen den interrupts durchzuführen, so wie Klabwax das vorgeschlagen hat.
    Du hast mich missverstanden. Nicht zwischen den Interrupten, in den Interrupten. Sonst muß, wie ich schon sagte, die Mainloop schneller als die Interrupte sein und man kann nie eine längere Berechnung machen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    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

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Loop unterbrechen
    Von bomberman_z im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 02.11.2008, 22:29
  2. Wait-Anweisung durch Interrupt unterbrechen?
    Von CapSob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 18
    Letzter Beitrag: 05.06.2008, 11:30
  3. akku laden ohne betrieb unterbrechen (wie beim handy)
    Von Russak2007 im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 23.12.2007, 18:13
  4. for Schleife unterbrechen
    Von Sunstar im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 31.08.2007, 18:23
  5. Programm unterbrechen durch Sensor?
    Von Trabukh im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 07.02.2005, 15:40

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •