1 | ####################################
|
2 |
|
3 | .ORG 0x0000
|
4 | rjmp start ;springe zu start
|
5 | .ORG 0x0002
|
6 | rjmp zaehlen ;springe zu zaehlen
|
7 | .ORG 0x0004
|
8 | rjmp null ;springe zu null
|
9 |
|
10 | ####################################
|
11 |
|
12 | ASM_Code:
|
13 |
|
14 |
|
15 |
|
16 | .include "m32def.inc"
|
17 |
|
18 |
|
19 | .DSEG ; definiert den Start eines Datensegmentes
|
20 |
|
21 | zahl: .BYTE 1 ; Reservierung von einen Byte
|
22 |
|
23 | .CSEG ; Datensegment definierung schließen
|
24 |
|
25 |
|
26 | .ORG 0x0000
|
27 | rjmp start
|
28 | .ORG 0x0002
|
29 | rjmp zaehlen
|
30 | .ORG 0x0004
|
31 | rjmp null
|
32 |
|
33 | start:
|
34 | ldi r16,LOW(RAMEND) ; ldi = Lade Register mit Wert; LOW-Byte der obersten RAM-Adresse
|
35 | out SPL,r16 ; kopiere Register r16 in Stack-Pointer-Register LOW = SPL
|
36 | ldi r16,HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
|
37 | out SPH,r16 ; kopiere Register r16 Stack-Pointer-Register HIGH = SPH
|
38 |
|
39 | ldi r16,0b00001011 ; Lade 00001011 in das Register r16
|
40 | out MCUCR,r16 ; --> Eine steigende Flanke am INT0 Pin löst Interrupt aus (Seite66)
|
41 | ldi r16,0b11000000 ; Lade 11000000 in das Register r16
|
42 | out gicr,r16 ; --> Externer Interrupt 1 Freigabe für INT1 und INT0 (Seite 69)
|
43 |
|
44 | cbi DDRD,2 ; Bit in I/O-Register löschen (auf 0 setzen), PORT D / PIN 2
|
45 | cbi DDRD,3 ; Bit in I/O-Register löschen (auf 0 setzen), PORT D / PIN 3
|
46 | sbi PORTD,2 ; Bit in I/O-Register setzen (auf 1 setzen), PORT D / PIN 2
|
47 | sbi PORTD,3 ; Bit in I/O-Register setzen (auf 1 setzen), PORT D / PIN 3
|
48 |
|
49 | ldi r16, 0xFF ; Lade 11111111 in das Register r16
|
50 | out DDRA,r16 ; kopiere register 16 nach PORT DDRA ??richtig??
|
51 |
|
52 | ldi r20,0 ; Lade 00000000 in das Register r20
|
53 |
|
54 | sei ; interrupt aktivieren
|
55 |
|
56 | los: rjmp los ; Springe in der Schleife los hin und her
|
57 |
|
58 | zaehlen:
|
59 | push r20 ; Speichere register R20 in den Stack
|
60 | in r20,SREG ; Status Register in R20 kopieren
|
61 | push r20 ; Speichere register R20 in den Stack
|
62 | lds r20,ZAHL ; Lade Register r20 mit Byte (zahl) aus Datenspeicher
|
63 | inc r20 ; R20 Inkrementierung
|
64 | out PORTA,r20 ; kopiere Register R20 in den PORT A
|
65 | sts ZAHL,r20 ; Speichere Register R20 in den Datenspeicher (ZAHL)
|
66 | pop r20 ; LADE vom Stapel(stack) in Register R20
|
67 | out SREG,r20 ; kopiere Register r20 in das Status Register
|
68 | pop r20 ; LADE vom Stapel in Register R20
|
69 | reti ; Rücksprung von Interrupt - Routine
|
70 |
|
71 | null:
|
72 | push r20 ; Speichere register R20 in den Stack
|
73 | in r20,SREG ; Status Register in R20 kopieren
|
74 | push r20 ; Speichere register R20 in den Stack
|
75 | ldi r20,0 ; Lade 0 in das Register R20
|
76 | out PORTA,r20 ; kopiere das Register R20 in den PORT A
|
77 | sts ZAHL,r20 ; Speichere Register R20 in den Datenspeicher (ZAHL)
|
78 | pop r20 ; LADE vom Stapel in Register R20
|
79 | out SREG, r20 ; kopiere Register R20 in das Status Register
|
80 | pop r20 ; Lade vom Stapel in Register R20
|
81 | reti ; Rücksprung von Interrupt - Routine
|