Pfad: Home => AVR-Übersicht => Anwendungen => Rechteckgenerator
Rechteckgenerator klein

Rechteckgenerator mit ATmega8

Diese Anwendung eines AVR beschreibt einen Rechteckgenerator mit dem ATMEL ATmega8 mit folgenden Eigenschaften:

0. Inhalt

1 Hardware

SchaltbildDie Hardware besteht aus dem AVR-Prozessor ATmega8, einem In-System-Programmieranschluss (ISP), einer LCD-Anzeige und diversen externen Anschlüssen.

1.1 Prozessorteil

Der Prozessor ist mit folgenden externen Komponenten beschaltet.
Die Betriebsspannung von 5 V wird über die Pins 7 (+5 V) und 8 (0 V) zugeführt und mit einem Keramikkondensator abgeblockt.
Pin 1 (= RESET-Eingang) liegt über einen Widerstand an der positiven Betriebsspannung. An den beiden Anschlüssen Pin 9 und 10 (XT1, XT2) ist ein Quarz mit 16 Mhz angeschlossen. Die Umschaltung des Prozessortakts auf den externen Quarz erfolgt durch Setzen der entsprechenden Fuses. Die beiden Quarzanschlüsse sind mit Keramikkondensatoren von 22 pF zur Verbesserung des Anschwingverhaltens des internen Oszillators versehen.
Die Betriebsspannung für den AD-Wandler wird über eine Drossel von 22 µH und einen Folienkondensator von 100 nF an Pin 20 (AVCC) zugeführt. Als Referenzspannung dient eine softwareseitige Zuschaltung von AVCC, daher ist der AREF-Pin 21 mit einem Folienkondensator gegen Masse geblockt.

1.2 ISP-Interface

Das ISP-Interface dient der Programmierung des AVR in der fertig aufgebauten Schaltung.
Für ISP verwendet werden die Portbits 5 (SCK), 4 (MISO), und 3 (MOSI) sowie der RESET an Pin 1. MISO dient auch der Ansteuerung der LCD. Die Belegung am 10-poligen ISP-Pfostenstecker entspricht dem ATMEL-/KANDA-Standard. Die am Pfostenstecker angeschlossene LED zeigt den aktiven Programmiervorgang an.

1.3 LCD-Anzeige

Angeschlossen ist eine Standard-LCD-Anzeige. Für leichtes Wechseln der Anzeige ist ein 14-poliger Pfostenstecker vorgesehen, der der 14-poligen Anschlussleiste der LCD entspricht.
Der Kontrollport der LCD ist an die Portbits PB0 (LCD-Enable) und PB4 (LCD-RS-Eingang) angeschlossen. LCD-Enable ist über einen Widerstand mit 0 V verbunden. Solange der Port B nicht initialisiert ist (nach dem Einschalten, beim Programmieren über ISP), ist dadurch sichergestellt, dass die LCD nicht durch Fehlsignale angesteuert wird. Der Eingang LCD-R/W ist dauerhaft mit 0 V verbunden, weil die Anzeige ausschließlich beschrieben wird und nicht ausgelesen werden muss.
Der Datenport der LCD ist mit allen acht Bits des Ports D verbunden. Die Ansteuerung der LCD erfolgt also 8-bittig.

1.4 Externe Anschlässe

Bis auf die LCD und die Stromversorgung, die über eigene Steckverbinder angeschlossen sind, sind alle weiteren externen Komponenten über einen 14-poligen Steckverbinder angeschlossen. Dadurch ist sichergestellt, dass die Platine ausgebaut und ohne diese Komponenten betrieben und getestet werden kann. Durch Auftrennung des Flachbandkabels können die externen Komponenten systematisch angeschlossen werden.

1.4.1 Einstellpotis

Die ersten vier Adern des Flachbandkabels sind mit der Betriebsspannung und den AD-Kanälen verbunden.
Die beiden AD-Wandlerkanäle ADC0 (Frequenz) und ADC1 (Pulsweite) sind an die Schleifer von 10-Gang-Potentiometern angeschlossen. Die Potentiometer sind an die Betriebsspannung angeschlossen. Ihr nominaler Widerstandswert und ihre Linearität sind unkritisch, weil die Einstellungen über die Anzeige kontrolliert werden können.
Direkt am Potentiometer sind die eingestellten Spannungen mit Folienkondensatoren abgeblockt, um eingestreute Wechselspannungen zu vermeiden.

