kramann.info
© Guido Kramann

Login: Passwort:










2.2 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

BILDBESCHREIBUNG

Bild 2.2-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.
BILDBESCHREIBUNG

Bild 2.2-2: Verwendeter Programmierer - AVRISP mkII über USB

BILDBESCHREIBUNG

Bild 2.2-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 2.2-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:
BILDBESCHREIBUNG

Bild 2.2-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.
BILDBESCHREIBUNG

Bild 2.2-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).
BILDBESCHREIBUNG

Bild 2.2-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.