' Sinusoszillator ' ' Sprache: Bascom-AVR-Basic Version 2.0.7.9 Demo/Freeware ' Erzeugung per PWM- Oszillator; sein Puls-Pausenverhaeltnis wird mit den 128 Werten einer approximierten ' Sinusfunktion geladen, so dass sich eine Treppe in Sinusform ergibt. ' Da die PWM- Taktfrequenz ueber 18 kHz betragen muss, damit man sie nicht hoert, muss der AtTiny 13 mit 9,6 MHz ' Takt betrieben werden. ' Der Attiny 13 kann jedoch auf 1,2 MHz geflasht bleiben (Auslieferungszustand), die Taktumschaltung auf 9,6 ' MHz erfolgt ueber das CLKPR- Register zur Laufzeit des Programms ' Der Sinus liegt an OC0A, also PB0 ' Der Generator wird mit einem Low an PB3 aktiviert (es wird also gegen Masse getastet) ' ' zur Unterdrueckung des Einschaltknacksens schwillt die Huellkurve des Sinus nach einer Quadrat-Funktion ' (Befehl "Shift M, Right Z") an bzw. ab. Nebenbei sorgt sie auch fuer das Enprellen des Tasteingangs (PB3) ' ' Die NF-Ausgangsfrequenz kann ueber Taster an PB2 und PB4 in groben Stufen veraendert werden. ' PB2 und PB4 werden nur in den Tastpausen abgefragt, um die Tonerzeugung nicht "auszubremsen" ' Wegen der Eindeutigkeit wird die Frequenz in jeder Tastpause nur um eine Stufe erhoeht bzw. vermindert. ' $Regfile = "attiny13.dat" $Crystal = 9600000 $Hwstack = 32 $Swstack = 8 $Framesize = 8 Dim A As Word ' fuer Verzoegerungsschleife, die zu niedrigerer Frequenz fuehrt Dim B As Byte ' speichert letzten Wert von A Dim N As Byte ' fuer die Zaehlschleife Dim M As Byte ' fuer PWM-Wert Dim Z As Byte ' fuer Huellkurve Clkpr = 128 ' Aenderung Taktrate vorbereiten Clkpr = 0 ' 9,6 MHz Clkpr = 0 ' Wert bestaetigen Acsr.7 = 1 ' Analog-Komparator ausschalten, spart etwas Strom Ddrb = &B0000_0001 ' alle Pins bis auf PB0 Eingang Portb = &B0001_1110 ' alle Pins bis auf PB0 Pullup-Widerstand Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up
Start Timer0
Tccr0a.0 = 1 ' wgm00 Tccr0a.1 = 1 ' wgm01 Tccr0b.3 = 0 ' wgm02 Z = 6 ' PWM-Signal ist stets Null B = 3 ' mittlere Tonhoehe Do If Pinb.3 = 0 Then ' Abfrage, ob Signal an PB3 low ist Gosub Sinus
If Z > 0 Then Decr Z ' Z startet mit 6 und wird nach jeder Sinsuwelle bis 0 vermindert End If ' bewirkt Anschwellen der Sinuskurve Else A = B ' in B ist der letzte Wert von A gespeichert If Z < 6 Then Gosub Sinus
Incr Z ' Z startet mit 0 und wird nach jeder Sinsuwelle bis 6 erhoeht End If ' bewirkt Abschwellen der Sinuskurve If Pinb.4 = 0 Then ' Taster zur Verminderung der Frequenz If A = B Then ' Frequenz nur ein mal pro Tastpause vermindern Incr A
End If End If If Pinb.2 = 0 Then ' Taster zur Erhoehung der Frequenz If A = B Then ' Frequenz nur ein mal pro Tastpause erhoehen Decr A
End If End If If A = 0 Then ' unzulaessige Werte abfangen A = 1 End If If A > 6 Then ' unzulaessige Werte abfangen A = 6 End If End If Loop Sinus: Restore Sinusdata ' Zeiger auf Anfang der Data-Tabelle setzen For N = 1 To 128 Read M
Shift M , Right , Z ' bewirkt Ansteigen der Hüllkurve Pwm0a = M ' der Wert in PWM0A bestimmt das Puls- / Pausenverhältnis B = 0 Do ' Verzögerungsschleife, dauert um so länger, je groesser A ist Incr B
Loop Until B = A
Next N
Return Sinusdata: Data 0 , 0 , 0 , 1 , 2 , 3 , 5 , 7 , 9 , 12 , 14 , 17 , 21 , 24 , 28 , 32, Data 36 , 41 , 46 , 51 , 56 , 61 , 66 , 72 , 78 , 83 , 89 , 95 , 101 , 107 , 114 , 120, Data 127 , 133 , 139 , 145 , 151 , 157 , 163 , 169 , 175 , 181 , 186 , 192 , 197 , 202 , 207 , 212, Data 216 , 221 , 225 , 228 , 232 , 235 , 238 , 241 , 244 , 246 , 248 , 250 , 251 , 252 , 253 , 253, Data 253 , 253 , 253 , 252 , 251 , 250 , 248 , 246 , 244 , 241 , 239 , 236 , 232 , 229 , 225 , 221, Data 216 , 212 , 207 , 202 , 197 , 192 , 187 , 181 , 175 , 169 , 164 , 158 , 151 , 145 , 139 , 133, Data 127 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 67 , 61 , 56 , 51 , 46 , 41, Data 37 , 33 , 28 , 25 , 21 , 18 , 15 , 12 , 9 , 7 , 5 , 3 , 2 , 1 , 0 , 0,
' Morsekeyer ' Sprache: Bascom-AVR-Basic Version 2.0.7.9 Demo/Freeware ' ' Hardware: ' Tastkontakte fuer Punkt und Strich an PB3 und PB2 (Tastung gegen Masse). ' Schaltausgang ist PB1. Tastung invertiert, Aktiv = 0V, Ruhe = 5V ' Poti zur Geschwindigkeitseinstellung an PB4 $Regfile = "ATtiny13.dat" $Crystal = 1200000 ' Taktfrequenz: 1,2 MHz $Hwstack = 8 ' Platz fuer nur 4 Unterprogramme reserviert, spart SRAM $Swstack = 0 ' wird nicht gebraucht $Framesize = 0 ' dito Dim I As Byte ' wird in Zaehlschleife verwendet Dim M As Byte ' wird fuers Auslesen der Morsebits verwendet Dim L As Byte ' wird fuer niederwertigstes Bit von M verwendet Dim Dit As Word ' Laenge Punkt Dim Dah As Word ' Laenge Strich Dim Wort As Word ' Laenge Wortabstand Dim P As Byte ' Punktspeicher Ddrb = &B0000_0010 ' Pin PB1 als Ausgang konfigurieren (1), Rest ist Eingang (0) Portb = &B0000_1111 ' PB1 auf high, PullUp-Widerstaende fuer die Pins PB0, PB2 und PB3 aktivieren Config Adc = Single , Prescaler = Auto ' AD- Konverter konfigurieren und starten Start AdcWenn man die Software nicht selbst übersetzen will, kann man die beiden beigefügten HEX-Files direkt in die Mikrocontroller flashen; ein ISP-Programmer muß allerdings vorhanden sein. Die Taktrate der Mikrocontroller kann auf dem Auslieferungszustand verbleiben (1,2 MHz)
Do Start Adc
Gosub Adclesen
If Pinb.3 = 0 Then ' Punktkontakt gedrueckt Portb.1 = 0 ' Schaltausgang ein (invertierte Logik) Waitms Dit
Portb.1 = 1 ' Schaltausgang aus Waitms Dit
End If Mark: If Pinb.2 = 0 Then ' Strichkontakt gedrueckt Portb.1 = 0 Waitms Dah
If Pinb.3 = 0 Then ' Punktkontakt zusaetzlich gedrueckt P = 1 ' Squeeze- bzw. Punktspeicher End If Portb.1 = 1 Waitms Dit
If P = 1 Then Portb.1 = 0 Waitms Dit
Portb.1 = 1 Waitms Dit
P = 0 Goto Mark
End If End If Loop Adclesen: Dit = Getadc(2) Dit = Dit + 416 ' fuer sinnvollen Einstellbereich der Geschwindigkeit Shift Dit, Right , 4 ' entspricht Teilung durch 16, spart Flash-Speicher Dah = 3 * Dit
Wort = 8 * Dit
Return End