vs1011test.asm


1
.include <m32def.inc>
2
.equ dreq = pind7
3
.equ reset = pd6
4
.equ cs = pd5
5
.equ dcs = pd4
6
7
8
9
10
11
12
13
14
15
.equ F_CPU = 14745600                            ; Systemtakt in Hz
16
      ;      04000000
17
.equ BAUD  = 9600                               ; Baudrate
18
 
19
; Berechnungen
20
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
21
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
22
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
23
 
24
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
25
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
26
.endif
27
28
29
30
31
32
33
.cseg
34
ldi r16, low(RAMEND)
35
ldi r17, high(RAMEND)
36
out spl, r16
37
out sph, r17
38
;:::::::::::::::::::::::::::::
39
ldi r16, (1<<reset) | (1<<cs) | (1<<1) | (1<<dcs)
40
out ddrd, r16
41
42
ldi r16, (1<<7) | (1<<5) | (1<<4)
43
out ddrb, r16
44
45
ldi r16, (1<<MSTR) | (1<<SPE) | (1<<SPR0)
46
out SPCR, r16
47
48
49
 ldi     r16, HIGH(UBRR_VAL)
50
    out     UBRRH, r16
51
    ldi     r16, LOW(UBRR_VAL)
52
    out     UBRRL, r16
53
54
 ldi     r16, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
55
    out     UCSRC, r16
56
 
57
    sbi     UCSRB,TXEN
58
  sbi     UCSRB,RXEN
59
sbi portd, cs
60
sbi portd, dcs
61
sbi portd, reset
62
rcall w
63
nop
64
nop
65
nop
66
nop
67
nop
68
cbi portd, reset
69
nop
70
nop
71
nop
72
nop
73
nop
74
nop
75
sbi portd, reset
76
request:
77
sbis pind, dreq
78
rjmp request
79
ldi r16, 'L'
80
rcall serout
81
ldi r16, 'o'
82
rcall serout
83
ldi r16, 's'
84
rcall serout
85
ldi r16, 10
86
rcall serout
87
ldi r16, 13
88
rcall serout
89
90
receive_loop:
91
   sbis     UCSRA, RXC                      ; warten bis ein Byte angekommen ist
92
   rjmp     receive_loop
93
   in       r16, UDR 
94
cbi portd, cs
95
ldi r16, 2
96
rcall send
97
ldi r16, 0
98
rcall send
99
ldi r16, 0x08
100
rcall send
101
ldi r16, 0x20
102
rcall send
103
sbi portd, cs
104
w1:sbis pind, dreq
105
rjmp w1
106
cbi portd, cs
107
ldi r16, 2
108
rcall send 
109
ldi r16, 0x03
110
rcall send
111
ldi r16, high(0x9800)
112
rcall send
113
ldi r16, low(0x9800)
114
rcall send
115
  
116
117
sbi portd, cs
118
ldi r28, 100
119
qqq:nop
120
nop
121
nop
122
nop
123
nop
124
nop
125
nop
126
nop
127
nop
128
nop
129
dec r28
130
brne qqq
131
132
/*cbi portd, cs
133
ldi r16, 2
134
rcall send
135
ldi r16, 0xb
136
rcall send
137
ldi r16, 120
138
rcall send
139
ldi r16, 120
140
rcall send
141
sbi portd, cs*/
142
rcall w
143
cbi portd, dcs
144
ldi r16, 0x53
145
rcall send
146
ldi r16, 0xEF
147
rcall send
148
ldi r16, 0x6E
149
rcall send
150
151
ldi r16, 0x7D
152
rcall send
153
ldi r16, 0x0
154
rcall send
155
ldi r16, 0x0
156
rcall send
157
ldi r16, 0x0
158
rcall send
159
ldi r16, 0x0
160
rcall send
161
162
sbi portd, dcs
163
164
165
l: rjmp l
166
167
w:
168
; ============================= 
169
;    delay loop generator 
170
;     13270800 cycles:
171
; ----------------------------- 
172
; delaying 13270797 cycles:
173
          ldi  R17, $AB
174
WGLOOP0:  ldi  R18, $74
175
WGLOOP1:  ldi  R19, $DE
176
WGLOOP2:  dec  R19
177
          brne WGLOOP2
178
          dec  R18
179
          brne WGLOOP1
180
          dec  R17
181
          brne WGLOOP0
182
; ----------------------------- 
183
; delaying 3 cycles:
184
          ldi  R17, $01
185
WGLOOP3:  dec  R17
186
          brne WGLOOP3
187
; ============================= 
188
ret
189
190
191
192
193
serout:
194
    sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
195
                                        ; Byte bereit ist
196
    rjmp    serout
197
    out     UDR, r16
198
    ret           
199
send:
200
out spdr, r16
201
ss:sbis spsr, spif
202
rjmp ss
203
in r16, spdr
204
ret