1 | ;******************************************************************************
|
2 | ;*
|
3 | ;* Titel: LED Blinkprogramm
|
4 | ;* Autor: Rüdiger Kluge
|
5 | ;* Version: 01.01.0003
|
6 | ;* Build date: 22.12.08
|
7 | ;* Target: ATmega8
|
8 | ;*
|
9 | ;* Zweck:
|
10 | ;* Eine an PORTB, PB0 angeschlossene LED blinkt
|
11 | ;* Die Periode des Blinkens kann mit den Variablen
|
12 | ;* delay_0
|
13 | ;* delay_1
|
14 | ;* delay_2
|
15 | ;* eingestellt werden.
|
16 | ;*
|
17 | ;******************************************************************************
|
18 |
|
19 |
|
20 | ;******************************************************************************
|
21 | ;* Definitionen
|
22 | ;******************************************************************************
|
23 |
|
24 | ;.include "m8def.inc" ; Definitionen für ATmega8
|
25 | .def temp = r16 ; temp ist symbolischer Name für Register 16
|
26 | ; wird als temporäre Variable verwendet
|
27 | .def delay_0 = r17 ; delay_0 ist symbolischer Name für Register 17
|
28 | .def delay_1 = r18 ; delay_1 ist symbolischer Name für Register 18
|
29 | .def delay_2 = r19 ; delay_2 ist symbolischer Name für Register 19
|
30 | .equ LED_0 = ~0b00000001
|
31 | ; Konstante für LED_0, ~0b00000001 = 0b11111110
|
32 | ; ~ bedeutet Bitwise Not
|
33 | ; Die LED leuchtet, wenn der Ausgang PORTB = 0 ist
|
34 | ; da die LED über einen Widerstand an V++
|
35 | ; geschaltet ist.
|
36 |
|
37 | ;******************************************************************************
|
38 | ;* Programm Start nach Reset
|
39 | ;*
|
40 | ;* der Stackpointer wird initialisiert
|
41 | ;* RAMEND = $045F = 1119 beim ATmega8
|
42 | ;* Register werden gesetzt
|
43 | ;******************************************************************************
|
44 |
|
45 | RESET: ; hier startet der Code nach einem Reset
|
46 | ldi r16,high(RAMEND) ; $04 wird in Register 16 geladen
|
47 | out SPH,r16 ; SPH, oberes Byte des Stackpointers wird $04
|
48 | ldi r16,low(RAMEND) ; $5F wird in Register 16 geladen
|
49 | out SPL,r16 ; SPL, unteres Byte des Stackpointers wird $5F
|
50 | ser temp ; temp wird $FF = 255 (ser = Set Register)
|
51 | out DDRB,temp ; setzt alle PINs von PORTB als Ausgang
|
52 | ldi temp,LED_0 ; temp wird 0b11111110
|
53 |
|
54 |
|
55 | ;******************************************************************************
|
56 | ;* Hauptprogramm
|
57 | ;*
|
58 | ;* eine endlose Schleife
|
59 | ;******************************************************************************
|
60 |
|
61 | MAIN: ; hier startet das Hauptprogramm
|
62 | ldi delay_0, 0 ; delay_0 wird 0
|
63 | ldi delay_1, 0 ; delay_1 wird 0
|
64 | ldi delay_2, 4 ; delay_1 wird 4, delay_1 > 0 wählen
|
65 | out PORTC,temp ; PORTB, PIN0 wird gesetzt
|
66 | com temp ; Einerkomplement bilden
|
67 | ori temp,LED_0 ; temp wird temp ODER LED_0
|
68 | rcall SUB_DELAY ; Verzögerung, Sprung zu Unterprogramm
|
69 | rjmp MAIN ; springt zurück zu MAIN:
|
70 |
|
71 |
|
72 | ;*******************************************************************************
|
73 | ;* Unterprogramm SUB_DELAY
|
74 | ;*
|
75 | ;* erzeugt eine Verzögerung für das Blinken
|
76 | ;*
|
77 | ;*******************************************************************************
|
78 |
|
79 | SUB_DELAY: ; hier ist der Einsprung ins Unterprogramm
|
80 |
|
81 | ; hier beginnt die innere Schleife
|
82 | dec delay_0 ; delay_0 = delay_0 - 1
|
83 | brne SUB_DELAY ; wird ausgeführt, solange delay_0 nicht 0 ist
|
84 | ; springt zu SUB_DELAY:
|
85 |
|
86 | ; hier beginnt die mittlere Schleife
|
87 | dec delay_1 ; delay_1 = delay_1 - 1
|
88 | brne SUB_DELAY ; wird ausgeführt, solange delay_1 nicht 0 ist
|
89 | ; springt zu SUB_DELAY:
|
90 |
|
91 | ; hier beginnt die äussere Schleife
|
92 | dec delay_2 ; delay_2 = delay_2 - 1
|
93 | brne SUB_DELAY ; wird ausgeführt, solange delay_1 nicht 0 ist
|
94 | ; springt zu SUB_DELAY:
|
95 |
|
96 | ret ; Sprung zurück ins Hauptprogramm zur
|
97 | ; Instruktion nach
|
98 | ; rcall SUB_DELAY, also rjmp
|