|
Wir erzeugen ein Rechteckssignal wählbarer Frequenz
mit AVISE4.3
|
Tokencodes für AVISE4.1/4.3 und
für eine ältere Version AVISE2.4:
avioglos für AVISE2.4
TIMER1:
Alle Timer haben unterschiedliche Betriebsarten, von denen hier nur eine jeweils ausgewählt werden soll.
TIMER1 ist ein 2-Byte-Timer, d.h. es wird ein 2-Byte-Wort herauf oder herunter gezählt, bis eine Aktion gestartet wird. Hier soll er in der Betriebsart CTC (Clear Timer on Compare Match) betrieben werden, d.h. der jeweilige Zählerwert wird mit dem Inhalt des Output-Compare-Registers verglichen. Wenn der Zähler den 2-Byte-Wert im Output-Compare-Register erreicht, soll das Ausgangsbit von 0 auf 1 oder umgekehrt geändert werden. Die Zählfrequenz ist aus der Taktfrequenz des Prozessors durch einen Vorteiler abgeleitet. Dazu ist dem Timer Folgendes mitzuteilen:
1. ein Zählerwert teilerwort tw für das 2-Byte-Output-Compare-Register 4A, 4B (für TIMER1A) bzw. 48, 49 (für TIMER1B)
2. für das Register $ 4F ein Steuerwort, das u.a. die Wellenform und das Verhalten des OCR1A-Ausgangs bzw. OCR1B-Ausgangs bei Erreichen des festgelegten Zählerwerts tw steuern soll. Bei Timer1A wird dazu das Bit 6 gesetzt, bei Timer1B das Bit 4. (Dazu wird in TCCR1A die OC1A Leitung bzw. die OC1B Leitung auf Toggle bei Compare Match geschaltet)
3. ein Steuerwort für Register $ 4E. Es legt die Betriebsart fest und den Vorteiler und startet den Zähler.
Eine leichte Komplikation ergibt sich daraus, dass mit AVISE 2-Byte-Worte nicht in einem Schritt in ein 2-Byte-Register geschrieben werden können. Für sonstige Zwecke ist dafür das Wort WR vorgesehen. 2-Byte-Worte müssen deshalb zunächst in ein höher- und ein niederwertiges Byte zerlegt werden (z.B. mit dem Wort ZL), die dann einzeln mit WR oder WB in die zwei Zellen des 2-Byte-Registers geschrieben werden:
$ : ZL DUP FF AND SWAP 8 >> RET
180 ZL erzeugt dann den TOS 1 und darunter 80. Dann z.B. 4B WB 4A WB : der TOS 1 (höherwertiges Byte) wird in 4B geschrieben, das darunter liegende Stapelelement (niederwertiges Byte) in 4B.
Es eht auch so?
: ZL DUP 8 >> RET legt zuerst das unveränderte Wort, dann darüber das höherwertige Byte als TOS auf den Stapel. Wenn ein Register beschrieben wird, wird vom gesamten Wort nur das niederwertige Byte verwendet. Es muss dann erst das höherwertige Byte, dann das niederwertige Byte geschrieben werden.
TIMER1A/B: Steuerwort für $4E (für OCR1A, d.h. Port B1 bzw.
(1. Portangabe für ATMEGA8 / 168, 2. Angabe für ATMEGA32)
8 legt fest, dass bei Erreichen des Zählerwertes teilerwort tw
der Zähler Frequenzformel: f1 = (4 MHz/vorteiler) / (tw+1) bei 8 MHz Taktfrequenz |
vtnr |
letzte Bits von $4E |
Vorteiler |
ungefährer Frequenzbereich |
8+1 = 9(16) | 1 | 001 | 1 | 122 Hz - 4 000 kHz |
8+2 = A(16) | 2 | 010 | 8 | 15 Hz - 500 kHz |
8+3 = B(16) | 3 | 011 | 64 = 40(16) | 2 Hz - 62,5 kHz |
8+4 = C(16) | 4 | 100 | 256 = 100(16) | 0,5 Hz - 15,6 kHz |
8+5 = D(16) | 5 | 101 | 1024= 400(16) | 0,1 Hz - 3,9 kHz |
Zunächst wird also das Zählerregister mit dem Teilerwort tw beschrieben. Bevor der Timer mit dem Beschreiben des Steuerregisters (4E) gestartet wird, muss noch im Register TCCR1A (4F) das Bit 6 (OCR1A) bzw. Bit 4 (OCR1B) gesetzt werden um dem Prozessor zu sagen, auf welchem der beiden Kanäle das Rechteckssignal erscheinen soll. Mit dem folgenden Wort erzeugt der TIMER1 ein 40 kHz-Signal an OCR1A.
: 40KHZ1 D5 OL 0 4B Wb 64 4A Wb 40 4F Wb 9 4E Wb RET
OL schaltet den Port D5 erstmal auf Ausgang
Dann wird OCR1A mit 64(16) =100(10) beschrieben; hier ist die Frequenz variierbar. Dann wird in TCCR1A die OC1A Leitung auf Toggle bei Compare Match geschaltet. Zuletzt wird Timer 1 mit Prescaler = 1 und Toggle bei Compare Match gestartet.
Mehr Spielraum für Frequenzen erhält man mit folgenden Worten. Sie erwarten auf dem Stapel das teilerwort tw.
: FREQA B1 OL DUP FF AND SWAP 8 >> 4B WB 4A WB 4F RB 40 OR 4F WB 9 4E WB RET
Eleganter:
: FREQA B1 OL DUP FF AND 4A WB 8 >> 4B WB 6 4F BSET 9 4E WB RET
: FREQB B2 OL DUP FF AND 4A WB 8 >> 4B WB 4 4F BSET 9 4E WB RET
$ 64 FREQA erzeugt dann wieder ein 40 kHz-Signal. 9 bestimmt u.a. den Vorteiler der Frequenz. Eingestellt ist der Vorteiler 1. Ersetzt man 9 durch A(16) = 10(10) , so setzt man den Vorteiler auf 8. Dann gilt die Frequenzformel: f 1 = 500 kHz / (tb+1), bei VT 256 (also 9 durch 12 ersetzt): f = 15625 Hz /(tb+1)
Noch allgemeiner und eleganter geht es so:
: FREQA B1 OL DUP 4A WB 8 >> 4B WB 6 4F BSET 8 + 4E WB RET
Die möglichen Vorteiler werden hier gemäß der Tabelle einfach durchnummeriert von 1 bis 5. Das ist die vtnr (Vorteilernummer). Dieses Wort wird so angewandt:
vtnr teilerwort FREQA
$ 1 64 FREQA erzeugt so das 40 kHz-Signal. Entsprechend bei FREQB.
TIMER2 ist ein 1-Byte-Timer, d.h. es wird ein Byte herauf oder herunter gezählt, bis eine Aktion gestartet wird. Die Zählfrequenz ist aus der Taktfrequenz des Prozessors durch einen Vorteiler abgeleitet. Hier wird er im CTC-Mode betrieben (Clear Timer on Compare Match) Dazu ist dem Timer Folgendes mitzuteilen:
1. einen Zählerwert teilerbyte tb für das 1-Byte-Register 43, mit dem der Teiler stoppen soll, das sog. Output-Compare-Register
2. ein Steuerwort für Register $45. Es legt die Betriebsart fest und den Vorteiler und startet den Timer.
TIMER2: Steuerwort für $45 (OCR2-Port B3 bzw. D7):
16 legt fest, dass bei Erreichen des Zählerwertes teilerbyte tb der
jeweilige Frequenzformel: f2 = (4 MHz/ Vorteiler) / (tb+1) bei 8 MHz Taktfrequenz |
vtnr | niedrigste Bits von $45 (legen im Register TCCR2 den Vorteiler fest) (davor jeweils bit3 und bit4 = 1) |
Vorteiler |
theoretischer Frequenzbereich |
16+8+1 = 19(16) | 1 | 001 | 1 | 15,6 kHz - 4000 kHz |
16+8+2 = 1A(16) | 2 | 010 | 8 | 1,95 kHz - 500 kHz |
16+8+3 = 1B(16) | 3 | 011 | 32 =20(16) | 489 Hz - 125 kHz |
16+8+4 = 1C(16) | 4 | 100 | 64 = 40(16) | 244 Hz - 62,5 kHz |
16+8+5 = 1D(16) | 5 | 101 | 128 = 80(16) | 122 Hz 31,25 kHz |
16+8+5 = 1E(16) | 6 | 110 | 256 = 100(16) | 61 Hz - 15,6 kHz |
16+8+5 = 1F(16) | 7 | 111 | 1024 = 400(16) | 15 Hz - 3,9 kHz |
Auch mit TIMER2 lässt sich leicht ein 40 kHz-Signal erzeugen:
: 40KHZ2 D7 OL 64 43 WB 19 45 WB RET
Frequenzvarianten können durch Variation des hexadezimalen Wertes 64(16) = 100(10) erprobt werden. Ersetzt man 19(16) , kann man andere Vorteiler einstellen.
: FREQ2 D7 OL 43 WB 19 45 WB RET
Dieses Wort erwartet den Teiler auf dem Stack. 64 FREQ2 ( 64(16) = 100 !) gibt über D7 ein 40 kHz-Signal aus. Mit 6A FREQ2 erhalten Sie ein 38 kHz-Signal für den Infrarot-Entfernungssensor.
Noch allgemeiner geht es so:
: FREQ2 D7 OL 43 WB 18 + 45 WB RET
Die möglichen Vorteiler werden hier gemäß der Tabelle oben einfach durchnummeriert von 1 bis 7. Das ist die vtnr (Vorteilernummer). Dieses Wort wird so angewandt:
vtnr teilerbyte FREQ2
1 64 FREQ2 liefert also wieder das 40 kHz-Signal.
Während sich beiden ersten Funktionen die CPU ohne Programmbelastung selber steuern, benötigt der für WAVE benötigte Interrupt bei der hohen Frequenz erhebliche CPU Zeit. Bei sehr kleinen Vorgaben von WAVELO und WAVE wird auch der UART-Interrupt nicht mehr bedient und das Teil hängt sich gnadenlos auf.
Pulsweitenmodulation wird hier beschrieben.
Schäden werden bei sachgemäßem Umgang nicht erwartet.
Dennoch wird keinerlei Haftung übernommen, z.B. bzgl. Gefährdung
der Prozessoren, der PCs und vor allem der mit dem System experimentierenden
Personen.
Ein Haftungsausschluss von Herrn Schemmert wird hier einkopiert:
|
.(zuletzt aktualisiert 2013)