Aufgrund der hohen Taktfrequenz von
bis zu 16 MHz und der RISC-Struktur, die
es ermöglicht, die meisten Befehle
innerhalb von einem Takt abzuarbeiten,
kann der sehr kostengünstige ATMEL-
Controller Aufgaben übernehmen, für
die man normalerweise auf teure pro-
grammierbare Logik zurückgreifen
muß. Das Programmieren solcher
Anwendungen lernt man am besten
durch leicht nachvollziehbare Pro-
grammbeispiele. In der letzten Aus-
gabe wurde als erstes Anwendungs-
beispiel ein einfacher Signalmusterge-
nerator programmiert. Von einem
solchen einfachen Patterngenerator ist
es nicht mehr weit zu Frequenzteilern.
Bei höheren Teilverhältnissen baut man
einfach “Warteschleifen” ein. Um aus 12
MHz die bekannte Bitrate von 19200
Impulsen/Sekunde zu erzeugen, muß
man durch 625 teilen. Ein mit einem
Mikrocontroller realisierter Teiler hat den
großen Vorteil, daß man oft flexibler ist
als beim klassischen Design. Das in Bild
6 dargestellte Programm (XDIV625.ASM)
teilt beispielsweise nicht nur durch 625,
sondern erzeugt auch noch nicht-über-
lappende Impulse wie in Bild 7 darge-
stellt. Durch Variation der Parameter n1
und n2 kann man das Teilverhältnis und
das Tastverhältnis an den Ausgängen
noch in weiten Grenzen einstellen.
Krumme Frequenzen:
Der NCO
Mit einem Frequenzteiler kann man, wie
der Name schon sagt, die Frequenz
immer nur teilen. Wie ist es aber nun,
wenn man aus einer Frequenz von 12
MHz eine Frequenz von 77,5 kHz erzeu-
gen will? Dabei sei es erlaubt, daß die
Frequenz von 77,5 kHz nicht ganz
genau stimmt, sie z.B. eine Abweichung
von 0.005 Hz hat (das entspricht einem
Fehler von viel weniger als 1 ppm!).
Nun, in der modernen Synthesizer-Tech-
nik bedient man sich dazu sogenann-
ter DDS-Oszillatoren (siehe Bild 8). Der
DDS-Oszillator besteht aus dem eigent-
lichen numerisch gesteuerten Oszillator
(numeric controlled oscillator NCO),
einer Sinustabelle und einem D/A-
Wandler. Der NCO selbst ist, wie in Bild
8 zu sehen, eigentlich aus einem
X-2 - 11/98 Elektor
EXTRA
———————————————————— PC-P
LUS
In der Oktober-Ausgabe wurde bereits ein kleines Experimentierboard
für den 8-bit-RISC-Prozessor AT90S1200 von ATMEL zusammen mit der
nötigen Anwendungsinformation vorgestellt.
Im zweiten und letzten Teil des Artikels geht es weiter mit
Programmbeispielen, wie Frequenzteiler, numerisch gesteuertem
Oszillator (NCO), Zeitmessung und Frequenzmessung.
Von Dr.-Ing. Mar tin Ohsmann
Geschwindigkeit ist
keine Hexerei
Experimente mit dem
ATMEL-AVR RISC Prozessor (2)
Addierer hoher Bitbreite (oft 32 Bit) auf-
gebaut. Diesen Teil können wir auf
unserem Controller gut nachbilden,
und zwar mit Hilfe des Programms in
Bild 9. Ein Zyklus des DDS Oszillators
dauert 8 Taktzyklen des Controllers. Bei
einer Taktfrequenz von 12 MHz ist die
Taktfrequenz des NCOs also 12/8=1,5
MHz. Die Bitlänge unseres NCOs ist 29.
Um die Frequenz f=77500 Hz zu erzeu-
gen, müssen wir als zu addierende Kon-
stante dann wählen:
Genau das macht unser Programm.
Und schon erscheinen 77,5 kHz an Port
B, Bit 4 = Pin 16. Der Fehler ist dabei
kleiner als 1,5 MHz/2
29
= 0,00279.. Hz
- was ganz beachtlich ist. Mit einem
kleinen D/A Wandler nach Bild 10 kann
man übrigens mit unserem NCO auch
Sägezähne generieren.
So kann man nun also mit unserem
Mikrocontroller für wenige DM Frequen-
zen bis 100 kHz auf 0,003 Hz genau
erzeugen. Eine Version des obigen Pro-
gramms, bei welchem die Frequenz via
RS232 wieder vom PC eingestellt wer-
den kann, findet sich in der Programm-
sammlung auf Diskette (NCO2.ASM).
Die Anwendungen eines solchen NCO
sind vielfältig, z.B. beim Bau von PLLs,
wo man solche “gebrochene Teiler”
verwendet, um das nachzuregelnde
Signal auf das Referenzsignal zu teilen
(siehe Bild 11 a) oder wo man einen
NCO selbst als sehr fein einstellbare
Referenz benutzt (Bild 11b).
Zeitmessung
Die nächste Anwendung ist die Mes-
sung der High-Zeit eines Signales. Dazu
warten wir in einer Programmschleife
(Label waitL) bis das Signal LOW ist.
Dann warten wir (Label waitH) bis es
HIGH wird. Wenn es HIGH wird, gehen
wir in eine Zählschleife (Label m1),
innerhalb derer wir zählen, wie oft wir
sie durchlaufen haben und abfragen,
ob das Signal noch HIGH ist. Wird es
wieder LOW, so wird die Schleife been-
det und das Resultat ausgegeben
(siehe Listing in Bild 12).
Die innere Zählschleife besteht aus 6
Zyklen, dauert also bei 12MHz Taktfre-
quenz 0,5
µs. Damit könnnen wir Zeiten
auf 0,5
µs genau messen. Der Schleifen-
zähler ist 3*8=24 bit breit, er kann also bis
2
24
= 1677726 zählen. 2
24
mal 0,5
µs
sind 8 Sekunden. Unser kurzes Programm
kann also Zeiten von 1
µs bis 8 Sekunden
auf 0,5
µs genau messen. Wer längere
Zeiten messen will, erhöht einfach die
Wortbreite des Zählers. Dann sinkt die
Genauigkeit etwas, weil ein Schleifen-
durchlauf länger dauert, was bei länge-
ren Meßzeiten aber oft keine Rolle spielt.
Das auf der Diskette befindliche Pro-
gramm XTMES1.ASM enthält zusätzlich zu
der eigentlichen Meßschleife aus Bild 12
noch eine Ausgabe via RS232 in norma-
ler dezimaler Form, so daß dieser Präzisi-
onszeitmesser mit serieller Ausgabe mit
einem einzigen IC realisiert werden kann.
Eine vollständige Schaltung dazu zeigt
Bild 13. Dank der eingebauten Logik
braucht der AT90S1200 noch nicht ein-
mal eine Beschaltung zur RESET-Signaler-
zeugung. Viel einfacher kann man so
einen Zeitmesser wirklich nicht aufbauen.
Und wenn man ihn nicht mehr braucht,
recycelt man die Schaltung gleich als
Frequenzmesser - wie im nächsten Absatz
zu lesen...
Frequenzmessung
Der AT90S1200 verfügt über einen inter-
nen 8-bit-Zähler, der durch passende
Programmierung von PORTD.4 (Pin 8)
aus getaktet werden darf. Der Takt wird
mit dem Prozessortakt abgetastet, wes-
halb maximal mit der halben Quarzfre-
quenz gezählt werden kann, also
immerhin mit mehr als 5 MHz. Auf der
Diskette befindet sich ein Programm
(XFMES1.ASM), das diesen Zähler
benutzt, um einen Frequenzmesser zu
PC-P
LUS
———————————————————
Elektor
EXTRA
X-3 - 11/98
Bild 6. Programm für den Teiler durch 625.
Bild 7. Nicht überlappende Impulse, wie sie von dem in Bild 6 angegebenen Programm
ebenfalls erzeugt werden.
Listing Bild 6
.equ
n1 =2
.equ
n2 =203
ldi
r16,$ff
; set output B to totem-pole
out
DDRB,r16
LOOP:
cbi
PORTB,0
; [2]
first bit0 goes LOW
sbi
PORTB,1
; [2]
then bit1 gopes HIGH
ldi
r16,n1
; [1]
now wait a little
wt1:
dec
r16
brne
wt1
; [3*n1-1]
cbi
PORTB,1
; [2]
bit1 goes LOW
sbi
PORTB,0
; [2]
bit0 goes HIGH
ldi
r16,n2
; [1]
again wait a little
wt2:
dec
r16
brne
wt2
; [3*n2-1]
rjmp
LOOP
; [2]
total: 10+3*(n1+n2)
77500
2
1 5
554766627738330
1 740
29
Hz
MHz
A
DA Hex
×
=
=
,
980082-14
625 Zyklen
CLK
B0
B1
realisiseren. Dazu wird eine Schleife ver-
wendet, deren Durchlauf genau 12 Mil-
lionen Zyklen, also 1 Sekunde dauert.
Währen dieser Zeit läuft der interne
Zähler, und immer wenn er überläuft,
wird ein Software-16-bit-Zähler erhöht,
X-4 - 11/98 Elektor
EXTRA
———————————————————— PC-P
LUS
32 bit
Summand
32 bit
Register
phase
D
A
D
A
D
A
SINUS
COSINUS
TABELLE
N
MSB
NLO
CLK
980082-15
Bild 8. So einfach sieht ein NCO aus - zumindest im Blockschaltbild.
Bild 9. Ebenso einfach ist das Programm für die NCO-Funktion.
Listing Bild 9
.def
d0
=r16
.def
d1
=r17
.def
d2
=r18
.def
d3
=r19
.def
nco0
=r25
.def
nco1
=r26
.def nco2
=r27
.def
nco3
=r28
RESET: ldi
r16,$ff
; set output to totem-pole
out
DDRB,r16
ldi
d0,$DA
; 01A740DA gives 77.5 kHz at
; 12 MHz XTAL
ldi
d1,$40
ldi
d2,$A7
ldi
d3,$01
LOOP:
add
nco0,d0
; 29 bit nco summation
adc
nco1,d1
adc
nco2,d2
adc
nco3,d3
andi
nco3,$01F
; [1] 5 MSB bits go out
out
PORTB,nco3
; [1]
rjmp
LOOP
; [2] in total 8 cycles
20k
20k
10k
20k
10k
20k
10k
20k
10k
20k
B0
B1
B2
B3
B4
DAC
980082-16
Bild 10. Diese Beschaltung des Controllers
ergibt einen diskret aufgebauten
D/A-Wandler.
Assemblieren und
Programmieren
Der Assembler wird wie folgt gestartet:
a <Dateiname>
Für das Programmieren wird p zusam-
men mit einem zweiten Buchstaben ein-
gegeben, nämlich:
z
für Löschen
p
für Programmieren
v
für Verifizieren
Das gleiche gilt für das EEPROM (falls ver-
wendet).
Die Batchfiles sind:
a.bat (Assemblieren)
p.bat (Programmieren)
Letzterer muß angepaßt werden, wenn
anstelle von COM2 (Standard-
Einstellung) ein anderer COM-Port ver-
wendet werden soll.
Auch bei den Pascal-Programmen kann
anstelle von COM2 ein anderer Port wie
folgt gewählt werden:
progname -COMx
Beim Programm V24COM.EXE ist die
Baudrate standardmäßig auf 9600 Bd
eingestellt.
so daß nach der Sekunde ein 16+8 =
24 bit breites Resultat zur Verfügung
steht. Das Resultat wird anschließend
dezimal über die serielle Schnittstelle
ausgegeben. So erhalten wir mit der
Schaltung in Bild 13 auch einen einfa-
PC-P
LUS
———————————————————
Elektor
EXTRA
X-5 - 11/98
chen Frequenzzähler mit 1 Hz Auflösung
im Bereich bis 5 MHz, der über eine seri-
elle Ausgabe verfügt.
Ausblick
Natürlich kann man mit dem AT90S1200
noch viel mehr machen, insbesondere
mit den Interruptmöglichkeiten und
dem eingebauten EEPROM, was aber
über den Rahmen dieses Beitrags hin-
ausgeht. Mit dem AT90S8515 gibt es
von Atmel außerdem einen großen Bru-
der des 90S1200, der allerdings entge-
gen der ursprünglichen Ankündigung
nicht bis 20 MHz, sondern nur bis 8 MHz
Taktfrequenz geht. Er hat zusätzlich 256
Bytes statisches RAM on chip und ver-
fügt über 8 k Programmspeicher und
512 Bytes EEPROM sowie einen UART.
Mal sehen, was man mit diesem Pro-
zessor so alles machen kann...
980082-2
10MHz
VCXO
10MHz
77,5kHz
NCO
Phasen
Komparator
77,5kHz
Referenz
(DCF 77)
10MHz
out
PLL-
FILTER
VCO
/ n
Phasen
Komparator
n • Ref.
NCO
980082-17
Ref
Bild 11. Anwendung von NCOs in PLL-Schaltungen als Teiler (Bild 11a) und als Referenz (Bild 11b).
Bild 12. Listing der Zeitmessung.
Listing Bild 12
measure:
clr
sum0
clr
sum1
clr
sum2
waitL: sbic
PIND,4
; wait until we are in a LOW
; state
rjmp
waitL
waitH: sbis
PIND,4
; wait until line goes high
rjmp
waitH
m1:
add
sum0,one
; [1] one loop= 6 cycles
adc
sum1,zero
; count 24 bits wide
adc
sum2,zero
sbic
PIND,4
; [1/2]
rjmp
m1
; [2] jump back if line still
; HIGH
; end of time measurement
1
TO
0
20
10
PD0
2
X2
4
X1
5
100n
5V
12MHz
22p
22p
1k
5k6
f
T
in
in
To PC
980082-18
1
2
3
4
5
6
7
8
9
Bild 13. Vollständige Schaltung eines
Präzisionszeitmessers (oder Frequenzzählers)
mit serieller Ausgabe. Bei dem IC handelt
es sich natürlich um den AT90S1200.