aufgabe4.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  msTimer    = r23    ; r23 als Zeit-Einstellungsregister
10
      ; r24 als Zählregister
11
  .def  templ    = r17    ; Zwischenspeicher 1
12
  .def  temp2    = r18    ; Zwischenspeicher 2
13
  .def  PulsCounter  = r19
14
  .equ  key_pin    = PINA    ; Tasterpins
15
  .equ  key_port  = PORTA    ; Datenregister (Taster)
16
  .equ  key_ddr    = DDRA    ; Datenrichtungsregister (Taster)
17
18
  .equ  led_port  = PORTB    ; Datenregister (LED)
19
  .equ  led_pin    = PINB
20
  .equ  led_ddr    = DDRB    ; Datenrichtungsregister (LED)
21
22
23
  .cseg
24
25
;-------Adress Tabelle für Interrupt-Vektoren-----------------------------
26
27
  .org    0x0000        ; Interrupt-Vektor für RESET
28
  rjmp    Init
29
  
30
  .org    0x0045        ; Ende der Interrupt-Vektor-Tabelle
31
32
;-------Macros-------------------------------------------------------------
33
; Pin Toggeln
34
.macro TogPin
35
  SBIS    @0,@1        ; Wenn Bit (@1) in I/O-Reg. (@2) gesetzt, überspringe nächsten Befehl
36
  rjmp    SetPin
37
ClrPin:
38
  cbi      @0,@1
39
  rjmp    TogPinx
40
SetPin:
41
  SBI      @0,@1
42
TogPinx:
43
.endmacro
44
45
;-------Hauptprogramm-----------------------------------------------------  
46
Init:
47
; Stack Initialisieren
48
  ldi      r16,LOW(RAMEND)    ; Stackende  
49
  out      SPL,r16
50
  ldi      r16,HIGH(RAMEND)  ; Stackanfang
51
  out      SPH,r16
52
; Timer Initialisieren  
53
  rcall    TimerInit
54
; IO Initialisieren
55
  ser      akku      ; Alle Bits in Akku setzen
56
  out      DDRB,akku      ; PORTB als Ausgang (alle Bits 1)
57
; Sonstiges
58
  ser      PulsCounter    ; Puls Counter vorladen (invertierte Logik!)
59
60
Prog:                ; Hauptprogramm
61
  in      akku,TIFR      ; TIFR in akku laden (akku=TIFR)
62
  SBRC    akku,4        ; Auf Compare Prüfen
63
  rcall    Count        ; Bei Compare anspringen
64
65
66
  rjmp    Prog        ; Marke Endlos
67
68
;-------Unterprogramme----------------------------------------------------
69
70
TimerInit:
71
  
72
;To do a 16-bit write, the high byte must be written before the low byte.
73
  ldi      templ,0        ; High mit 0 laden
74
  out      OCR1AH,templ
75
  
76
  ldi      msTimer,0x0099    ; Low mit 0x99=153 ladem
77
  out      OCR1AL,msTimer
78
79
  ldi      templ,0x0      ; Timer resetten (just in case)
80
  out      TCNT1H,templ
81
82
  ldi      templ,0x0      
83
  out      TCNT1L,templ    
84
85
  ldi      akku,(1<<OCIE1A)  ; Compare Interrupt aktivieren
86
  out      TIMSK,akku
87
88
  ldi      akku,(1<<WGM12)|(1<<CS12)  ; Compare Interrupt aktivieren und Prescaler
89
  out      TCCR1B,akku      ; Übertrage auf Timer Counter Control Register
90
  ret
91
92
93
Count:
94
  out      led_port,PulsCounter
95
  inc      PulsCounter
96
  
97
  breq    CountExit
98
  ldi      PulsCounter,0xFF
99
100
CountExit:
101
  in      akku,TIFR
102
  cbr      akku,~(1<<OCF1A)
103
  out      TIFR,akku
104
  ret
105
106
.exit