Hallo!
Jetzt, da Bascom installiert ist, der Programmer funktioniert und geklärt wurde, wie der AVR-µC angeschlossen werden muss, könnte man schon mal mit einer kleinen "Hallo Welt"-Anwendung los legen.
Ich möchte dich aber vorher nochmal kurz mit ein wenig Theorie langweilen. ;-) Es geht darum, wie so ein AVR-Controller die Aussenwelt sieht und wie man diese beeinflussen kann. Es geht darum, wie man einen Pin als Eingang oder als Ausgang verwenden kann.
In den AVR-µControllern wird jede Information im Speicher abgelegt. Ob an einem Pin ein Signal anliegt oder ob ein Analog-Digital-Wandler herausfinden soll, wieviel Volt an einem Pin anliegen -- alles steht im Speicher. Man kann diesen Speicher auslesen und man kann in diesen Speicher schreiben. Um sich die Adressen der Speicherbereiche nicht merken zu müssen, wurden den einzelnen Speicherbereichen Namen gegeben. Diese Speicherbereiche nennt man REGISTER. Ein Register enthält acht einzelne Ja/Nein-Werte (Bit). Deshalb nennt man die AVR auch 8-Bit Mikrocontroller.
8 Bit = 1 Byte = 1 Register
Und auch für die Pins gibt es solche Register. Es wurden immer bis zu acht Pins zusammengelegt und können über ein dafür festgelegtes Register angesprochen werden. Diese Register nennt man I/O-Register (Input/Output).
Der ATmega8 hat drei solche Register die für die Pins zuständig sind. Das sind PORTB, PORTC und PORTD. Und das muss man sich noch merken: Wenn man aus diesen I/O-Registern etwas lesen möchte, dann spricht man sie nicht mit PORTx, sondern mit PINx an. PINB, PINC und PIND.
In diesem Bild wird statt PORT/PIN einfach "P" verwendet.
Die einzelnen Pins werden mit 0 beginnend numeriert. So ist PORTB.0
die Adresse mit der man den Status des Pins PB0 setzen kann. Und mit PINB.0
liest man aus, ob am Pin PB0 ein HIGH oder LOW anliegt. Ach ja, das hätte ich fast vergessen: Wenn ich von HIGH und LOW schreibe, dann meine ich damit, dass entweder Spannung an den Pin gelegt wird (HIGH) oder der Pin gegen GND gezogen wird (LOW).
Wenn ich in Bascom PB0 auf HIGH setzen möchte, dann schreibt man:
PORTB.0 = 1
Mit diesem Befehl setzt man PB0 auf LOW:
PORTB.0 = 0
Und wenn ich z.B. PB1 auf HIGH setzen möchte, wenn PB0 LOW ist und umgekehrt, dann sieht das so aus:
IF PINB.0 = 0 THEN
PORTB.1 = 1
ELSE
PORTB.1 = 0
END IF
Bevor man allerdings mit einem der Pins arbeitet, muss man festlegen, welche Pins eines PORTs Eingänge und welche Ausgänge sind. Wenn man nichts verändert, dann sind nach dem Start des Programms alle Pins Eingänge.
Ob ein Pin des PORTB ein Eingang oder ein Ausgang ist, wird im Register DDRB gespeichert. Jeder Pin entspricht einem Bit dieses Registers. So gibt es für den ATmega8 noch die Register DDRC und DDRD in denen die Ausrichtungen der Pins gespeichert werden. DDR steht hier für "Data Direction Register".
Diese Anweisung kennzeichnet PB1 und PB2 als Ausgänge. Alle anderen Pins bleiben Eingänge:
DDRB = &B00000110
Erst jetzt kann mit PORTB.1 = 1
der Pin PB1 auf HIGH gesetzt werden.
Es gibt noch eine andere Art, einen Pin als Eingang oder als Ausgang zu kennzeichnen.
CONFIG PINB.0 = INPUT
CONFIG PORTB.1 = OUTPUT
CONFIG PORTB.2 = OUTPUT
Manchmal ist es einfacher, wenn man es so macht und manchmal ist es einfacher, wenn man direkt in das DDRx-Register schreibt. Das muss man selber entscheiden.
Mit diesem Wissen könnte man also schon eine LED anschließen und ein- bzw. ausschalten. Jetzt fehlt uns nur noch das Grundgerüst des Programms.
Minimales Grundgerüst eines Programms:
$regfile = "M8def.dat" 'es handelt sich um einen ATmega8
$crystal = 1000000 'der eingebauter RC-Oszillator läuft mit 1 Mhz
$hwstack = 100 'im Speicher werden für den Hardware-Stack 100 Byte reserviert
$swstack = 100 'im Speicher werden für den Software-Stack 100 Byte reserviert
$framesize = 100 'im Speicher werden für den Frame 100 Byte reserviert
Ddrb = &B00000010 'PB1 ist Ausgang. Die anderen Pins sind Eingänge
Portb.1 = 1 'Signal auf PB1 einschalten (HIGH)
End 'Ende des Programms
Dieser Code schaltet PB1 auf HIGH. Damit könnte an PB1 eine LED angeschlossen werden und sie würde leuchten.
Ein Pin des ATmega8 kann mit bis zu 40 mA belastet werden. Allerdings darf die Gesamtbelastung des ATmega8 (je nach Gehäusetyp) nicht über 200 mA steigen. Es gibt da auch noch Unterschiede zwischen den einzelnen Anschlüssen. Wer es genau wissen will, sollte ins Datenblatt schauen. Eine LED würde also leuchten. Aber um den µC zu schonen, sollte man einen Pin nicht immer unter Vollast betreiben. Wenn schon direkt eine LED angeschlossen werden soll, dann bitte eine Low Current LED.
Im nächsten Beitrag geht es mit diesem "Hallo Welt"-Programm weiter. Dann erkläre ich wie man das Programm eingibt, abspeichert, kompiliert und zum µC überträgt. Ich werde dann auch genauer auf das Programm-Grundgerüst eingehen und einen Schaltplan für den Anschluss einer LED zeichnen.
mfg Gerold :-)
Den zugehörigen Original-Beitrag findest du im Loetstelle-Forum.
Ich programmiere Progressive Web Applications, Mobile Apps, Desktop-Programme und noch vieles mehr. Falls es dich interessiert, findest du mehr Informationen darüber auf meiner Business-Website.