Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
f11:technik:arduino:programme:arduino-side-tone-generator [2018/12/27 07:53]
dm3kb angelegt
f11:technik:arduino:programme:arduino-side-tone-generator [2019/09/29 12:03] (aktuell)
Zeile 1: Zeile 1:
 ====== Side-Tone Generator für PCW Fistcheck ====== ====== Side-Tone Generator für PCW Fistcheck ======
  
-Für das reglmässige Gebe-Training mit der Hand-Taste ist für die Nutzung mit 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 zwei Ausgängen enstanden.+(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.\\ 
 +\\ 
 +Schaltbild:\\
  
 {{f11:technik:arduino:programme:arduinosidetonegenerator.png}} {{f11:technik:arduino:programme:arduinosidetonegenerator.png}}
 +\\ 
 +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 
 +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) fand letzlich die Nutzung eines Interrupt-Handlers eines\\ 
 +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.\\ 
 +Andere Vertreter aus der ARDUINO Familie sind sicher auch möglich, der Code ist dann aber eventuell enstprechend anzupassen.\\  
 + \\
  
 <code> <code>
Zeile 61: Zeile 86:
 } }
  
-// Interrupt -andler for +// Interrupt -Handler for 
 // Timer1 Overflow // Timer1 Overflow
 ISR(TIMER1_OVF_vect)         ISR(TIMER1_OVF_vect)        
Zeile 91: 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 108: 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 141: 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.1545893625.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