Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
sound [2019/01/29 17:04]
huwi [Videozusammenfassung]
sound [2019/07/27 16:47]
huwi
Zeile 2: Zeile 2:
 Neben visuellen Informationen an den Benutzer sind akustische Signale in eingebetteten Systemen wichtige Mittel in der Gestaltung von Mensch-Maschine-Schnittstellen. Das Generieren von einfachen Tönen ist noch vergleichsweise trivial aber Tonfolgen und Melodien erfordern dagegen eine recht aufwendige Programmierung. Neben der Tonfrequenz ist auch die Tondauer zu realisieren und das möglichst ohne gleich zwei Timer für den Tongenerator zu blockieren. Die Klasse //Sound// bietet dem Anwendungsentwickler die Möglichkeit einfache Töne, Tonfolgen und Melodien zu erzeugen. Im Folgenden die UML-Darstellung der Klasse Sound: Neben visuellen Informationen an den Benutzer sind akustische Signale in eingebetteten Systemen wichtige Mittel in der Gestaltung von Mensch-Maschine-Schnittstellen. Das Generieren von einfachen Tönen ist noch vergleichsweise trivial aber Tonfolgen und Melodien erfordern dagegen eine recht aufwendige Programmierung. Neben der Tonfrequenz ist auch die Tondauer zu realisieren und das möglichst ohne gleich zwei Timer für den Tongenerator zu blockieren. Die Klasse //Sound// bietet dem Anwendungsentwickler die Möglichkeit einfache Töne, Tonfolgen und Melodien zu erzeugen. Im Folgenden die UML-Darstellung der Klasse Sound:
  
->>>>>>>>>>>​>​{{:​sound.jpg?​480|}}+>​{{:​sound.jpg?​480|}}
  
 Auffällig ist, dass die Soundklasse als abstrakt gekennzeichnet ist. Da die von einem Timer generierte Tonfrequenz an einem PWM-Kanal ausgegeben wird, sind die Möglichkeiten,​ wo ein Speaker angeschlossen werden kann, begrenzt. Für den beim ATmega8 verwendeten Timer1 sind das die zwei PWM-Kanäle OC1A an Port B.1 und OC1B an Port B.2. Diese beiden verfügbaren Kanäle können als vollständig vorgefertigt und konfigurierte Klassen verwendet werden. Damit ist es nicht mehr nötig, diese auf ein bestimmtes Pin zu konfigurieren. ​ Auffällig ist, dass die Soundklasse als abstrakt gekennzeichnet ist. Da die von einem Timer generierte Tonfrequenz an einem PWM-Kanal ausgegeben wird, sind die Möglichkeiten,​ wo ein Speaker angeschlossen werden kann, begrenzt. Für den beim ATmega8 verwendeten Timer1 sind das die zwei PWM-Kanäle OC1A an Port B.1 und OC1B an Port B.2. Diese beiden verfügbaren Kanäle können als vollständig vorgefertigt und konfigurierte Klassen verwendet werden. Damit ist es nicht mehr nötig, diese auf ein bestimmtes Pin zu konfigurieren. ​
  
->>>>>>>>>>>>​>​{{:​speaker0.jpg?​300|}}+>​{{:​speaker0.jpg?​300|}}
  
 ====== Play it again Sam, again and again ===== ====== Play it again Sam, again and again =====
  
 Die Klasse //Sound// basiert auf der Verarbeitung einfacher Melodieskripte. Sie belegt einen PWM-fähigen 16 bit Timer. In der Regel Timer1. Es darf immer nur eine Instanz der Finalklassen SoundChanelX angelegt werden. Die Töne, Tonfolgen und die Melodie werden vollständig asynchron abgespielt. Das bedeutet, dass mit dem Aufruf der Operation //​play(...)//​ dem Tongenerator nur das Tonskript als String übergeben wird und die Anwendung weiter arbeiten kann, während der Sound ausgegeben wird. Eine Ausnahme bildet die Operation //morse//. Diese arbeitet synchron, was heißt, die rufende Methode wartet, bis die Funktion vollständig abgearbeitet ist. Daraus folgt, dass //morse// nicht in Ereignishandlern (innerhalb eines Interrupt) aufgerufen werden darf, sondern immer nur aus //onWork// heraus. Die Klasse //Sound// basiert auf der Verarbeitung einfacher Melodieskripte. Sie belegt einen PWM-fähigen 16 bit Timer. In der Regel Timer1. Es darf immer nur eine Instanz der Finalklassen SoundChanelX angelegt werden. Die Töne, Tonfolgen und die Melodie werden vollständig asynchron abgespielt. Das bedeutet, dass mit dem Aufruf der Operation //​play(...)//​ dem Tongenerator nur das Tonskript als String übergeben wird und die Anwendung weiter arbeiten kann, während der Sound ausgegeben wird. Eine Ausnahme bildet die Operation //morse//. Diese arbeitet synchron, was heißt, die rufende Methode wartet, bis die Funktion vollständig abgearbeitet ist. Daraus folgt, dass //morse// nicht in Ereignishandlern (innerhalb eines Interrupt) aufgerufen werden darf, sondern immer nur aus //onWork// heraus.
 +
 ><​code>​ ><​code>​
 Beispiel: Beispiel:
Zeile 64: Zeile 65:
 Danach kann die Anwendung realisiert werden. Verbinden Sie zuvor den Speaker mit Port B Bit1 (OC1A, PWM-Chanel A). Danach kann die Anwendung realisiert werden. Verbinden Sie zuvor den Speaker mit Port B Bit1 (OC1A, PWM-Chanel A).
  
->>>>>>>>>>>>>>>>​>​{{:​speaker1.jpg?​300|}}+>​{{:​speaker1.jpg?​300|}}
  
 ><​code cpp> ><​code cpp>
Zeile 88: Zeile 89:
 </​code>​ </​code>​
  
->>>>>>>>>>>>>>>​>​{{:​speaker2.jpg?​300|}}+>​{{:​speaker2.jpg?​300|}}
  
 ====== Melodien generieren ====== ====== Melodien generieren ======
Zeile 158: Zeile 159:
 Übersetzen,​ übertragen und testen Sie das Programm... Und, Soundtrack erkannt? ​ Übersetzen,​ übertragen und testen Sie das Programm... Und, Soundtrack erkannt? ​
  
->>>>>>>>>>>>>​>​{{:​speaker3.jpg?​400|}}+>​{{:​speaker3.jpg?​400|}}
  
 ====== Videozusammenfassung ====== ====== Videozusammenfassung ======
 Und weil es so schön war hier das Ganze noch mal als Video. Und weil es so schön war hier das Ganze noch mal als Video.
  
->>><​html><​iframe width="​700"​ height="​550"​ src="​https://​www.youtube.com/​embed/​UBlfsEzkh_Y"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe></​html>​+><​html><​iframe width="​700"​ height="​550"​ src="​https://​www.youtube.com/​embed/​UBlfsEzkh_Y"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; encrypted-media;​ gyroscope; picture-in-picture"​ allowfullscreen></​iframe></​html>​ 
 ====== Nächstes Thema ====== ====== Nächstes Thema ======
 [[usart|die UART in myAVR C++ anwenden]] [[usart|die UART in myAVR C++ anwenden]]