Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
f11:technik:arduino:programme:arduino-side-tone-generator [2018/12/27 08:29]
dm3kb
f11:technik:arduino:programme:arduino-side-tone-generator [2019/09/29 12:03] (aktuell)
Zeile 12: Zeile 12:
 Die allseits beliebte und bekannte Arduino Funktion [[https://www.arduino.cc/reference/de/language/functions/advanced-io/tone |tone()]] scheitert leider Die allseits beliebte und bekannte Arduino Funktion [[https://www.arduino.cc/reference/de/language/functions/advanced-io/tone |tone()]] scheitert leider
 mit der Ausgabe an den zweiten Pin.\\ mit der Ausgabe an den zweiten Pin.\\
-Da die Frequenz aber auch veränderbar sein sollte wenn der Ton ausgegeben wird und Ansätze mit delay bzw. der Abfrage von [[https://forum.arduino.cc/index.php?topic=503368.0| milis()]] unbefriedigend in der Ton-Qualität waren (Knacken)\\  +Da die Frequenz aber auch veränderbar sein sollte wenn der Ton ausgegeben wird und Ansätze mit delay bzw. der Abfrage von [[https://forum.arduino.cc/index.php?topic=503368.0| milis()]] unbefriedigend in der Ton-Qualität waren (Knacken) fand letzlich die Nutzung eines Interrupt-Handlers eines\\ 
-fand letzlich die Nutzung eines ARDUINO internen Timers der beim Überlauf einen Interrupt erzeugt Anwendung.\\+ARDUINO internen Timers der beim Überlauf eben jenen Interrupt erzeugt und die ensprechende Sub-Routine für die Interrupt Behandlung anspringt Anwendung.\\ 
 +Der Vorteil dabei ist das der Timer wesentlich genauer ist als die delay() Funktion die einfach nur wartet und den Arduino zum Nichtstun verdammt.\\ 
 +Der Timer wird vom Prozessor-Takt (16 Mhz) unabhängig vom Arduino Code hochgezählt. Beim Überlauf über 65536 wird der entsprechende Interrupt ausgelöst.\\ 
 +Der Arduino unterbricht nun seine main-loop und behandelt erst mal den Code in der Interrupt-Handler Routine um danach an der Stelle in der Main-Loop\\ 
 +fortzufahren an der der Interrupt zugeschlagen hat.\\ 
 +Details dazu z.B.: \\ 
 +https://www.instructables.com/id/Arduino-Timer-Interrupts/ \\ 
 +und \\ 
 +https://www.robotshop.com/community/forum/t/arduino-101-timers-and-interrupts/13072 \\ 
 +\\ 
 +Auf ein Beispiel aus dem Leben übertragen ist es so als wenn jemand den ganzen Tag am Fenster sitzt und auf den Post-Boten wartet.\\ 
 +Alternativ kommt er jede Minute oder alle zwei zurück ans Fenster um zu schauen ob der Post-Bote da ist.\\ 
 +Das ist nicht wirklich effektiv.\\ 
 +Wie elegant ist es doch seine Aufgaben zu erledigen, und sich von der Türklingel (Dem Interrupt) dazu rufen zu lassen das Nötige mit dem Post-Boten zu regeln.\\ 
 +\\
 Der Sketch unten ist dokumentiert und wird auf einem ARDUINO Nano genutzt.\\ Der Sketch unten ist dokumentiert und wird auf einem ARDUINO Nano genutzt.\\
-Andere Vertreter aus der ARDUINO Familie sind sicher auch möglich, der Code ist dann eventuell enstprechend anzupassen.\\ +Andere Vertreter aus der ARDUINO Familie sind sicher auch möglich, der Code ist dann aber eventuell enstprechend anzupassen.\\ 
  \\  \\
  
Zeile 72: Zeile 86:
 } }
  
-// Interrupt -andler for +// Interrupt -Handler for 
 // Timer1 Overflow // Timer1 Overflow
 ISR(TIMER1_OVF_vect)         ISR(TIMER1_OVF_vect)        
Zeile 102: Zeile 116:
     while(digitalRead(keyin)== LOW){     while(digitalRead(keyin)== LOW){
       // As long key in is LOW (Key is pressed so we need an output!!!)        // As long key in is LOW (Key is pressed so we need an output!!!) 
-      // Enable Interrupt 
            
       if (timerstat == 0 ) {       if (timerstat == 0 ) {
-        //Serial.print(" = : Enable Interupt Play\n");+        //Serial.print(" = : Enable Interrupt Play\n");
         playflag = 1;         playflag = 1;
         timerstat = 1;         timerstat = 1;
Zeile 119: Zeile 132:
       // So Timer1 will count starting from 39168 or 55625 or any value in between and creating an        // So Timer1 will count starting from 39168 or 55625 or any value in between and creating an 
       // Overflow Interrupt when reaching 65536       // Overflow Interrupt when reaching 65536
-      // needs to be set to time that a halve wave of the frequency need.+      // It needs to be set to time that a halve wave of the frequency need.
       // Formula is here: 65536 - (65536 - 16000000 / 1 / 350 / 2)       // Formula is here: 65536 - (65536 - 16000000 / 1 / 350 / 2)
       //                  Max Value of Timer  - ( Max Value of Timer / Arduino Clock Rate / PreScale / Frequency in Hz / 2 )       //                  Max Value of Timer  - ( Max Value of Timer / Arduino Clock Rate / PreScale / Frequency in Hz / 2 )
Zeile 152: Zeile 165:
 // End // End
 </code> </code>
 +
 +Zurück zu: [[f11:technik:arduino:start#Programme|F11:Arduino:Programme]]
f11/technik/arduino/programme/arduino-side-tone-generator.1545895793.txt.gz · Zuletzt geändert: 2019/09/29 12:01 (Externe Bearbeitung)
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0