myavr.CHKRonline.de

Informationen und Projekte Rund um die Mikrocontroller-Programmierung
von myAVR (ATmega8), STM32 (Cortex-M3/4) und Raspberry Pi (ARM11)

Der Autor

Christian KrügerChristian Krüger, ursprünglich aus dem Altenburger Land stammend, wohnt heute in Nürnberg. Nach seinem Studium der Informations­technik an der West­sächsischen Hochschule in Zwickau, ist er heute Software Entwickler für ein­gebettete Systeme. Seine Berufung fand er im Dienst für seine Kollegen als Teamleiter bei ISCUE.

Die größte Leidenschaft Christians ist es, die Schönheit unserer Welt einzufangen und weiter­zuerzählen. Dies gelingt ihm mit Hilfe seiner Kamera. Seine Fotos und Videos sind auf Instagram und seiner Webseite zu betrachten.

Für seine Zukunft freut sich Christian auf erinnerungs­würdige Reisen, begeisterungs­fähige Menschen und viele neue Erfahrungen.

CHKRonline.de

Facebook Profil

Twitter Profil

XING Profil

Meine myAVR Treiber

Timer Treiber

Timer/Counter-Einheiten zählen zu den grundsätzlichen Hardwareeinheiten eines jeden synchronen Rechenwerks. Sie erlauben die Ableitung einer Zeitbasis von einem internen oder externen Takt. Da sie Takte zählen können, bieten sie sich für das Generieren von getakteten Signalen (Pulsweitenmodulation, PWM) ebenso an, wie für das Analysieren eingehender digitaler Signale.

Typischerweise besteht ein Timer minimal aus einem Takt-Generator, einem Zählregister sowie einer Ouput-Compare-Unit. Der Takt-Generator entspricht meist einem Takt-Teiler, der den Systemtakt um verschiedene Größenordnungen verkleinert an das Zählwerk weitergibt. Dieses zählt ein Zählregister auf oder ab, bis dieses einen Grenzwert erreicht. An dieser Stelle tritt ein Überlauf ein, der in Form eines Overflow-Interrupt behandelt werden kann. Diese Funktionalität genügt bereits, um eine vom Systemtakt abgeleitete Zeitbasis zu generieren.

PWM Generation

Über ein Output-Compare-Register kann der Zeitpunkt eines weiteren Ereignisses, des Compare-Match, bestimmt werden. Erreicht der Wert im Zählregister den Wert im Output-Compare-Register, tritt ein Compare-Match-Interrupt auf. Somit lässt sich eine vollkommen variable Zeitbasis generieren. Nutzt man das Ereignis jedoch, um z.B. einen Pin umzuschalten, entsteht eine Pulsweitenmodulation. Wird dieser Pin zwischen Überlauf und Compare-Match zum Beispiel auf high geschalten, und zwischen Compare-Match und erneuten Überlauf auf low, so kann mit dem Wert im Output-Compare-Register das Verhältnis zwischen high- und low-Phase eingestellt werden.

Diese PWM-Funktionalität ist in den meisten Timer-Einhalten bereits automatisiert enthalten. PWM eignet sich für die Generierung von Signalen, in denen die Pulsweite als Informationsträger fungiert. Wird der Energiegehalt eines PWM-Signals gemittelt, kann es auch einen analogen Spannungspegel darstellen. Dies wird durch verschleifen der high- und low-Bereiche erreicht, z.B. mit einem passiven RC-Filter.

Der ATmega8 und der ATmega328P besitzen je drei Timer-Einheiten, Timer0, Timer1 und Timer2. Timer0 und Timer2 sind jeweils 8-Bit Zähler, während Timer1 ein 16-Bit Zähler ist. Timer0 und Timer2 sind beim ATmega8 zusätzlich deutlich funktionsärmer, als beim ATmega328P. Im Durchschnitt bietet jeder Timer ein Zählregister sowie zwei Output-Compare-Einheiten. Diese sind je an einen Pin OCA und OCB gekoppelt, um PWM-Signale zu erzeugen.

Umsetzung

Die Timer-Einheiten des ATmegas bieten durch ihre Vielzahl von Zählmodi und die beiden Output-Compare-Einheiten eine schier unüberblickbare Zahl von Funktionsmodi. Daher ist es nicht möglich, jeden Funktionsmodus abstrahiert in den Treiber zu integrieren. Vielmehr bietet dieser Treiber einen vereinfachten Zugriff auf die einzelnen Einstellmöglichkeiten der Timer-Einheiten.

Der Vorteil besteht darin, dass sich viele Einstellungen (z.B. der Prescaler) auch ohne Kenntnis der Hardware verändern lassen. Auch wird der Programmierer nicht genötigt sein, direkt die Register der Timer-Einheiten zu bearbeiten. Für eine erste Inbetriebnahme eines Timers wird es jedoch nicht umgänglich sein, sich mit den Betriebsmodi und den damit verbundenen Abhängigkeiten in der Dokumentation (ATmega8/ATmega328P) vertraut zu machen.

Die Funktionen für Timer0, Timer1 und Timer2 sind jeweils durch ein Namensprefix getrennt. Dadurch konnten alle Funktionen innerhalb eines C- und Header-Datei untergebracht werden. Der Umfang wirkt auf den ersten Blick erschlagend, da die Funktionen für die einzelnen Timer aber sehr ähnlich sind, lassen sich die meisten Konventionen übertragen.

Lizenz

Dieses Programm ist freie Software. Du kannst es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach deiner Option) jeder späteren Version.

Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es dir von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details findest du in der GNU General Public License.

Die Lizenzvereinbarung stehen folgend zur Verfügung: GPL 3.0 Lizenz

Kompilierung

Der Treiber liegt in Form einer statischen Bibliothek vor. Diese kann einfach zusammen mit einem ausführbaren Programm gelinkt werden. Dazu sind der Header der Bibliothek als auch die Bibliothek selbst notwendig. Neben der Bibliothek liegt ein Testprogramm vor, welches ein synchrones PWM-Signal an Pin B0 ausgibt.

Die Bibliothek wurde mit Hilfe von AVR-Eclipse entwickelt. Sie sollte sich in einem Hauptprogramm mit Hilfe des myAVR Workpad SE bzw. Plus oder AVR-Ecplise jederzeit kompilieren und auf ein myAVR Board MK2 USB transferieren lassen. Bei der Nutzung des myAVR Workpad ist dazu die Angabe der Bibliothek in den Datei-Kommentaren notwendig:

// LinkerOption   : -v -L"PATH_TO_IO_LIBRARY" -lTimerDriver

Unter Eclipse ist die Definition des Symbols __ECLIPSE__ für eine korrekte Kompilierung notwendig, außerdem müssen die Pfäde zu der Bibliothek in den Projekt-Eigenschaften hinterlegt werden. Siehe dazu auch das AVR-Eclipse Tutorial Seite 3.

Die Kompilierung der Bibliothek selbst ohne Hauptprogramm ist lediglich mit AVR-Eclipse vorgesehen. Das myAVR Workpad bietet keine mir bekannte Möglichkeit, eine Bibliothek zu kompilieren.

Bei Fragen oder Anregungen stehe ich gerne zur Verfügung: chkr1989@chkronline.de

Changelog

Version 1.0

Bibliothek ATmega8 @ 3,6864 MHz

Bibliothek ATmega328P @ 16,0 MHz

Testprogramm ATmega8 @ 3,6864 MHz

Testprogramm ATmega328P @ 16,0 MHz

Lizenzinformationen