kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Laboruebung2_alt
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
8 OOP
..8.1 Probleme
..8.2 Konzept
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zaehler
10 Peripherie
..10.1 RS232Menue
..10.2 ASCIIDisplay
..10.3 Tastenmatrix
..10.4 Schrittmotor
..10.5 Zaehler
..10.6 Uebung7
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu

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.