Geschwindigkeit ist keine Hexerei Teil2

background image

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)

background image

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

background image

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.

background image

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.


Wyszukiwarka

Podobne podstrony:
Geschwindigkeit ist keine Hexerei Experimente mit dem ATMEL AVR RISC Prozessor
Wywlaszczenie, Administracja UKSW Ist, Administracja UKSW IIst, gospod.nier
umowy cywilnoprawne 25.04.08, Administracja UKSW Ist, umowy cywilnoprawne w administracji
II eko stacj Ist
Dziennik Ustaw Nr 6 poz. 27 ustawa o gospodarce finansowej przedsiebiorstw panstwowych, Administracj
Prawo Unii Europejskiej dla administracji 22 pazdziernika 2010r, Administracja UKSW Ist, Prawo UE d
Uczeń zdolny różni się od innych dzieci, Ir Ist. Pedagogika Resocjalizacja
IIa, IIr Ist. Pedagogika resocjalizacja, pedagogika resocjalizacja ćw
konspekt 5, Administracja UKSW Ist, Legislacja administracyjna
umowy cywilnoprawne 04.04.08, Administracja UKSW Ist, umowy cywilnoprawne w administracji
Wlasnosc lokali, Administracja UKSW Ist, Administracja UKSW IIst, gospod.nier
konspekt 6, Administracja UKSW Ist, Legislacja administracyjna
514 Geschwisterzwist
Was ist ein Text
cele i ist wsp m i ś przedsiębiorczości
Psychologia Ogólna - skrypt dla studentów, UWM, oligorfenopedagogika, Rok I, Semestr I, Psychologia

więcej podobnych podstron