labor1_aufgabe3.asm


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