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
|