1.4.2 Schalter

Die nächsten fünf Adern verbinden die Schalter mit den Porteingängen PC2 bis PC5. Der Schalter an PC5 ist nur notwendig, wenn eine einzeilige LCD-Anzeige verwendet wird. Bei Anschluss einer zweizeiligen LCD ist dieser Schalter wirkungslos.
Alle Schalter verbinden im geschlossenen Zustand den entsprechenden Porteingang mit 0 V, da die inaktiven Eingänge mittels der Software mit Pullup-Widerständen auf die Betriebsspannung gezogen werden.

1.4.3 Ausgangsbuchsen

Die folgenden drei Adern führen die Ausgänge des Timers (normal, invertiert) an die CINCH-Ausgangsbuchsen.
Die Ausgänge liefern Rechteckspannungen mit den Ausgangscharakteristika der AVR-Treiber und liegen gleichspannunsgekoppelt an den Buchsen. Die Ausgänge sind kurzschlusssicher, aber gegen extern anliegende Spannungen nicht geschützt.

1.5 Netzteil

Das Netzteil liefert eine stabilisierte Betriebsspannung von 5 V bei einem Strom von etwa 20 mA. Der Stromverbrauch ist vom Widerstandswert der Potentiometer abhängig. Prozessor und LCD-Anzeige bleiben unter 10 mA Verbrauch.
Um einen Trafo mit 6 V Sekundärspannung verwenden zu können, ist die Gleichrichterbrücke mit Schottky-Dioden aufgebaut und ein Low-Drop-Spannungsregler eingesetzt. Bei Trafos mit 7,5 V Sekundärspannung und mehr können diese Komponenten gegen Standardwerte ausgetauscht werden.
Der Ladekondensator ist großzügig dimensioniert, bei dem geringen Strom kann er auch kleiner gewählt werden.
Die beiden Tantal-Elkos blocken Schwingneigungen des Spannungsreglers ab.

1.6 Aufbauhinweise

SchaltungsaufbauDer Aufbau ist mit einer Lochrasterplatine recht unkritisch. Der 14-polige Anschluss der LCD ist links angeordnet, der ebenfalls 14-polige Anschluss zu den externen Bedienelementen (Potis, Schalter, Ausgangsbuchsen) rechts auf der Platine. Das Flachbandkabel ist so belegt, dass es zu vier, fünf, drei und zwei Adern aufgetrennt werden kann und übersichtlich den verschiedenen Sektionen zugeführt werden kann. Wichtig sind die beiden Folienkondensatoren direkt an den Schleifern der beiden Potis, die eingestreute HF/NF abblocken.
Der 10-polige ISP-Programmieranschluss wird nicht oft benötigt und ist daher nicht außen am Gehäuse zugänglich angebracht. Das kleine Netzteil sitzt links oben an der Gehäusewand.

2 Bedienung

Nach dem Einschalten zeigt die LCD-Anzeige für etwa 2,5 Sekunden eine Meldung zur Gerätefunktion, die Softwareversion und das Copyright der Software an. Danach ist das Gerät betriebsbereit.

2.1 Schalter

Mit dem Schalter Time wird zwischen der LCD-Ausgabe der Frequenz (Schalter offen) und der Zeit (Schalter geschlossen) umgeschaltet. Die Ausgabe der Frequenz erfolgt in Hz mit zwei Dezimalstellen, die Ausgabe der Zeit in Mikrosekunden. Beide Größen werden gerundet und mit Tausenderzeichen getrennt dargestellt.
Ist die Frequenzausgabe ausgewählt, dann kann mit dem Schalter Rpm die Ausgabe von Umdrehungen pro Minute (= 60 * f) ausgewählt werden. Ist die Ausgabe der Zeit gewählt, bleibt dieser Schalter unwirksam.
Mit dem Schalter Inv werden beide Ausgangssignale invertiert.
Bei einzeiligen LCD-Anzeigen bewirkt der Schalter Pulse, dass anstelle der Frequenz/Zeit die Pulsweite in % angezeigt wird. Bei zweizeiligen LCDs beibt dieser Schalter unwirksam, die Pulsweite wird dauernd in der zweiten Zeile angezeigt.

