AVR Assembler: LED blinkt
Einleitung

Dieser Artikel beschreibt ein kleines Assembler Programm für den AVR ATmega8 Mikrocontroller. Ein einzelnes LED wird mit diesem Programm zum Blinken gebracht.
Beim Einstieg in die Entwicklung von Elektronik mit Mikrocontrollern ist eine gewisse Hürde, dass sowohl Software als auch HW entwickelt werden muss. Um den Einstieg zu erleichtern, wurde das Mikrocontroller Modul für den ATmega8 MC-AVR8 [3] rechts im Bild entwickelt. Dieses gibt es als:
- Bausatz
Das Modul ist ausführlich ein einem gesonderten Artikel beschrieben. Wer den Bausatz aufbaut, wird in der Regel einen schnellen Erfolg haben.
Wer selbst etwas bauen möchte, kann sich die beiden folgenden Artikel anschauen:
Nur nur muss der Mikrocontroller zum Leben erweckt werden. Dazu brauch man ein Programm. Das folgende kleine Programm soll helfen, auch die SW-Hürde zu meistern. Um SW für einen Mikrocontroller zu schreiben, braucht man eine SW-Entwicklungsumgebung. Das vorliegende Programm wurde mit dem kostenlosen AVR Studio (leider nur für Windows) geschrieben:
- AVR Studio Download und Dokumentation [4]]
Wie man damit ein Programm erstellt, wir in Programmierung des MC-AVR8 mit AVR-Studio beschrieben. In diesem Artikel ist das Resultat in Form des Quellcodes zu sehen.
Wer erst einmal wissen will, ob seine HW funktioniert, kann entweder einen fertig programmierten Mikrokontroller nehmen, oder ihn selbst programmieren. Hierzu benötigt man ein Programmiergerät wie z.B.
Die Programmier-SW für den Programmer ist in dem AVR-Studio enthalten. Hiermit kann man den sogenannten HEX-Code über ein ISP-Interface (In-Circuit-Programmer) in den Mikrocontroller laden.
Eine weitere Möglichkeit wie man den Assemblercode erstellen, assemblieren und in den Mikrocontroller laden kann ist in folgendem Artikel beschrieben:
Der HEX-Code und der Quellcode (Sourcecode) kann hier herunter geladen werden:
- Ledblink.asm Sourcecode für das Programm "blinkende LED"
- Ledblink.hex .hex File , Intel intellec 8/MDS (Intel HEX Format)
Als weitere Dokumente auf dem PC bzw. im Net sollte man zum Nachschlagen folgende Unterlagen zur Hand haben:
- ATmega8 Datenblatt [7] (bzw. des eingesetzten Mikrocontrollers)
- AVR Assembler, Befehlssatz [8] (in der AVR Studio Hilfe enthalten)
Inhalt
Contents
Ledblink als C-Programm
Der Mikrocontroller kann auch in der Sprache C programmiert werden. Entsprechenden Quelltext und eine HEX-Datei finden Sie in einem gesonderten Artikel.
Assembler Quellcode
;******************************************************************************
;*
;* Titel: LED Blinkprogramm
;* Autor: Rüdiger Kluge
;* Version: 01.01.0003
;* Build date: 22.12.08
;* Target: ATmega8
;*
;* Zweck:
;* Eine an PORTB, PB0 angeschlossene LED blinkt
;* Die Periode des Blinkens kann mit den Variablen
;* delay_0
;* delay_1
;* delay_2
;* eingestellt werden.
;*
;******************************************************************************
;******************************************************************************
;* Definitionen
;******************************************************************************
.include "m8def.inc" ; Definitionen für ATmega8
.def temp = r16 ; temp ist symbolischer Name für Register 16
; wird als temporäre Variable verwendet
.def delay_0 = r17 ; delay_0 ist symbolischer Name für Register 17
.def delay_1 = r18 ; delay_1 ist symbolischer Name für Register 18
.def delay_2 = r19 ; delay_2 ist symbolischer Name für Register 19
.equ LED_0 = ~0b00000001
; Konstante für LED_0, ~0b00000001 = 0b11111110
; ~ bedeutet Bitwise Not
; Die LED leuchtet, wenn der Ausgang PORTB = 0 ist
; da die LED über einen Widerstand an V++
; geschaltet ist.
;******************************************************************************
;* Programm Start nach Reset
;*
;* der Stackpointer wird initialisiert
;* RAMEND = $045F = 1119 beim ATmega8
;* Register werden gesetzt
;******************************************************************************
RESET: ; hier startet der Code nach einem Reset
ldi r16,high(RAMEND) ; $04 wird in Register 16 geladen
out SPH,r16 ; SPH, oberes Byte des Stackpointers wird $04
ldi r16,low(RAMEND) ; $5F wird in Register 16 geladen
out SPL,r16 ; SPL, unteres Byte des Stackpointers wird $5F
ser temp ; temp wird $FF = 255 (ser = Set Register)
out DDRB,temp ; setzt alle PINs von PORTB als Ausgang
ldi temp,LED_0 ; temp wird 0b11111110
;******************************************************************************
;* Hauptprogramm
;*
;* eine endlose Schleife
;******************************************************************************
MAIN: ; hier startet das Hauptprogramm
ldi delay_0, 0 ; delay_0 wird 0
ldi delay_1, 0 ; delay_1 wird 0
ldi delay_2, 4 ; delay_1 wird 4, delay_1 > 0 wählen
out PORTB,temp ; PORTB, PIN0 wird gesetzt
com temp ; Einerkomplement bilden
ori temp,LED_0 ; temp wird temp ODER LED_0
rcall SUB_DELAY ; Verzögerung, Sprung zu Unterprogramm
rjmp MAIN ; springt zurück zu MAIN:
;*******************************************************************************
;* Unterprogramm SUB_DELAY
;*
;* erzeugt eine Verzögerung für das Blinken
;*
;*******************************************************************************
SUB_DELAY: ; hier ist der Einsprung ins Unterprogramm
; hier beginnt die innere Schleife
dec delay_0 ; delay_0 = delay_0 - 1
brne SUB_DELAY ; wird ausgeführt, solange delay_0 nicht 0 ist
; springt zu SUB_DELAY:
; hier beginnt die mittlere Schleife
dec delay_1 ; delay_1 = delay_1 - 1
brne SUB_DELAY ; wird ausgeführt, solange delay_1 nicht 0 ist
; springt zu SUB_DELAY:
; hier beginnt die äussere Schleife
dec delay_2 ; delay_2 = delay_2 - 1
brne SUB_DELAY ; wird ausgeführt, solange delay_1 nicht 0 ist
; springt zu SUB_DELAY:
ret ; Sprung zurück ins Hauptprogramm zur
; Instruktion nach
; rcall SUB_DELAY, also rjmp
Downloads
- Ledblink.asm Sourcecode für das Programm "blinkende LED"
- Ledblink.hex .hex File , Intel intellec 8/MDS (Intel HEX Format)
Weitere Artikel in diesem Wiki
- AVR C: LED blinkt
- AVR C: Softwareentwicklung mit der Eclipse IDE
- Fuses ATmega8
- ISP-Interface für den AVR ATMega Microcontroller
- Mikrocontroller Minimalsystem mit AVR ATMega8
- Mikrocontroller Modul ATmega8 MC-AVR8
- Programmieren mit dem MC-AVR8 und avrdude
Links extern
- Atmel MCU Technical Support Center [9]
- AVR Assembler, Befehlssatz [10] (in der AVR Studio Hilfe enthalten)
- Datenblätter
- Entwicklungsumgebung
Bezugsquellen
- Mikrocontroller Modul ATmega8 MC-AVR8 [18]
© R.Kluge Änderungen und Irrtümer vorbehalten