Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| 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 | + | Für das reglmässige Gebe-Training mit der Hand-Taste ist für die Nutzung |
| - | (Ernst F. Schroeder DJ7HS https:// | + | (Ernst F. Schroeder DJ7HS https:// |
| + | und zwei Ausgängen | ||
| + | \\ | ||
| + | Schaltbild: | ||
| {{f11: | {{f11: | ||
| + | \\ | ||
| + | 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:// | ||
| + | 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:// | ||
| + | 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:// | ||
| + | und \\ | ||
| + | https:// | ||
| + | \\ | ||
| + | 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 61: | Zeile 86: | ||
| } | } | ||
| - | // Interrupt -andler | + | // Interrupt -Handler |
| // 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 ) { | ||
| - | // | + | // |
| 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 | ||
| - | // I 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 | ||
| </ | </ | ||
| + | |||
| + | Zurück zu: [[f11: | ||
