beginner_de
beginner_de
beginner_de
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Avr-Asm-Tutorial S. 59<br />
Die Taktfrequenz wird in diesem Fall von <strong>de</strong>n externen Komponenten bestimmt.<br />
• AVRs mit einem o<strong>de</strong>r mehreren internen Oszillatoren: diese haben eine voreingestellte Taktfrequenz,<br />
die im Kapitel "System Clock and Clock Options" bzw. im Unterkapitel "Default<br />
Clock Source" steht. Je<strong>de</strong>r AVR-Typ hat da so seine beson<strong>de</strong>re Vorliebe.<br />
• AVRs mit internen RC-Oszillatoren bieten ferner die Möglichkeit, diesen zu verstellen. Dazu<br />
wer<strong>de</strong>n Werte in <strong>de</strong>n Port OSCCAL geschrieben. Bei älteren AVR geschieht das durch<br />
<strong>de</strong>n Programmierer, bei mo<strong>de</strong>rneren schreibt ein automatischer Mechanismus <strong>de</strong>n OSC-<br />
CAL-Wert zu Beginn in <strong>de</strong>n Port. Auch die Automatik benötigt <strong>de</strong>n Han<strong>de</strong>ingriff, wenn höhere<br />
Genauigkeit gefor<strong>de</strong>rt ist und <strong>de</strong>r AVR abseits <strong>de</strong>r Spannung o<strong>de</strong>r Betriebstemperatur<br />
betrieben wird, für die er kalibriert ist (beim ATtiny13 z.B. 3 V und 25°C).<br />
• Im Kapitel "System Clock and Clock Options" wird auch erklärt, wie man durch Verstellen<br />
von Fuses<br />
• zwischen internen und externen Taktquellen auswählt,<br />
• einen internen Vorteiler zwischen Taktquelle und Prozessortakt schalten kann (Clock Prescaler,<br />
siehe unten),<br />
• eine Wartezeit beim Start <strong>de</strong>s Prozessors einfügt, bis <strong>de</strong>r Oszillator stabil schwingt ("Delay<br />
from Reset").<br />
Die Fuses wer<strong>de</strong>n mittels Programmiergerät eingestellt. Obacht! Beim Verstellen von Fuses,<br />
z.B. auf eine externe Taktquelle, muss diese auch angeschlossen sein. Sonst verabschie<strong>de</strong>t<br />
sich <strong>de</strong>r Prozessor absolut taktlos vom Programmiergerät und gibt diesem keine sinnvollen<br />
Antworten mehr.<br />
• Um das Publikum zu verwirren, haben einige AVR noch einen Vorteiler für <strong>de</strong>n Prozessortakt<br />
(Clock Prescaler). Dieser lässt sich entwe<strong>de</strong>r per Fuse (siehe oben) auf 1 o<strong>de</strong>r 8 einstellen,<br />
bei manchen AVR aber auch per Software auf Teilerwerte von 1, 2, 4, 8, bis 256 einstellen<br />
(Port CLKPR).<br />
Haben Sie aus all <strong>de</strong>m Durcheinan<strong>de</strong>r jetzt herausgefun<strong>de</strong>n, mit wieviel MHz <strong>de</strong>r AVR nun eigentlich<br />
läuft (fc), dann ergibt sich die Dauer eines Prozessortakts (tc) zu: tc [µs] = 1 / fc [MHz] Bei 1,2<br />
MHz Takt (ATtiny13, interner RC-Oszillator mit 9,6 MHz, CLKPR = 8) sind das z.B. 0,83 µs. Die<br />
restlichen Stellen können Sie getrost vergessen, <strong>de</strong>r interne RC-Oszillator ist so arg ungenau, dass<br />
weitere Stellen eher <strong>de</strong>m Glauben an Zauberei ähneln.<br />
Zeitverzögerung<br />
Mit <strong>de</strong>r Anzahl Prozessortakte von oben (nc=3*c1, c1=200, nc=600) und 1,2 MHz Takt ergibt sich<br />
eine Verzögerung von 500 µs. Mit maximal 640 µs ist die Maximalbegrenzung dieser Konstruktion<br />
erreicht.<br />
Verlängerung!<br />
Mit folgen<strong>de</strong>m Trick können Sie noch etwas Verlängerung herausholen:<br />
.equ c1 = 200 ; 0 Takte, macht <strong>de</strong>r Assembler alleine<br />
ldi R16,c1 ; 1 Takt<br />
Loop: ; Schleifenbeginn<br />
nop ; tue nichts, 1 Takt<br />
nop ; tue nichts, 1 Takt<br />
nop ; tue nichts, 1 Takt<br />
nop ; tue nichts, 1 Takt<br />
nop ; tue nichts, 1 Takt<br />
<strong>de</strong>c R16 ; 1 Takt<br />
brne Loop ; 2 Takte wenn nicht Null, 1 Takt bei Null