2.2 Ausgangssignale

Die Ausgangssignale stehen an den beiden CINCH-Buchsen in positiver und invertierter Form zur Verfügung. Um kapazitive Effekte auf die Flankensteilheit zu vermeiden, sollten kurze und unabgeschirmte Leitungen verwendet werden.

3 Funktionsweise

Dieser Abschnitt erläutert die Funktionsweise des Prozessorteils, des ISP-Interfaces und der LCD-Anzeige.

3.1 Prozessorteil

Der Prozessor ATmega8 arbeitet mit einem extern angeschlossenen Quarz als Taktgenerator. Da der Prozessor als Werkseinstellung mit dem internen RC-Oszillator bei 1 MHz arbeitet, müssen zuerst folgende Fuses des Mega8 umgestellt werden: Das Umprogrammieren dieser Fuses kann entweder extern in einem Programmierboard (z.B. mit einem STK500 und dem ATMEL-Studio) erfolgen oder in der fertig aufgebauten Schaltung mit dem ISP-Interface (z.B. mit PonyProg2000).

Fuses beim StudioBeim Programmieren mit einem STK500 muss der Quarz zugeschaltet werden, da der Mega8 sonst nach dem Umstellen der Fuses ohne Quarz nicht mehr ansprechbar ist. Die Fuses sind richtig eingestellt, wenn eine der beiden letzten Optionen gewählt wird.

Fuses beim PonyProgBei PonyProg ist zu beachten, dass die Fuses invertiert dargestellt sind. Zur Orientierung: per Werkseinstellung sind CKSEL3..CKSEL0 auf 0001 und SUT1..SUT0 auf 10 eingestellt. Mit dem Read-Button sollten die Fuses vorher ausgelesen werden. Natürlich muss der Quarz in der Schaltung vor dem Umprogrammieren der Fuses schon angeschlossen sein. Bei SUT0 kann ebenfalls der Haken ebenfalls entfernt werden (SUT1:SUT0 = 11).

Die angeschlossenen Schalter werden zu Beginn des Programms mittels Software mit den Pull-Up-Widerständen auf positives Betriebsspannungs-Niveau gezogen. Sind die Schalter eingeschaltet (aktiviert), werden diese Eingangsleitungen auf logisch Null gesetzt. Der Schalter Pulse ist nur relevant, wenn eine einzeilige LCD-Anzeige verwendet wird.

Die Frequenzerzeugung erfolgt mit dem internen 16-Bit-Zähler TC1 des ATmega8 im Fast-PWM-Modus. Das Schema zeigt die Funktionsweise des TC1 im Fast-PWM-Modus und die die Funktionen beeinflussenden Parameter (blau).

TC1 im Fast CTC Mode Die aus dem Quarz abgeleitete 16MHz-Taktfrequenz wird dazu im Vorteiler entweder durch 1, 8, 64, 256 oder 1024 geteilt und dem Zähler zugeführt. Bei Erreichen des eingestellten TOP-Wertes in dem Doppelregister ICR1 setzt der Zähler zurück und aktiviert die Compare-Ausgänge OC1A (Portbit PB1, Pin 15) und OC1B (Portbit PB2, Pin 16). Die Frequenz des Generators wird über den TOP-Wert in ICR1 festgelegt. Abhängig vom eingestellten Wert der Pulsweite werden die Vergleichswerte in den COMPA- und COMPB-Doppelregistern eingestellt. Erreicht der Zähler diese eingestellten Werte, werden die Ausgänge OC1A und OC1B deaktiviert und bleiben bis zum Erreichen von TOP inaktiv.
Die beiden Ausgänge OC1A und OC1B sind von der Software komplementär eingestellt, d.h. sie erzeugen invertierte Signale gleicher Pulsdauer. Mit dem Schalter "Invert" wird diese Polarität an den Ausgängen software-mäßig invertiert.

