AVR® Mikrocontroller in C programmierenAVR Mikrocontroller wurden schon während ihren Entwicklungsphase dafür optimiert, in C programmiert zu werden.
Der avr-gcc ist ein
freier C-Compiler, der speziell auf die Programmierung von AVR
Mikrocontrollern zugeschnitten ist.
Dabei steht GCC für Die avr-gcc Toolchain wird auch in den gängigen IDEs genutzt, mit denen AVR-Mikrocontroller programmiert werden. Z.B. auch im Atmel Studio in der PlatformIO oder in der Arduino IDE. Wenn die IDEs zu umfangreich und umständlich zu bedienen sind oder nicht zum Betriebssystem passen, gibt es die Möglichkeit, die avr-gcc auch über die Kommandozeile zu bedienen. Die avr-gcc mit LinuxInstallieren der avr-gccIn vielen aktuellen Linux-Distributionen gibt es die Möglichkeit, die avr-gcc Toolchain per Paketmanager zu installieren. Hat man die Installation durchgeführt, so kann man in der Kommandozeile den Erfolg überprüfen. > avr-gcc
avr-gcc: fatal error: no input files
compilation terminated.
Der "Fatale Fehler" sagt dem User in diesem Fall nur, dass der Compiler nichts zu kompilieren hat, weil kein File angegeben wurde. Die Version der installierten avr-gcc erhält man mit der Option --version. > avr-gcc --version avr-gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812] Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compilieren eines C-Quelltextes
Um ein Programm auf den Mikrocontroller schreiben zu können, muss es im Maschinenformat vorliegen.
Viele Programmierer akzeptieren das Die Compilierung des C-Quellcodes läuft über mehrere Zwischenstufen.
Beim ersten Schritt (Compilieren) wird das C-Programm zunächst in Assembler-Code übersetzt. Dabei wird der Quellcode auf Fehler überprüft und der entstandene Assembler-Code optimiert.
Beim zweiten Schritt (Assemblieren) wird das Assembler-Programm in einen
AVR-eigenen Objektcode (Endung:
Im dritten Schritt (Linken) werden die entstandenen Objekt-Code-Dateien
zusammengesetzt und ggf. Module aus Bibliotheken (Libraries) ergänzt. Es entsteht eine
AVR-Ausgabedatei (Endung:
Im letzten Schritt wird die AVR-Ausgabedatei in ein für den Hardware-Programmer passendes Format
umgewandelt (meistens Nun kann der Programm-Code mit dem Hardware-Programmer auf den Mikrocontroller geschrieben werden. Bei diesen Zwischenschritten entstehen mehrere Dateien (die teilweise wieder gelöscht werden). Daher ist es notwendig, den C-Quelltext in einen eigenen Ordner unterzubringen. Der folgende Link verdeutlicht den Ablauf anhand eines Beispiels für den ATmega328p. Hochladen des Codes auf den MikrocontrollerFür das Hochladen des Codes auf den Mikrocontroller benötigt man ein passendes Hardware-Programmiergerät und ein Software-Tool, das mit dem Programmiergerät zurechtkommt. Auch hier bietet die avr-gcc Toolchain das passende Programm: AVRDUDE AVRDUDE versteht sich mit den meisten Programmiergeräten und wird auch von den gängigen IDEs benutzt. Mit einem Trick lässt sich ein Arduino Uno Board, das mit einem ATmega328p bestückt ist, auch ohne ein Hardware-Programmiergerät mit C-Quelltext programmieren. Dazu muss der Quelltext als HEX-File vorliegen. Hauptbestandteile eines C-ProgrammsDie int main() Funktion
Mindestbestandteil jedes C-Programms ist die
Die main Funktion muss in jedem C-Programm vorhanden sein, das nach der Kompilierung eine ausführbare Datei ergeben soll. In der main Funktion stehen die Anweisungen, mit denen das Programm beginnt. Grundstruktur eines AVR C-ProgrammsIm unten verlinkten Video wird die Grundstruktur eines C-Programms für einen ATmega328p am Beispiel des Programms "Blink" in der PlatformIO IDE erklärt. StandardbibliothekenHäufig eingesetzte Standardbibliotheken sind: AVR I/O Bibiliothek
Für den Zugriff auf die zahlreichen Register von AVR Mikrocontrollern
ist die
Beispielsweise kann das DDRB Register wie folgt angesprochen werden:
Delay Bibiliothek
Delay-Routinen sind eigentlich Zählschleifen, in denen der Mikrocontroller mit Nichtstun beschäftigt
wird. Wie oft eine Zählschleife durchlaufen werden muss hängt vom Arbeitstakt des Mikrocontrollers
ab. Um komplizierte Berechnungen der Länge der Zählschleife zu ersparen, ist es sinnvoll die
Delay Bibliothek einzubinden.
Die delay.h Bibliothek befindet sich im Unterorder util/. DatentypenPrinzipiell sind Integer-Datentypen am besten geeignet für die Arbeit mit Mikrocontrollern. Es sind zwar auch Fließkomma-Typen möglich, jedoch benötigen sie eine relativ lange Rechenzeit. Daher sollte man diese möglichst vermeiden. Bei der Bildung von Arrays sollte man den relativ kleinen Datenspeicher (SRAM-Speicher) des Mikrocontrollers berücksichtigen. Dieser ist auch mit kleinen Arrays schneller voll als man denkt. Standardisierte Integer-Typen
Die Variablen-Typen unterscheiden sich in der avr-gcc vom C-Standard. Am besten ist es, mit
standardisierten Integer-Typen zu arbeiten, die in der
Dazu wird die Header Datei
Vorzeichenbehaftete Integertypen können 8, 16, 32 oder 64 Bit lang sein:
Vorzeichenlose Integertypen können 8, 16, 32 oder 64 Bit lang sein:
Beispiel für die Zuweisung eines 8 Bit unsigned Integer:
Zeichen
In C werden einzelne Zeichen mit dem Datentyp Zeichenkonstanten (einzelne Zeichen) werden in einfache Anführungszeichen (Single Quotes) geschrieben. char zeichen = 'a'; ZeichenkettenInterrupts mit AVR-gcc programmierenInterrupt BibliothekFür die Behandlung von Interrupts, stellt avr-gcc die Interrupt Bibliothek zur Verfügung. Diese muss zuvor in den Quellcode eingebunden werden.
Globale InterruptsteuerungInterrupts werden nur freigegeben, wenn das I Bit im Statusregister SREG gesetzt ist. Dafür stellt die Interrupt-Bibliothek in Anlehnung an die entsprechenden Maschinenbefehle zwei Makros zur Verfügung.
Das Makro
Das Makro
ISRs programmieren
Für die Programmierung von Interrupt Service Routinen stellt die Interrupt Bibliothek das Syntax
Variablenübergabe in ISRs
Sollen Variablen an eine ISR übergeben werden, so müssen diese vorher global mit dem Zusatz
|