AVR Assembler: LED blinkt

From ConeleK Electronic Wiki
Jump to: navigation, search

Einleitung

Inhalt
Mikrocontroller Modul ATmega8 MC-AVR8 [1]
Der komplette Versuchsaufbau
Mikrocontroller Modul ATmega8 MC-AVR8 [2]

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.

  • AVRISP mk2 Programmer Dokumentation [5]
  • STK500 Starter Kit Dokumentation [6]

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


Ledblink als C-Programm

Inhalt

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

Inhalt
  • 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

Links extern

Inhalt
  • Atmel MCU Technical Support Center [9]
  • AVR Assembler, Befehlssatz [10] (in der AVR Studio Hilfe enthalten)
  • Datenblätter
    • ATmega8 Datenblatt [11]
    • ATmega48_88_168 Datenblatt [12]
    • ATmega48P_88P_168P_328P Datenblatt [13]
    • ATTiny28 Datenblatt [14]
    • ATTiny48_88 Datenblatt [15]
  • Entwicklungsumgebung
    • AVR Studio Download und Dokumentation [16]]
    • AVRISP mk2 Programmer Dokumentation [17]

Bezugsquellen

Inhalt
  • Mikrocontroller Modul ATmega8 MC-AVR8 [18]



© R.Kluge Änderungen und Irrtümer vorbehalten