Die Frequenzeinstellung erfolgt mit dem Potentiometer P1. Da 1024 verschiedene diskrete Frequenzen eingestellt werden können, muss dafür ein Zehngang-Poti verwendet werden. Das Poti gibt eine Spannung zwischen 0 und 5 V ab, die mit dem AD-Wandler ADC0 (Portpin PC0, Pin 23) gemessen und in einen Hex-Wert zwischen 0x00 und 0x1F umgewandelt wird. Dieser Wert wird verwendet, um aus der einprogrammierten Tabelle (Lookup-Tabelle, Include-Datei rectgen_m8_table.inc) den zugehörigen TOP-Wert auszulesen, der beim nächsten Update in ICR1 geschrieben wird. Abhängig von der eingestellten Frequenz wird aus dem ADC0-Wert auch noch der Vorteilerwert des Zählers ermittelt und gespeichert.

Die Pulsweiteneinstellung wird mit dem zweiten Zehngang-Potentiometer aufgenommen und über ADC1 (Portbit PC1, Pin 24) in einen Wert zwischen 0x00 und 0x1F umgewandelt. Der TOP-Wert wird mit diesem gemessenen Wert multipliziert und durch 1024 geteilt. Das Ergebnis wird beim nächsten Update in die Compare-Register COMPA und COMPB geschrieben.
Im gleichen Zyklus wird noch der Schalter Invert eingelesen und die Ausgangspolarität an OC1A und OC1B eingestellt.

Der TC1-Zähler läuft ohne Software-Eingriff freilaufend. Zum Aktualisieren der Einstellungen wird der 8-Bit-Zähler TC0 verwendet. Er teilt den Systemtakt durch 1024 (Vorteiler) und läft bei Erreichen eines Zählerstandes von 256 über (@16MHz: alle 16,384 ms). Er unterbricht den Programmablauf und zählt ein Register von 30 abwärts. Wird das Zählerregister Null (nach jeweils 492 ms), wird der AD-Wandler auf Kanal 0 eingestellt und die erste Messung auf ADC0 gestartet.
Der AD-Wandler arbeitet mit einer durch 128 geteilten Taktfrequenz. Das Vorliegen des ersten Resultats löst einen ADC-Conversion-Complete-Interrupt aus. Nach Setzen eines Flagbits wird der ADC auf Kanal 1 umgestellt und erneut eine Messung gestartet. Liegt auch dessen Ergebnis vor, wird der AD-Wandler abgeschaltet und ein Behandlungsflag gesetzt.
Die Umwandlung und Aktualisierung der TC1-Parameter erfolgt danach asynchron in der Hauptprogrammschleife. Die eingelesenen Werte werden umgewandelt und der Zähler auf die neuen Sollwerte gesetzt. Nach dem Programmieren von TC1 wird die LCD aktualisiert und der Hauptprogrammloop bis zum nächsten TC0-Interrupt mit Schlafen der CPU abgeschlossen.

3.2 LCD-Anzeige

Die LCD-Anzeige ist mit dem 8-Bit-Datenport und den beiden Kontrollleitungen E(nable) und R(egister)S(elect) an den Prozessor angeschlossen. Die R(ead)/W(rite)-Leitung liegt dauernd auf Write, da die gesamte Steuerung über zeitgenaue Schleifen vorgenommen wird.

Beim Programmstart wird nach einer Wartezeit für die interne Initialisierung die LCD-Anzeige auf folgende Modi eingestellt: Dann wird für 2,5 Sekunden eine Eröffnungsmeldung ausgegeben.

Nach jeder Aktualisierung des TC1-Timers wird auch die Anzeige der LCD aktualisiert. Dazu wird zunächst der CTC-Wert aus ICR1 mit dem Vorteilerwert (1, 8, 64, 256, 1024) multipliziert. Ist die Anzeige der Frequenz ausgewählt (Schalter Time aus), dann wird die mit 100 multiplizierte Taktfrequenz (100*16.000.000) durch diesen Wert geteilt, um die Frequenz in Hz mit einer Auflösung von 0,01 Hz als Ganzzahl zu erhalten. Ist die Zeit ausgewählt (Schalter Time an), wird die mit dem Vorteilerwert multiplizierte CTC-Rate mit dem Faktor 25.600.000.000/clock (@16MHz: 1.600) multipliziert, um die Zeit in Mikrosekunden mal 100 als Ganzzahl zu erhalten. Bei einer zweizeiligen LCD wird der sich ergebende Wert für die Frequenz bzw. die Zeit in Zeile 1 ausgegeben, bei einer einzeiligen LCD nur dann, wenn der Schalter für die Ausgabe der Pulsweite (Schalter Pulse) nicht aktiviert ist.

