;****************************************************************************** ;* ;* 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