AVR- Programmierung: Hallo Welt

Um dich mit Atmel Studio und dem Mikrocontroller vertraut zu machen, wirst du als erstes das "Hallo Welt" Programm in der Mikrocontroller- Programmierung anwenden. Dabei schaltest du eine LED eine Sekunde lang an und eine Sekunde lang aus.

 

 

 

 

Was benötigst du?

Um mit der ersten Übung zu beginnen benötigst du folgende Teile:

  • 1 x ATMEGA8 Mikrocontroller
  • 1 x AVRISP mkII (ISP- Programmiergerät)
  • 1 x ArduinoUno Board
  • 1 x Steckbrett
  • 1 x LED
  • 1 x Widerstand (200 Ohm)

 

 

Wie sieht der Schaltplan aus?

Zur Erinnerung ist hier nochmal die Pinbelegung vom ATMEGA8:

 

 

 

 

Und hier ist die Pinbelegung für das ISP- Programmiergerät. Die gleichnamigen Pins werden mit den Mikrocontroller verbunden. Also Pin SCK vom ISP- Programmiergerät wird mit Pin SCK vom Mikrocontroller verbunden usw. Das ISP- Programmiergerät benötigt auch die Versorgungsspannung am Mikrocontroller. Deswegen müssen auch VCC und GND mit dem Mikrocontroller verbunden werden.

 

 

 

 

Die LED wird an Pin PD0 an- und ausgeschaltet. Das Arduino Board verwendest du als Spannungsversorgung. Der Mikrocontroller benötigt eine stabile 5V Gleichspannung. Du kannst auch den Mikrocontroller mit einer anderen externen Spannungsversorgung betreiben. Dies bedeutet aber mehr Schaltungsaufwand und damit auch mehr Fehler, die sich am Anfang einschleichen können. Damit du dich hier erstmal auf das wesentliche konzentrieren kannst, wird in diesem Beispiel erstmal der Arduino als Spannungsversorgung verwendet, da er die 5 Volt stabil ausgeben kann. Hier die gesamte Schaltung:

 

 

 

 

Wenn die Schaltung aufgebaut ist kannst du den Arduino und das ISP- Programmiergerät an den PC anschließen. Wenn alles korrekt angeschlossen ist müsste nun die LED am ISP- Programmiergerät grün aufleuchten.

 

 

 

 

 

Atmel Studio bereit machen

Wenn bis hierhin alles geklappt hat, kannst du nun Atmel Studio 7 öffnen. Du landest nun auf die Startseite in der IDE.

 

 

 

 

Um ein neues Projekt anzulegen klicke auf File -> New -> Project.

Du kannst dir nun ein Projekttyp aussuchen.

 

 

 

 

Wir wollen das Programm in C programmieren, darum wählst du als Projekttyp "GCC C Executable Project".

Der Projektname heißt "Hallo_Welt".

 

 

 

 

Nun erscheint das "Device Selection" Fenster. Hier suchst du dein Mikrocontroller aus, welches du programmieren willst. Wir benutzen den ATMEGA8 also wähle "ATMEGA8" aus und klicke auf "OK".

Dein Projekt wird nun mit dem Standardcode erstellt.

Wir sagen nun unserer IDE welches ISP- Programmiergerät wir angeschlossen haben. Dafür klickst du auf den "No Tool" Button.

 

 

 

 

Wähle nun dein ISP- Programmiergerät aus.

 

 

 

 

Klicke nun auf den "Device Programming"- Button.

 

 

 

 

Wähle hier dein Tool, Device und das Interface ISP aus und klicke auf "Apply".

 

 

 

 

Wir lesen nun die Signatur des Mikrocontrollers aus. Klicke dazu auf "Read".

 

 

 

 

Du wirst nun die Taktfrequenz des Mikrocontrollers einstellen. Damit entscheidest du wie schnell dein Mikrocontroller arbeitet. Je höher die Taktfrequenz umso genauer und schneller kann der Mikrocontroller arbeiten. Der Takt besteht dabei aus abwechselndem LOW und HIGH- Pegel. Wenn man die Taktfrequenz nicht extern erzeugen will, kann man den internen RC- Oszillator des Mikrocontrollers nehmen. Damit ist eine Taktfrequenz von bis zu 8 MHz möglich. Ein frischer ATMEGA8 aus dem Werk hat die Werkseinstellung auf 1 MHz eingestellt. um die Taktfrequenz auf 8 MHz einzustellen klickst du auf "Fuses" und stellst die Fuse- Bits neu ein.

 

 

 

 

Unter "LOW.SUT_CKSEL" stellst du die Taktrate auf "Int. RC Osz. 8Mhz; Start-up time: 6 CK + 64 ms" und klickst anschließend auf "programm". Nun bist du mit der Einstellung der Taktfrequenz fertig und kannst das Fenster mit dem "close" button schließen.

 

 

 

 

Nun definieren wir die Taktrate nochmal in der Software auf 8MHz. Klicke dazu unter dem Reiter "Hallo_Welt"

auf "Toolchain". Wähle in der Tabelle "Symbols" aus. Und drücke unter "Define Symbols" auf den "Add Item" Button. 

 

 

 

 