Die Pulsweite wird ermittelt, indem der Wert für COMPA bzw. COMPB mit 10.000 multipliziert und dann durch den CTC-Wert geteilt wird. Die erhaltene Ganzzahl gibt die Pulsweite mal 100 in % an und wird bei einer zweizeiligen LCD in Zeile 2, bei einer einzeiligen LCD bei eingeschaltetem Schalter Pulse in Zeile 1 mit einer Auflösung von 0,01% angezeigt.
Die Anzeige wird ca. zwei Mal pro Sekunde aktualisiert.

Bei höheren Frequenzen können aufgrund der auf 16 Bit begrenzten Auflösung Frequenzen und Pulsweiten nicht mehr exakt eingestellt werden. Dies ist dadurch erkennbar, dass Nachkommastellen auftreten. Durch die Berechnung der beiden Größen aus den tatsächlich verwendeten Werten wird sichergestellt, dass die angezeigten Größen auf jeden Fall zuverlässig sind.

3.3 ISP-Interface

Das ISP-Interface dient der Aktualisierung der Software innerhalb der fertig betriebenen Schaltung. Die Daten- bzw. Taktsignale MOSI, MISO und SCK sind an einem 10-poligen Standard-Pfostenstecker angelegt. Über die RESET-Leitung (Portbit PC6, Pin 1) schaltet das ISP-Programmierinterface den Mega8 in den Programmiermodus, nach dem Ende des Programmierens wird der RESET-Eingang wieder freigegeben und ein Neustart des Prozessor ausgelöst.
Die Programmier-LED zeigt einen aktiven Programmierzyklus an, dient ausschließlich diesem Zweck und kann ersatzlos entfallen, wenn diese Funktion nicht erforderlich ist oder wenn ein sechspoliger Programmieranschluss verwendet wird.

4 Software

Die Software ist ausschließlich in Assembler geschrieben und in drei funktionelle Pakete aufgeteilt. Vor dem Assemblieren müssen eine Reihe von Einstellungen vorgenommen werden, um die Software an die vorhandene Hardware optimal anzupassen.

4.1 Einstellungen vor dem Assemblieren

4.1.1 Frequenztabelle

Die Frequenztabelle in der Datei rectgen_m8_table.inc umfasst 1024 Worte für die Umsetzung der eingestellten Spannung in den CTC-Wert. Die Werte wurden mit einem Spreadsheet errechnet und als Include-Text-Datei exportiert. Bei Änderungen an dieser Tabelle ist zu beachten, dass die Übergänge zwischen den verschiedenen Vorteilerwerten in der Routine Convert in der Datei rectgen_m8_v1.asm ebenfalls an die geänderte Tabelle angepasst werden müssen (aktuelle Werte: 392, 225, 60 und 3).

Wird die Taktfrequenz (Konstante clock) geändert, müssen auch die zugehörigen 5-Byte-Konstanten cDivFx und cDivUx entsprechend angepasst werden, da bei der automatischen Berechnung Überläufe auftreten würden.

Die Konstanten cLcdLw und cLcdLn definieren die angeschlossene LCD.

Die Konstante cLcdMicro definiert das Mikrozeichen auf der angeschlossenen LCD. Der Default ist auf ein u eingestellt, da der häufige Wert 0xE4 nicht auf allen LCDs funktioniert.

Die Konstante cEn stellt die Tausender- und Dezimaltrennzeichen auf englisches Format um.

4.1.2 Diverse Schalter

Die Anschlussfolge der Schalter Time, Rpm, Inv und Pulse lässt sich bei der Definition der Ports umstellen (Konstanten pbTime, pbRpm, pbInv und pbPwm).
Die Schalter dbgon und dbghx dienen dem Debugging. Sie müssen für ordnungsgemäße Funktion des Progamms auf Null gesetzt sein.

4.2 Kommentierter Quellcode

Der kommentierte Quellcode steht im HTML-Format und als Assembler-Quellcode gezippt zur Verfügung: alles in einem Paket

©2006 by http://www.avr-asm-tutorial.net