1 | ;-------------------------------------------------------------------------------
|
2 | ; Einbinden der controllerspezifischen Definitionsdatei
|
3 | ;-------------------------------------------------------------------------------
|
4 | .NOLIST ;List-Output ausschalten
|
5 | .INCLUDE "m328Pdef.inc" ;AVR-Definitionsdatei einbinden
|
6 | .LIST ;List-Output wieder einschalten
|
7 |
|
8 | ;-------------------------------------------------------------------------------
|
9 | ; Organisation des Datenspeichers (SRAM)
|
10 | ;-------------------------------------------------------------------------------
|
11 | ;.DSEG ;was ab hier folgt kommt in den SRAM-Speicher
|
12 | ;TAB1: .BYTE 100 ;100 Byte grosse Tabelle im Datensegment
|
13 |
|
14 | ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
15 | ; Programmspeicher (FLASH) Programmstart nach RESET ab Adr. 0x0000
|
16 | ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
17 | .CSEG ;was ab hier folgt kommt in den FLASH-Speicher
|
18 | .ORG 0x0000 ;Programm beginnt an der FLASH-Adresse 0x0000
|
19 | RESET1: rjmp INIT ;springe nach INIT (ueberspringe ISR Vektoren)
|
20 |
|
21 | ;-------------------------------------------------------------------------------
|
22 | ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS)
|
23 | ;-------------------------------------------------------------------------------
|
24 | ;Vektortabelle (im Flash-Speicher)
|
25 | ;.ORG INT0addr ;interner Vektor fuer INT0 (alt.: .ORG 0x0002)
|
26 | ; rjmp ISR_I0 ;Springe zur ISR von INT0
|
27 |
|
28 | ;-------------------------------------------------------------------------------
|
29 | ; Initialisierungen und eigene Definitionen
|
30 | ;-------------------------------------------------------------------------------
|
31 | .ORG INT_VECTORS_SIZE ;Platz fuer ISR Vektoren lassen
|
32 | INIT:
|
33 | .DEF Zero = r15 ;Register 15 wird zum Rechnen benoetigt
|
34 | clr r15 ;und mit Null belegt
|
35 | .DEF Tmp1 = r16 ;Register 16 dient als erster Zwischenspeicher
|
36 | .DEF Tmp2 = r17 ;Register 17 dient als zweiter Zwischenspeicher
|
37 | .DEF Cnt1 = r18 ;Register 18 dient als Zaehler
|
38 | .DEF WL = r24 ;Register 24 und 25 dienen als universelles
|
39 | .DEF WH = r25 ;Doppelregister W
|
40 |
|
41 | ;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts)
|
42 | ldi Tmp1,HIGH(RAMEND) ;RAMEND (SRAM) ist in der Definitions-
|
43 | out SPH,Tmp1 ;datei festgelegt
|
44 | ldi Tmp1,LOW(RAMEND)
|
45 | out SPL,Tmp1
|
46 |
|
47 | ;alle Pins von PortD als Ausgang initialisieren
|
48 | ldi Tmp1,0xFF ;alle Bits im Zwischenspeicher auf Eins
|
49 | out DDRD,Tmp1 ;DDRD = 0b11111111; alle Pins Ausgang
|
50 |
|
51 | ;-------------------------------------------------------------------------------
|
52 | ; Hauptprogramm
|
53 | ;-------------------------------------------------------------------------------
|
54 | MAIN:
|
55 | ser Tmp1 ;alle Bits im Zwischenspeicher auf Eins
|
56 | out PORTD,Tmp1 ;PORTD = 0b11111111
|
57 |
|
58 | ;Alle PortD-Pins auf High setzen (8 LEDs ein)
|
59 | END:
|
60 | rjmp END ;Endlosschleife
|
61 |
|
62 | ;Ende des Hauptprogramms (falls keine Endlosschleife im Hauptprogramm)
|
63 | ;END: rjmp END ;Endlosschleife
|
64 |
|
65 | ;-------------------------------------------------------------------------------
|
66 | ; Unterprogramme und Interrupt-Behandlungsroutinen
|
67 | ;-------------------------------------------------------------------------------
|
68 | ;.INCLUDE "SR_TIME_16M_sample.asm" ;Zeitschleifenbibliothek einbinden
|
69 |
|
70 | ;-------------------------------------------------------------------------------
|
71 | ; Tabellen im Programmspeicher (Flash)
|
72 | ;-------------------------------------------------------------------------------
|
73 | ;TAB: .DB "Hallo"
|
74 |
|
75 | ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
76 | .EXIT ;Ende des Quelltextes
|