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:15]
dm3kb
f11:technik:arduino:programme:arduino-side-tone-generator [2019/09/29 12:03] (aktuell)
Zeile 2: Zeile 2:
  
 Für das reglmässige Gebe-Training mit der Hand-Taste ist für die Nutzung von PWC-Fistcheck \\ Für das reglmässige Gebe-Training mit der Hand-Taste ist für die Nutzung von PWC-Fistcheck \\
-(Ernst F. Schroeder DJ7HS https://www.qsl.net/dj7hs/download.htm) ein Side-Tone Generator mit regelbarer Frequenz \\+(Ernst F. Schroeder DJ7HS https://www.qsl.net/dj7hs/download.htm) ein Side-Tone Generator auf ARDUINO Basis mit regelbarer Frequenz \\
 und zwei Ausgängen deren Pegel unabhängig von einander regelbar ist enstanden.\\ und zwei Ausgängen deren Pegel unabhängig von einander regelbar ist enstanden.\\
 \\ \\
Zeile 10: Zeile 10:
 \\ \\
 Da hier der Einfachheit halber für jeden Ausgang ein eigender ARDUINO Pin genutzt wurde ist der Sketch etwas komplexer ausgefallen.\\ Da hier der Einfachheit halber für jeden Ausgang ein eigender ARDUINO Pin genutzt wurde ist der Sketch etwas komplexer ausgefallen.\\
-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 \\ +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\\ 
-in der Ton-Qualität waren (Knacken) fand letzlich die Nutzung eines ARDUINO internen Timers der beim Überlauf einen Interrupt\\ +ARDUINO internen Timers der beim Überlauf eben jenen Interrupt erzeugt und die ensprechende Sub-Routine für die Interrupt Behandlung anspringt Anwendung.\\ 
-erzeugt 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 Sketch unten ist dokumentiert und wird auf einen ARDUINO Nano genutzt.\\ +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.\\ 
-Andere Vertreter aus der ARDUINO Familie sind sicher auch möglich, der Code ist dann enstprechend anzupassen.\\ +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.\\ 
 +Andere Vertreter aus der ARDUINO Familie sind sicher auch möglich, der Code ist dann aber eventuell enstprechend anzupassen.\\ 
  \\  \\
  
Zeile 73: Zeile 86:
 } }
  
-// Interrupt -andler for +// Interrupt -Handler for 
 // Timer1 Overflow // Timer1 Overflow
 ISR(TIMER1_OVF_vect)         ISR(TIMER1_OVF_vect)        
Zeile 103: 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 120: 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 153: 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.1545894901.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