ullihome.de

Ullihome.de

 

Experiment 1: I/O-Pins

Unser erstes Ziel wird es sein, eine LED anzuschalten. Dies wird unser "Hello World" auf mikrocontrolleanisch.

Die Hardware

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

Die Schnittstelle des USB-AVR-Labs

USBAVRLabConnectorDie 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:

" style="background-color:#FFDEAD;" Kabelfarbebraun rot orangegelbgrün blau violettgrau weiß schwarz
Pin Funktion
1 PB3
2 VCC
3 PD7
4 PD1
5 PB2
6 PD0
7 PB5
8 GND
9 PB4
10 GND


oder:

" style="background-color:#FFDEAD;" Funktion VCC GND PB2 PB3 PB4 PB5 PD0 PD1 PD7
Pin Kabelfarbe
2rot
8,10grau, schwarz
5grün
1braun
9weiß
7violett
6blau
4gelb
3orange




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)



[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<
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
}
}
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.

Avrtool

Versetzen Sie anschließend das Lab in den Bootmodus.

Nun sollten Sie folgendes sehen:


Avrtool1

Wählen Sie nun unter "Benutzerfirmware" den Button Avrtoolbtn.


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.


Avrtool2

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

 
Flattr this