AVR Tutorials/experiment1/de

Aus ullihome.de
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Experiment 1: I/O-Pins

Unser erstes Ziel wird es sein, eine LED anzuschalten. Dies wird unser „Hello World“ auf mikrocontrollerisch.

Die Hardware

Nun können wir unser erstes Experiment vorbereiten. Dazu benutzen wir die Steckplatine und stecken darauf eine LED und einen Widerstand mit 220 Ohm wie im Bild dargestellt.

Die Schnittstelle des USB-AVR-Labs

Die Beschriftungen stellen die Portpins des AVR dar, die mit den Pins der Schnittstelle verbunden sind. Wir werden uns die einzelnen Pins später noch genauer ansehen.

Belegung des Experimentierkabels:

Pin Kabelfarbe Funktion
1 braun PB3
2 rot VCC
3 orange PD7
4 gelb PD1
5 grün PB2
6 blau PD0
7 violett PB5
8 grau GND
9 weiß PB4
10 schwarz GND

oder:

Pin Funktion Kabelfarbe
2 VCC rot
8,10 GND grau, schwarz
5 PB2 grün
1 PB3 braun
9 PB4 weiß
7 PB5 violett
6 PD0 blau
4 PD1 gelb
3 PD7 orange


Vorerst interessieren uns PB3 und Masse (GND/Ground).

PB3 ist der 4. Pin des Ports B des Atmega8(8)(Informatiker zählen immer ab 0, also ist PB3 nicht der 3., sondern der 4. Pin des Ports B).


Verbinden Sie nun PB3 mit der Steckplatine mit dem Exerimentierkabel (braune Ader).

GND ist auf Pin 10 (schwarze Ader) oder Pin 8 (graue Ader)

[[Bild:]]

[fehlt leider noch]

braun


schwarz


Auf dem Bild sehen Sie, wie die Verbindungen auf dem Steckboard zustandekommen. Je fünf Kontakte einer vertikalen Reihe sind im Steckbrett leitend zu einer Kontaktgruppe verbunden. An den Seiten befinden sich 4 Kontaktgruppen, die horizontal verbunden sind. Kontaktgruppen, die in unserer Schaltung nicht verwendet werden, sind dunkel dargestellt.

Die heller dargestellten Verbindungen werden von unserer Schaltung belegt. PB3 ist nun also über den Widerstand mit der LED verbunden. Diese liegt mit der Kathode auf GND und mit der Anode am Widerstand.

Die Software

Nun zur Software.

Nun muss man PB3 „anschalten“. Wie bei fast allen anderen Mikrocontrollern auch können I/O-Pins am AVR-Mikrocontroller als Eingang oder Ausgang benutzt werden. Zunächst muss also festgelegt werden, dass PB3 ein Ausgang sein soll. Dies erreicht man über ein spezielles Register, das Datenrichtungsregister B DDRB (data direction register B).

Damit ein bestimmter Portpin als Ausgang fungiert, setzt man das entsprechende Bit des DDRB auf 1 (für jeden Pin von PortB gibt es in DDRB ein Bit). In C sieht das etwa so aus:

  DDRB = 0b00001000;

Gerade bei Ports ist die Binärdarstellung besonders übersichtlich. Man sieht sofort, welcher Pin eines Ports Eingang und welches Ausgang ist.

AVR verwendet in seinen Dokumentationen allerdings vielfach Schiebebefehle, eine in meinen Augen wenig intuitive Darstellung.

  DDRB = (1<<PB3);

Dabei ist << der Schiebe-Operator. Es wird also eine 1 um soviel Positionen nach links geschoben, wie dem Zahlenwert von PB3 (nämlich 3) entspricht. Die Definition PB3 steckt in der Bibliothek avr-libc.

Besser (weil einfacher) wäre es vermutlich gewesen, wenn der Hersteller PB3 (also das 4. Bit des Ports B) nicht als 3 definiert hätte, sondern als 0b00001000, dann nämlich lautete obige Zeile:

   DDRB = PB3;

Der Anwender sieht die Konstantendefinition nicht, sie steckt in der Bibliothek. Der Anwender bindet sie lediglich ein. Da aber nun der Hersteller diese eher ungünstige Darstellung gewählt hat, wird man sich als AVR-Programmierer wohl damit auseinandersetzen müssen.

Um das Ganze einsteigerfreundlich zu machen, haben wir die Bibliothek EbLib. Mit ihrer Hilfe können wir über

  PortB.DataDirection.Bit3 = 1;
oder
  PortB.DataDirection.Bit3 = DataDirectionOutput;

den Port als Ausgang definieren.

Damit ist der Portpin also als Ausgang konfiguriert. Nun müssen wir ihn nur noch anschalten. Das erfolgt in derselben Manier über das Register PortB.

Also:

  PortB.Output.Bit3 = 1;

Das Ganze schreibt man unter die Zeile „//your code goes here“. Das ist der frühestmögliche Zeitpunkt, an dem Anwender-Sourcecode ausgeführt werden sollte.

So zusammengesetzt müsste unser Sourcecode nun folgendermaßen aussehen:

#include "avrlab.h"
#include "gpio.h" 
//#define SIMULATION
int main(void)
{
  AvrLabInit();
  //your code goes here 
  PortB.DataDirection.Bit3 = DataDirectionOutput;
  PortB.Output.Bit3 = 1;
  while (1)
    {
      //or here
      AvrLabPoll(); //must be called at least every 40 ms
                    //muss mindestens alle 40 ms aufgerufen werden  
     }
}

[[Image:]]Diesen Code müssen wir nun noch compilieren.

Dazu klicken wir im ATVR-Stidio auf [F7] (Build Active Configuration)

Wenn alles richtig gelaufen ist, sollte unten im „Build“-Fenster stehen:

Build succeeded with 0 Warnings...

Das Programm in das USB-AVR-Lab übertragen

Unser Programm kann recht einfach mit dem USB-AVR-Lab-Tool in den Controller übertragen werden. Starten Sie dazu das USB-AVR-Lab-Tool.

Bild:avrtool.jpg

Versetzen Sie anschließend das Lab in den Bootmodus.

Nun sollten Sie folgendes sehen:


Bild:avrtool1.jpg

Wählen Sie nun unter „Benutzerfirmware“ den Button Bild:avrtoolbtn.jpg.


Suchen Sie im offenen Dialog den Ordner, in den Sie die Benutzerfirmware kopiert haben. Im Unterordner „default“ finden Sie eine .hex-Datei. Öffnen Sie diese, drücken Sie anschließend auf „Programmieren“ und danach auf „Start“.

Nun sollten Sie die LED leuchten sehen. Wenn nicht, sollten Sie zuerst die LED umpolen. Wenn das nicht hilft, nochmal jeden Schritt durchgehen.


Bild:avrtool2.jpg

Das Ergebnis sollte mit den beigefügten LEDs im Set folgendermaßen aussehen:

[[Image:]]

Persönliche Werkzeuge