Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage, Interrupts

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Frage, Interrupts

    Hallo zusammen,

    bevor ich anfange und mich dann evtl verzettel eine kurze Frage: benutzt/belegt Konnekting irgendwelche Interrupts am Arduino? Fuer mein erstes Projekt braeuchte ich welche, da taete das zu Problemen fuehren koennen.

    dank & gruss :: Michael

    #2
    Nein, bis dato wird kein Interrupt benutzt. Aber Knx.Task() sollte möglichst alle 400µs aufgerufen werden. Andernfalls droht Telegrammverlust, was so viel heisst wie: Gerät ist via KNX nicht zuverlässig ansprechbar.
    Und wenn Knx.Task() gerade "in Aktion" ist, sollte möglichst auch kein Interrupt laufen der Knx.Task() blockiert. Sonst droht auch in diesem Fall ein Telegrammverlust.

    Das Timing der BCU Kommunikation ist leider recht kritisch und systembedingt. Da können wir nicht viel ausrichten (außer einen weiteren µC einsetzen der sich um die BCU Kommunikation kümmert und vom Rest der "Applikation" entkoppelt laufen kann).

    [update]
    Okay, einen Interrupt haben wir. Der ist für den Programmier-Button. Eine Kollision ist aber recht unwahrscheinlich, da der Knopf äußerst selten gedrückt wird und auch keine lange Aktion ausführt. Es wird lediglich die LED eingeschaltet und intern ein "Programmiermodus"-Flag gesetzt. Mehr nicht.
    Zuletzt geändert von tuxedo; 26.08.2016, 06:59.

    Kommentar


      #3
      In dem Dimmer Sketch nutze ich einen Timer um eine Funktion per Interrupt aufzurufen. Bis jetzt habe ich keine Probleme festgestellt.... aber ich bin erst seit paar Tagen am testen...
      Aber Alex hat Recht, es können Telegramme verloren gehen

      Kommentar


        #4
        Was hast du vor, wenn ich fragen darf?

        Kommentar


          #5
          Bzgl. des Risikos eines Telegrammverlusts:

          Das kann man sich recht einfach ausrechnen wie hoch das Risiko ist:

          Jedes Telegramm das auf den Bus gesendet wird (von egal wem) kommt am Transceiver an und wird dem Arduino angeboten. Knx.Task() ließt Byte-Weise was ihm der Transceiver anbietet (das ließe sich noch optimieren).
          Wenn jetzt der Arduino mit anderen Dingen beschäftigt ist und nicht zeitnah Knx.Task() aufrufen kann um weitere Zeichen zu lesen, läuft das in ein Timeout und das empfangene Telegramm ist unvollständig und wird verworfen.

          Der Arduino muss erst das ganze Telegramm gelesen haben bevor entschieden wird ob es für ihn interessant ist oder nicht. Wenn auf dem Bus viel los ist, dann muss auch viel gelesen werden. Wenn wenig los ist, dann weniger.
          Und aus all dem gelesenen muss dann geschaut werden: Interessant oder Uninteressant.

          Je seltener ein für den Arduino interessantes Telegramm vorliegt, desto seltener wird, bei einer zeitlichen Überlastung/Ausreizung von Knx.Task() das Telegramm als "verloren" gelten, sprich, desto geringer das Risiko eines Telegrammverlusts.

          Idealerweise sollte aber gar nicht und niemals nie ein Telegramm am Arduino unvollständig gelten. Denn das kann die Usability des Geräts und damit das Vertrauen des Benutzers in die Zuverlässigkeit des Geräts schwächen. Denn ein "retry-mechanismus" ist hier nirgendwo vorgesehen oder möglich.

          Embedded-Programmierung ist in der Hinsicht recht anspruchsvoll.

          Lieber wäre es mir, es gäbe einen Empfangspuffer der ausreichend groß ist um auch mal 100ms zu überbrücken, bei voller Buslast. Aber aktuell ist das eher Wunschdenken.

          Wenn hier jemand kreative Vorschläge hat: Ich bin offen für alles (was ausreichend klein genug ist und preislich nicht auffällt)

          Kommentar


            #6
            Zitat von Eugenius Beitrag anzeigen
            Was hast du vor, wenn ich fragen darf?
            Eine IR-LED als virtuelle Wand fuer Scoobas/Roombas ansteuern, das ist momentan ueber 2 Interrupts realisiert (ist eine Rechteckspannung).

            Kommentar


              #7
              Wieso brauchst du zwei Interrupts um eine IR-LED zu steuern, die ja nur eine Rechteck-Spannung bekommt?

              Wobei ich mich schon über einen Interrupt wundere, da du ja etwas Ausgeben willst und nicht etwas einlesen. Kurzum: Interrupt für eine Ausgabe klingt erstmal "komisch".

              Kommentar


                #8
                Pulslaenge & Frequenz, ist viel simpler im Code wenn man das ueber Interrupts macht.

                Kommentar


                  #9
                  Dann nimm einen Timer (oder gleich eine lib dazu: MsTimer2, Flexitimer2) und fertig (die rufen per Interrupt deine Funktion auf alle x ms / µs)

                  Kommentar


                    #10
                    Und was hat er dann gewonnen? Außer dass er noch eine weitere Lib braucht? Die Interrupts bleiben ja.

                    Kommentar


                      #11
                      Ich würde es so machen:

                      Code:
                      FlexiTimer2::init(1,1/4000,function); //250µs
                      
                      void function (){
                      Knx.Task();
                      IRsend();
                      }
                      so hat man Interrupts und stört nicht der Kommunktion

                      und im IRsend();
                      die Timings mit Counts zählen.
                      Zuletzt geändert von Eugenius; 26.08.2016, 14:09.

                      Kommentar


                        #12
                        Das mag ja alles schoen und gut sein und sicher gibt es noch 1812 andere Arten das zu loesen, aber es gibt bereits ein funktionierendes "System" welches ich nur portieren moechte.
                        Daher habe ich als Frageform auch durchaus bewusst "wie ist das mit Interrupts" und nicht "ich brauche Hilfe beim Programmieren" gewaehlt

                        Kommentar


                          #13
                          dann war die Frage im Post 2 und 3 schon beantwortet

                          Kommentar


                            #14
                            korrekt

                            Kommentar

                            Lädt...
                            X