Um die Taktfrequenz in der Software einzustellen gibst du hier "F_CPU='Taktfrequenz'UL" ein. Da wir 8 MHz haben wollen, geben wir hier "F_CPU=8000000UL" ein.

 

 

 

 

Glückwunsch! Du hast Atmel Studio richtig eingerichtet und kannst jetzt mit dem Quellcode unter "main.c" beginnen.

 

 

Der Code

#include <avr/io.h>

#include <util/delay.h>

 

int main(void)

{

    DDRD = 0b00000001;   //Setzt PD0 als Ausgang

 

    while (1) 

    {

PORTD = 0b00000001;      //Setzt Pin PD0 auf HIGH (LED an)

_delay_ms(1000);

PORTD = 0b00000000;      //Setzt Pin PD0 auf LOW (LED aus)

_delay_ms(1000);

    }

}

 

 

Nachdem der Quellcode steht, kannst du auf den "Start Debugging" Button klicken um den Mikrocontroller zu flashen. Die LED müsste jetzt im Sekundentakt an- und ausgehen.

 

 

 

 

Code- Review

Was hast du da jetzt überhaupt gemacht?

Hier erfährst du, was der Code macht und was das Wort flashen überhaupt bedeutet.

 

Was bedeutet "flashen"?

Der Mikrocontroller hat hauptsächlich 3 verschiedene Arten von Speicher.

 

  • Flash
  • SRAM
  • EEPROM

Der Flashspeicher ist der Programmspeicher. Hier wird dein Programm gespeichert nachdem es kompiliert, also in die Maschinensprache übersetzt, wurde. Deswegen nennt man auch das Hochladen des Programmes "flashen".

 

Der SRAM (Static Random Access Memory) ist ein flüchtiger Speicher. Das heißt nachdem die Verbindung zur Versorgungsspannung abbricht, geht der Inhalt des Speichers verloren. Hier werden zum Beispiel Variablen gespeichert, die der Mikrocontroller in einem Programmzyklus braucht.

 

Der EEPROM (Electrically Erasable Programmable Read Only Memory) ist auch ein nichtflüchtiger Speicher. Hier werden zum Beispiel Messwerte abgespeichert.

 

 

#include <avr/io.h>

 

Mit der Headerdatei "avr/io.h> kannst du die Register des Mikrocontrollers mit Befehlen wie "DDRD" und "PD0" richtig ansprechen. Wie man sich die Register vorstellen kann erkläre ich dir weiter unten.

 

#include <util/delay.h>

 

Mit dieser Headerdatei kannst du die "delay" - Methode verwenden. Die delay- Methode verwendest du im Code weiter unten.

 

int main(void)

{

}

 

Dein eigentliches Programm fängt immer mit der "int main()"- Methode an. In den geschweiften Klammern "{}" steht dann dein richtiger Code.

 

Was ist mit Register gemeint?

PIN PD0 kann nur die Werte "1" = HIGH und "0" = LOW annehmen. Also kann Pin PD0 nur zwei Zustände darstellen. Diese Darstellung von zwei Zuständen stellen einen Bit dar. Jetzt gibt es nicht PD0 alleine, sondern noch PD1 bis PD7. Diese Gruppierung aus 8 Bits stellen ein Register dar.

Register PD mit Bit PD0 auf "1" gesetzt
Register PD mit Bit PD0 auf "1" gesetzt

 

DDRD = 0b00000001; 

Das erste Element im Register "DDRD" wird auf 1 gesetzt. Das heißt, dass Pin PD0 als Ausgang definiert wird und nun die Werte "0" und "1" annehmen kann.

 

 

while (1) 

    {

         BEFEHLE;

    }

 

Die while - Schleife heißt soviel wie: "Führe den Code in den geschweiften Klammern aus (BEFEHLE;), solange die Aussage in den normalen Klammern 1 ist." Da hier in den normalen Klammern eine "1" steht heißt das soviel wie: "Führe den Befehl unendlich lange aus."

 

PORTD = 0b00000001;

 

Hier wird Pin "PD0" auf 1 gesetzt. Das heißt, dass an Pin PD0 5 Volt anliegen, wodurch die LED leuchtet. 

 

_delay_ms(1000);

 

Mit der "_delay_ms"- Methode tut der Mikrocontroller eine gewisse Zeit lang nichts. Da in den Klammern "1000" steht, tut der Mikrocontroller 1000 Millisekunden = 1 Sekunde lang nichts.

 

PORTD = 0b00000000;

 

Pin PD0 wird auf "0" gesetzt. Die LED geht aus.

Danach wird wieder eine Sekunde gewartet und das Programm geht oben in der while- Schleife wieder weiter.

 

 

Glückwunsch! Du hast nun den Mikrocontroller das erste mal programmiert. Du weißt nun alles um deinen Mikrocontroller für das flashen vorzubereiten und kannst die Pins als Output definieren, sowie Aktoren an den Pins an und ausschalten.

 

 

 

 

Wenn du hier irgendetwas vermisst, bessere Ansätze hast oder dir etwas nicht klar ist, zögere nicht einen Kommentar zu hinterlassen.

Kommentar schreiben

Kommentare: 0