|
Interner RC-Oszillator
- Alle Mikrocontroller der AVR-Serie werden so ausgeliefert, dass sie beim ersten Einschalten mit 1MHz über den internen RC-Oszillator getaktet werden.
- Durch so genannte Fuse-Bits (s. weiter unten), lassen sich für den internen RC-Generator auch noch die Frequenzen 2MHz, 4MHz und 8MHz einstellen.
- Bei Verwendung des internen RC-Oszillators brauchen an den Mikrocontroller keine weiteren Bauelemente angeschlossen werden.
- Dies ist deshalb die billigste und einfachste Option, jedoch nicht die genauste:
- Bei der Frequenz, die durch einen RC (Widerstand-Kondensator)-Schwingkreis erzeugt wird, ist die Toleranz wesentlich größer, als bei einem Quarzoszillator.
- Benötigt man genaues Zeitverhalten im Mikrosekundenbereich, oder muß die Taktfrequenz mit einer anderen Komponente korrespondieren (z.B. bei der seriellen Schnittstelle zum PC), so ist dem internen RC-Oszillator ein externer Quarz vorzuziehen.
|
Prinzipschaltung RC-Oszillator
Bild 0-1: Astabiler Multivibrator
- Obige Schaltung zeigt stellvertretend für eine ganze Klasse an RC-Oszillatoren den Astabilen Multivibrator.
- Grundsätzlich sind aktive Bauelemente notwendig, einen RC-Oszillator zu realisieren.
- Hier sind das die beiden NPN-Transistoren.
- Bei diesen wird der Widerstand zwischen Kollektor und Emitter umso geringer, je positiver das Potential an der Basis ist.
- Die Funktionsweise:
- Die Schaltung kippt immer zwischen zwei Zuständen hin und her: T1 gesperrt und T2 leitend und umgekehrt.
- Die Kondensatoren wirken als Verzögerungsglieder bei dem Wechsel zwischen den Zuständen.
- Nach dem Einschalten stellt sich einer der beiden Zustände ein. Angenommen zu Beginn ist T1 gesperrt und T2 leitend.
- In diesem Fall liegt die rechte Seite von C2 an einer negativen, die linke an einer positiven Spannung an.
- Dadurch lädt sich C2 so auf, dass das Potential an der Basis von T1 positiver wird, bis schließlich T1 leitend wird.
- Auch bei C1 liegt an der rechten Seite eine negative, an der linken eine positive Spannung an.
- Dadurch sinkt das Potential an der Basis von T2 ab, bis T2 schließlich sperrt.
- Nun hat sich der Zustand von T1 und T2 vertauscht und die Ladungsprozesse kehren sich wieder um.
- Die Schaltung schwingt und liefert eine Rechteckschwingung für deren Frequenz ungefähr gilt:
- f = 1,443/(RV1*C1+RV2*C2)
|
Genauigkeit RC-Oszillator versus Quarz-Oszillator
- Widerstände haben in der Herstellung mindestens +/-1% (Metallschicht) bis +/-5% (Kohleschicht) Toleranz, Kondensatoren zwischen +/-2% und +/-20%.
- Demgemäß würde selbst bei optimalen Bedingungen eine bestimmte Frequenz bei obiger Schaltung nur mit einer Genauigkeit von +/-3% hergestellt werden können.
- Dagegen schwingen Quarze bei Anregung mit einer Spannung mit einer Genauigkeit von +/-30ppm (parts per million - also hier +/-0,003%).
|
Bedeutung der Fuse-Bits
- Als Fusebits werden die Bits von Registern bezeichnet, die zur Konfiguration des Mikrocontrollers verwendet werden (z.B. um festzulegen, ob ein externer Quarz oder der interne RC-Taktgenerator verwendet wird).
- Eine weitere Eigenschaft von Fuse-Bits ist es, dass sie nicht durch ein Programm angesprochen werden können, sondern nur direkt über das Programmiergerät gesetzt, oder zurück gesetzt werden.
- Tatsächlich müssen für die Einstellungen für die Taktgebung gleich mehrere Fusebits parallel verändert werden.
- Jedoch bietet die Software für das hier verwendete USB-Programmiergerät, die Möglichkeit die Art der Taktgebung direkt auszuwählen.
- Die notwendige Fuse-Bit-Kombination wird dann aufgrund dieser Auswahl gesetzt.
|
Bild 0-2: Verwendeter Programmierer - AVRISP mkII über USB
Bild 0-2: Direktanwahl des Taktgebers bei der Programmierer-Software im Menü für die Fusebits - hier hochfrequenter Quarzoszillator.
- Bei anderen Programmierern muß man die Fuse-Bit-Register CKSEL und SUT passend zur Auswahl des Taktgebers einstellen.
- Beispiele:
|
CKSEL SUT
Bit 3 2 1 0 1 0
Interner RC-Osz., 8MHz 0 1 0 0 1 0
Externer hochfreq. Quarz 1 1 1 1 1 1
Externer Taktgenerator 1 1 1 1 1 0
Code 0-1: Zusammenhang zwischen Fusebits und Taktgeneratorauswahl
- Hinweis für Bastler: Die Software Ponyprog für Programmiergeräte am Parallelport invertiert die Fusebit-Zustände! - angezeigte 1 entspricht gesetzte 0 und umgekehrt.
|
- Das Thema Fusebits soll nicht weiter vertieft werden.
- Lediglich, wo spezielle Konfigurationen notwendigerweise eingestellt werden müssen, werden entsprechende Angaben für die Benutzung des USB-Programmierers gemacht.
- So gibt es neben der Möglichkeit den ATmega32 über die ISP-Schnittstelle zu programmieren noch die Möglichkeit die JTAG-Schnittstelle zu verwenden.
- Die JTAG-Option ist werkseitig zunächst aktiviert und muß als allererstes abgeschaltet werden, damit PORT C als digitaler I/O richtig arbeitet.
- Hier ein Blick auf die Einstellung bei der Programmierer-Software mit abgeschaltetem JTAG:
|
Bild 0-2: Wichtige Einstellung bei den Fuse-Bits: Abgeschaltete JTAG-Option.
Nachweis der Taktrate über Assemblerprogramm mit bekannter Taktzyklen-Anzahl
- Um die eingestellte Taktrate genau nachvollziehen zu können, wird ein Assemblerprogramm geschrieben, bei dem die Endlosschleife genau 10 Taktzyklen für einen Durchlauf benötigt.
- Dieses Programm soll immer 5 Taktzyklen lang alle Bits von Port D auf 1 / high / 5Volt setzen und für 5 weitere Taktzyklen auf 0 / low / 0Volt.
- Um das Programm realisieren zu können muß man sich Klarheit über die Dauer der einzelnen Maschinenbefehle verschaffen.
- Vorgehen:
- Zunächst wird ein möglichst kurzes Programm geschrieben, das ständig im Wechsel erst Port D auf 010 bzw. 0b00000000 setzt und dann auf 25510 bzw. 0b11111111.
- Dieses Programm benötigt für einen Zyklus Port D auf 0 und dann auf 255 zu setzen weniger als 10 Taktzyklen.
- Aus diesem Grund werden dann zwischen der Setung von Port D auf 0 und 255 so genannte NOP-Befehle zum "Anfüllen" eingesetzt.
- NOP steht für "No Operation". Diese Befehle machen nichts, verbrauchen aber genau einen Taktzyklus.
- Wie im unten stehenden Programm ersichtlich ist, benötigen alle verwendeten Befehle in der Endlosschleife genau einen Taktzyklus.
- Mit Ausnhame des Rücksprungs zur Startmarke (RJMP). Dieser Befehl benötigt ale einziger zwei Taktzyklen.
- Zählt man die Taktzyklen, die hinter dem ersten Befehl PORTC,akku bis zum zweiten vergehen, sieht man, dass es genau fünf Taktzyklen sind.
- Zählt man die Taktzyklen, die hinter dem zweiten Befehl PORTC,akku bis zum ersten vergehen (mit Durchführen von RJMP), so sieht man, dass es hier auch genau fünf Taktzyklen sind.
- Somit wird hier eine Rechteckschwingung erzeugt, deren High-Phase genau so lang ist wie deren Low-Phase und die exakt ein zehntel der Frequenz der Taktung des Bausteins hat.
- Nach Übertragung und Start des Programms auf den Mikrocontroller, wird ein Oszilloskop an einem der Bits von Port D angeschlossen (PD0, PD1, PD2, PD3, PD4, PD5, PD6, oder PD7), somit ein zehntel des Systemtaktes anzeigen.
- Hierfür eignen sich PD0 und PD1 (Pin 14,15) beim unteren Mikrocontroller (in Zukunft muecb genannt) auf dem Experimentierboard, da diese nicht beschaltet sind.
|
Bild 0-3: Assemblerprogramm mit Endlosschleife (rot umrandet) für wechselndes Setzen und Löschen der 8 Bits von PORT D. Die Schleife benötigt für einen Durchlauf genau 10 Taktzyklen.
Komplettes Projekt zu obigem Programm: takttest_assembler.zip
Alternativ: Feststellung der Taktzyklen eines C-Programms durch den AVR-Simulator
- In der aktuellen Version der Programmentwicklungsumgebung AVR-Studio, ist es möglich auch die benötigten Taktzyklen für C-Programme abzulesen.
- Folgendes Programm ist die C-Alternative für obiges Assemblerprogramm.
- Der Befehl DDRD = 0b11111111; dient innerhalb der Endlosschleife als Ersatz für die NOP-Befehle.
- Durch diesen Trick war es auch hier möglich, eine Rechteckschwingung mit einem zehntel der Taktfrequenz und gleichlanger high- und Lowphase zu erzeugen.
- Um die benötigten Taktzyklen für jeden Befehl herauszufinden, wurde der Debugger/Simulator des AVR-Studios verwendet (s. grüne Umrandungen).
- In ihm wird bei Aktivierung der View-Option "Processor" auch der "Cycle Counter" angezeigt, der bei jedem Programmschritt (step into) die bereits verstrichenen Taktzyklen anzeigt (s. grüne Umrandungen).
|
Bild 0-3: C-Programm mit Endlosschleife für wechselndes Setzen und Löschen der 8 Bits von PORT D. Die Schleife benötigt für einen Durchlauf genau 10 Taktzyklen.
Komplettes Projekt zu obigem Programm: takttest_c.zip
- In der Einführung wurde beeits darauf hingewiesen, das ein C-Programm in der regel einfacher zu schreiben ist, als ein Assemblerprogramm, dass bei einem C-programm jedoch der Verbrauch an Taktzyklen und Programmspeicher in der Regel größer ausfällt und nicht genau kontrollierbar ist.
- Bei diesem sehr wenig komplexen Beispiel liegen C-Programm und Assemblerprogramm noch sehr nah beieinander.
- Aber selbst hier schon benötigt das Assemblerprogramm einen NOP-Zyklus mehr, d.h. das Assemblerprogramm verwirklicht die geforderte Funktionalität effizienter.
|
|