Software des Sinus-Oszillators
Beim Testen der alten Version stellte ich fest, dass auf dem NF-Ausgang ein Gleichspannungsanteil lag; entweder hatte ich damals etwas falsch gemacht oder die zwischenzeitlich aktualisierte BASCOM-Freeware verhält sich nun anders. Ich musste den Befehl "Config Timer0" am Ende auf "Pwm Clear Up" ändern. Der aktualisierte Quelltext mit Kommentaren:
' 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,