Der FKG- Roboter

FORPHYS- Mess- Interfaces

Forschendes Lernen im Physik-UR

Würzburger Quanten- physik- Konzept

Grundfakten der Quanten- physik

Materialien Physik-UR

Physika- lische Analysen

Im- pres- sum

Kommen- tare und Wünsche

© Horst Hübel Würzburg 2005 - 2014

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.
D5 oder OCR1B, d.h. Port B2 bzw. D4)

(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
wieder mit 0 gestartet wird (CTC-Mode: Clear Timer on Compare Match)

Frequenzformel:    f1 = (4 MHz/vorteiler) / (tw+1) bei 8 MHz Taktfrequenz

vtnr

letzte Bits von $4E
(legen im Register TCCR1B
den Vorteiler fest)
(davor jeweils Bit 3 = 1 )

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: (Hexadezimalzahlen!)

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
Wert am Port OCR2 auf 0 bzw. 1 geändert wird, 8 legt den CTC-Mode fest

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.


Bei Timer 1 können Sie auch asymmetrische Wellenformen einstellen (Hexadezimalzahlen nach $):

$ 64 WAVEHI C8 WAVE 9 4E WR

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:

[Image] IMPORTANT SAFETY INFORMATION:

'Avise' is not specified for safety-critical, medical or any application else, which ever might cause danger for persons or animals or damage of things. The use of 'Avise' in such applications is strictly forbidden.

.(zuletzt aktualisiert 2013)