1 | .nolist ; include-file nicht in Listing
|
2 | .include "m128def.inc" ; Definitionen für ATmega 128 einbinden
|
3 |
|
4 |
|
5 | .list ; Listing erstellen
|
6 |
|
7 |
|
8 | .def akku = r16 ; r16 als Rechenregister "akku" definieren
|
9 | .def MyCounter1 = r25 ; r25 als Zaehler 1 definieren
|
10 | .def MyCounter2 = r26 ; r26 als Zaehler 2 definieren
|
11 | .def key_old = r3 ; Alter Tastenzustand
|
12 | .def key_now = r4 ; Momentaner Tastenzustand
|
13 | .def templ = r17 ; Zwischenspeicher 1
|
14 | .def temp2 = r18 ; Zwischenspeicher 2
|
15 |
|
16 | .equ key_pin = PINA ; Tasterpins
|
17 | .equ key_port = PORTA ; Datenregister (Taster)
|
18 | .equ key_ddr = DDRA ; Datenrichtungsregister (Taster)
|
19 |
|
20 | .equ led_port = PORTB ; Datenregister (LED)
|
21 | .equ led_ddr = DDRB ; Datenrichtungsregister (LED)
|
22 |
|
23 |
|
24 | .cseg
|
25 |
|
26 | ;-------Adress Tabelle für Interrupt-Vektoren-----------------------------
|
27 |
|
28 | .org 0x0000 ; Interrupt-Vektor für RESET
|
29 | rjmp Init
|
30 |
|
31 | .org 0x0002 ; Interrupt-Vektor für externen Interrupt 1
|
32 | rjmp Extint1
|
33 |
|
34 | .org 0x0020 ; Interrupt-Vektor für Timer/Counter-0-Interrupt
|
35 | rjmp TC0int
|
36 |
|
37 | .org 0x0045 ; Ende der Interrupt-Vektor-Tabelle
|
38 |
|
39 | ;-------Macros-------------------------------------------------------------
|
40 |
|
41 | ; Übertrage Bit zu Pin (Out)
|
42 | .macro Bit2Pin
|
43 | SBRC @0,@1 ; Überspringe nächsten Befehl wenn RegBit = 0
|
44 | rjmp SetPin
|
45 | ClrPin:
|
46 | cbi @2,@3 ; Lösche Pin (@3) im I/O-Reg. (@2)
|
47 | rjmp Bin2Pinx
|
48 | SetPin:
|
49 | sbi @2,@3 ; Setze Pin (@3) im I/O-Reg. (@2)
|
50 | Bit2Pinx:
|
51 | .endmacro
|
52 |
|
53 |
|
54 | ; Übertrage Pin auf Bit (In)
|
55 | .macro Pin2Bit
|
56 | SBIS @0,@1 ; Überspringe nächsten Befehl wenn Pin (@1) in I/O-Reg. (@1) gesetzt
|
57 | rjmp SetBit
|
58 | ClrBit:
|
59 | CBR @2,@3 ; Lösche Bit (@3) in Register (@2)
|
60 | rjmp Pin2Bitx
|
61 | SetBit:
|
62 | LDI @2,@3 ; Setze Bit (@3) in Register (@2)
|
63 | Pin2Bitx:
|
64 | .endmacro
|
65 |
|
66 | ; Pin Toggeln
|
67 | .macro TogPin
|
68 | SBIS @0,@1 ; Wenn Bit (@1) in I/O-Reg. (@2) gesetzt, überspringe nächsten Befehl
|
69 | rjmp SetPin
|
70 | ClrPin:
|
71 | cbi @0,@1
|
72 | rjmp TogPinx
|
73 | SetPin:
|
74 | SBI @0,@1
|
75 | TogPinx:
|
76 | .endmacro
|
77 |
|
78 | .macro TogPinOnce
|
79 | SBIS @2,@3 ; Taster immer noch gedrückt (@2@3)
|
80 | rjmp TogPinx ; Wenn ja: Lass alles wie es ist
|
81 | Toggler: ; Wenn nein, Toggle the Pin
|
82 | SBIS @0,@1 ; Wenn Bit (@1) in I/O-Reg. (@2) gesetzt, überspringe nächsten Befehl
|
83 | rjmp SetPin
|
84 | ClrPin:
|
85 | cbi @0,@1
|
86 | rjmp TogPinx
|
87 | SetPin:
|
88 | SBI @0,@1
|
89 | TogPinx:
|
90 | .endmacro
|
91 |
|
92 |
|
93 | ;--------------------------------------------------------------------------
|
94 |
|
95 | Init: ; Beginn des Hauptprogrammes
|
96 |
|
97 | ldi r16,LOW(RAMEND) ; Stack Initialisieren
|
98 | out SPL,r16
|
99 | ldi r16,HIGH(RAMEND)
|
100 | out SPH,r16
|
101 |
|
102 | ser akku ; Alle Bits in Akku setzen
|
103 | out DDRB,akku ; PORTB als Ausgang (alle Bits 1)
|
104 |
|
105 | ldi akku,0b00000001
|
106 | out TCCR0,akku ; Übertrage auf Timer Counter Control Register
|
107 |
|
108 | ldi akku,0b00000001 ; Bit-Zahl für TOIE0 laden (Interrupt Ein/Aus)
|
109 | out TIMSK,akku ; Übertragen
|
110 |
|
111 | sei
|
112 |
|
113 |
|
114 |
|
115 | Prog:
|
116 |
|
117 | in akku,TIFR
|
118 | SBRC akku,0
|
119 | rcall Taster
|
120 |
|
121 | rjmp Prog
|
122 |
|
123 |
|
124 | ;-------Unterprogramme----------------------------------------------------
|
125 |
|
126 |
|
127 | Extint1: ; ISR für externen Interrupt 1
|
128 |
|
129 | reti
|
130 |
|
131 |
|
132 | Taster: ; Tastaturabfrage
|
133 |
|
134 | in key_now, key_pin ; key_now(r4)=aktueller Tasterzustand
|
135 | mov templ, key_now ; key_now zwischenspeichern
|
136 | eor key_now, key_old ; aktueller_zustand xor alter_zustand
|
137 | mov key_old, templ
|
138 |
|
139 | breq Exit ; Abfrage beenden wenn keine Taste gedrückt wurde
|
140 | ; (bezieht sich auf das xor => kein 0,1 übergang) => Z-Bit nicht gesetzt => Abfrage Ende
|
141 |
|
142 | and templ, key_now ; Mache weiter wenn Taste gedrückt war (in key_now
|
143 | brne Exit ; steht xor ergebnis in templ altes key_now) - überspringen wenn nicht
|
144 | in templ,led_port ; Aktuellen Led Zustand zwischenspeichern
|
145 | mov temp2,key_now ; Aktuellen Tasterzustand (nach xor) zwischenspeichern
|
146 | com temp2 ; Tasterzustand umdrehen (umgekehrte Logik!)
|
147 | eor templ,key_now ; Wenn Taste gedrückt => Zustand der LED Toggeln
|
148 | out led_port,templ ; Ergebnis xor steht in templ => Ausgeben auf LED
|
149 | Exit: ; Toggelt die entsprechende; Exit macht nüscht
|
150 | ret ; auser beenden
|
151 |
|
152 |
|
153 | TC0int: ; ISR für Timer/Counter 1 Interrupt
|
154 | reti
|
155 |
|
156 |
|
157 |
|
158 |
|
159 |
|
160 | .exit
|