1 | .INCLUDE "m88def.inc"
|
2 |
|
3 | .def Dummy1 = r16
|
4 |
|
5 | .equ F_CPU = 8000000 ; Systemtakt in Hz
|
6 | .org 0x000 ; kommt ganz an den Anfang des Speichers
|
7 |
|
8 | rjmp RESET ; Interruptvektoren überspringen und zum Hauptprogramm
|
9 |
|
10 | reti ; $001 External Interrupt Request 0
|
11 | reti ; $002 External Interrupt Request 1
|
12 | reti ; $003 Pin Change Interrupt Request 0
|
13 | reti ; $004 Pin Change Interrupt Request 0
|
14 | reti ; $005 Pin Change Interrupt Request 1
|
15 | reti ; $006 Watchdog Time-out Interrupt
|
16 | reti ; $007 Timer/Counter2 Compare Match A
|
17 | reti ; $008 Timer/Counter2 Compare Match A
|
18 | reti ; $009 Timer/Counter2 Overflow
|
19 | reti ; $00A Timer/Counter1 Capture Event
|
20 | reti ; $00B Timer/Counter1 Compare Match A
|
21 | reti ; $00C Timer/Counter1 Compare Match B
|
22 | reti ; $00D Timer/Counter1 Overflow
|
23 | reti ; $00E TimerCounter0 Compare Match A
|
24 | reti ; $00F TimerCounter0 Compare Match B
|
25 | reti ; $010 Timer/Couner0 Overflow
|
26 | reti ; $011 SPI Serial Transfer Complete
|
27 | reti ; $012 USART Rx Complete
|
28 | reti ; $013 USART, Data Register Empty
|
29 | reti ; $014 USART Tx Complete
|
30 | reti ; $015 ADC Conversion Complete
|
31 | reti ; $016 EEPROM Ready
|
32 | reti ; $017 Analog Comparator
|
33 | reti ; $018 Two-wire Serial Interface
|
34 | reti ; $019 Store Program Memory Read
|
35 |
|
36 | RESET: ; Hier beginnt das Hauptprogramm
|
37 |
|
38 | ; Stackpointer initialisieren
|
39 | ldi Dummy1, high(RAMEND)
|
40 | out SPH,Dummy1
|
41 | ldi Dummy1, low(RAMEND)
|
42 | out SPL,Dummy1
|
43 |
|
44 | ; ***********************************************************************
|
45 | ; * Port instaliesieren *
|
46 | ; * Ports alle auf Ausgang *
|
47 | ; ***********************************************************************
|
48 | ldi Dummy1, 0b11111111
|
49 | out DDRC,Dummy1 ; Port-C Ausgang
|
50 | out DDRB,Dummy1 ; Port-B Ausgang
|
51 | out DDRD,Dummy1 ; Port-D Ausgang
|
52 |
|
53 | ; ***********************************************************************
|
54 | ; * SPI Modul konfigurieren *
|
55 | ; ***********************************************************************
|
56 | ldi Dummy1, (1<<SPE) | (1<<MSTR) ; keine Interrupts, MSB first, Master
|
57 | out SPCR, Dummy1 ; CPOL = 0, CPHA =0
|
58 | ; SCK Takt = 1/2 XTAL
|
59 |
|
60 | ldi Dummy1, (1<<SPI2X) ; double speed aktivieren
|
61 | out SPSR, Dummy1 ; Dummy Daten, um SPIF zu setzen
|
62 | out SPDR, Dummy1
|
63 |
|
64 | ; ***********************************************************************
|
65 | ; * Alle Interrups aus *
|
66 | ; ***********************************************************************
|
67 | cli
|
68 |
|
69 |
|
70 | ldi zl,low(SPIString*2) ; Z Pointer laden
|
71 | ldi zh,high(SPIString*2)
|
72 |
|
73 |
|
74 | SPIOut:
|
75 | lpm ; nächstes Byte aus dem Flash laden
|
76 | adiw zl:zh,1 ; Zeiger erhöhen
|
77 | and r0,r0 ; = Null?
|
78 | brne SPIraus ; wenn nein, -> raus damit
|
79 |
|
80 |
|
81 | Loop:
|
82 | rjmp Loop
|
83 |
|
84 | ; ***********************************************************************
|
85 | ; * R0 über SPI ausgeben *
|
86 | ; ***********************************************************************
|
87 | SPIraus:
|
88 | in Dummy1, SPSR ; prüfe ob eine alte Übertragung beendet ist
|
89 | sbrs Dummy1, SPIF
|
90 | rjmp SPIraus
|
91 | out SPDR, r0 ; Daten ins SPI Modul schreiben, Übertragung beginnt automatisch
|
92 | rjmp SPIOut
|
93 |
|
94 |
|
95 | SPIString: .db "SPI TestString vom ATMega88",13,10,0
|