Programme und Tips zu Arduino

  • Du sprichst vom Atomaren Datenzugriff.

    Ja genau! Hier hatte ich darüber gelesen: https://www.arduino.cc/referen…ope--qualifiers/volatile/


    Theoretisch hast du natürlich recht. Praktisch ist es im Rundenzähler Beispiel vom Programmablauf aber so, dass der kritische Code ja nur einmal ausgeführt wird, wenn kürzlich der dazu gehörige Interrupt ausgelöst wurde.

    Das verstehe ich nicht ganz. Denn das trifft zwar für die Variablen timestampx, nicht aber für die Integer-Variablen eventx zu. eventx wird in loop() permanent gelesen und geprüft. Da ist es doch nicht auszuschließen, dass die ISR just in dem Moment dazwischen funkt. Oder mache ich da einen Denkfehler?


    Die Zeitspanne liegt im konkreten Fall bei 40 - 48µS

    Interessant! Kannst du mir sagen, wie ich die Laufzeit der ISR feststellen kann? Man müsste doch den vom Compiler erzeugten Assemblercode kennen und dann die benötigten Takte zusammenzählen. Ist das aus irgendeiner Datei nach dem Compilieren ersichtlich? Vielleicht hast du einen Link, wo ich das nachlesen kann. Das wäre super!


    Gruß,

    RCfreund

  • Theoretisch hast du natürlich recht. Praktisch ist es im Rundenzähler Beispiel vom Programmablauf aber so, dass der kritische Code ja nur einmal ausgeführt wird, wenn kürzlich der dazu gehörige Interrupt ausgelöst wurde.

    Das verstehe ich nicht ganz. Denn das trifft zwar für die Variablen timestampx, nicht aber für die Integer-Variablen eventx zu. eventx wird in loop() permanent gelesen und geprüft. Da ist es doch nicht auszuschließen, dass die ISR just in dem Moment dazwischen funkt. Oder mache ich da einen Denkfehler?

    Oh, ja, eventx hatte ich übersehen. Ist aber praktisch im Beispiel nicht kritisch, weil es nur für eine Entscheidung heran gezogen wird.

    Das Deaktiven der Interrupts mittels NoInterrupt() kommt nur bedingt in Frage, weil es auf alle Interrupts wirkt. Das hätte zur Konsequenz, dass bei der Auswertung der einen Spur die andere nicht bzw. verspätet erfasst würde. Alternativ müsste man den einzelnen Interrupt in der ISR deaktivieren und in der Hauptschleife, wenn die interruptbedingten Dinge abgearbeitet sind, wieder aktivieren. Das ist eine Methode, die ich auch in der PWM Erfassung aktuell einsetze.


    Die Zeitspanne liegt im konkreten Fall bei 40 - 48µS

    Interessant! Kannst du mir sagen, wie ich die Laufzeit der ISR feststellen kann? Man müsste doch den vom Compiler erzeugten Assemblercode kennen und dann die benötigten Takte zusammenzählen. Ist das aus irgendeiner Datei nach dem Compilieren ersichtlich? Vielleicht hast du einen Link, wo ich das nachlesen kann. Das wäre super!


    Gruß,

    RCfreund

    Das ist die Zeit des Codeblocks für die Auswertung einer Spur in der Hauptschleife, nicht die der ISR. Die dürfte deutlich schneller abgearbeitet sein. Ich habe die Zeit mittels Zeitstempeln von micros() ermittelt. Bei ISR Routinen kann man das auch machen, ist aber kritisch, weil das Hantieren mit long Variablen entsprechend Zeit braucht. Eine alternative Methode geht mit der Hardware, man schaltet einen digitalen Ausgang und misst mit Oszilloskop oder anderen geeigneten Messgerät die Zeit.

    Die Takte der ASM Kommandos auszuzählen ist da doch etwas mühsamer. ;)

  • Das Deaktiven der Interrupts mittels NoInterrupt() kommt nur bedingt in Frage, weil es auf alle Interrupts wirkt. Das hätte zur Konsequenz, dass bei der Auswertung der einen Spur die andere nicht bzw. verspätet erfasst würde.

    Ok, das leuchtet ein!


    Ich habe die Zeit mittels Zeitstempeln von micros() ermittelt

    Ok. So mache ich das auch immer. Habe mir dazu auch 2 Funkionen gebastelt: StartStopwatch() und ReadStopwatch(). Diese geben mir auf dem seriellen Monitor die Zeiten von loop() aus und die Zeit zwischen StartStopwatch() und ReadStopwatch().


  • Schon lange still hier...


    ...trotzdem denke ich, dass meine Fragen hier gut aufgehoben sind, ohne erneut einen extra Thread zu eröffnen.


    Momentan beschäftigt mich folgende Frage: Kann ich Programme die auf einem Nano V3 (ATMega328) laufen, auch auf einem Nano EVERY (ATmega4809) laufen lassen, ohne da etwas umprogrammieren zu müssen?


    Wie ist das generell, mit dem Nano und seinen Nachbauten?

    Preislich sind da ja teils Welten dazwischen.


    Den Nano EVERY bekomme ich ohne Header für knapp 11 Euro in Deutschland, daher meine Frage.


    Demnächst werde ich euch eh noch mit Fragen bombardieren, momentan brennt aber nur diese Eine ;)




    LG

  • Da du in C programmmierst, ist die Plattform darunter egal.

    Aber: natürlich bestehen Unterschiede zwischen den Bausteinen, z.B. was Speicher und die Peripherieausstattung angeht.

    Kann also klappen, kann auch nicht, das hängt sehr von deinem Programm ab.

    Es gibt aber zahlreiche Arduinos mit dem 328, die sind ebensowenig pin- aber 100% codekompatibel. z.B. der Promini.


    Wie ist das generell, mit dem Nano und seinen Nachbauten?

    Ein "Nachbau" ist etwas anderes wie "ein völlig anderes Gerät, das durch Marketingtricks in die verkaufserfolgreiche Nähe zu einem Spitzenprodukt gerückt wird" ;)

    Schönen Gruß vom Jens

    Einmal editiert, zuletzt von amigaman () aus folgendem Grund: Ein Beitrag von amigaman mit diesem Beitrag zusammengefügt.

  • Hallo und einen schönen guten Abend,


    Ich habe mal eine Frage. Ich plane für mein neues Projekt wieder ein Monitor zu verbauen.


    Ich habe bei meinem Lastenfahrrad damals einen Raspberry Pi 3 benutzt mit einer externen Platine für das Display. Hier musste ich nur über die Bluetooth Tastatur die Videos auswählen und schon hat das alles so funktioniert wie gewünscht. Die Lautstärke hatte ich über einen Servo mit Zahnrad der den Verstärker Drehknopf bedient hat geregelt.


    Jetzt ist es ja so, das man mit dem Arduino sehr viel realisieren kann im Modellbau Bereich.


    Kann mir jemand sagen ob folgendes möglich ist. ( Fernsteuerung ist eine Graupner MZ 24 Hott )


    Ich würde gerne ein Touch-Display mit einem Arduino verwenden der nur Musik-Videos abspielen soll. Nach dem Start des Arduinos sollte die Oberfläche nur die Auswahl der Videos anzeigen. Die Datein der Videos können aus SD Karte oder USB-Stick sein.


    Da ich mehrere kleiner Lautsprecher verbauen möchte müsste noch ein kleiner Verstärker mit verbaut werden. Ich möchte die Lautstärke gerne über die Fernbedienung regeln können über Drehpoti.


    Kann man dann noch zusätzlich ein paar Servos steuern über den Arduino und hier die Servowege und Geschwindigkeiten einstellen und die Servos starten wenn einen Schalter oder Taster betätigt wird. Zum Beispiel eine Servo Bewegung von 180 Grad und Stopp und wenn man den Taster oder Schalter betätigt dann wieder zurück in die Grundstellung auf 0 Grad


    Das würde mich interessieren.


    Vielen Dank für eure Antworten im voraus.


    Ich möchte gleich dazu sagen das ich von Arduino überhaupt keine Ahnung habe.


    Gruß Stefan