Dimmer2.asm


1
.include "m16def.inc" 
2
3
; MASTER einstellungen
4
.equ TWI_BIT_RATE           = 4                 ; Bit-Rate  (11...255
5
.equ TWI_PRESCALER          = 2               ; Vorteiler: 0=1 1=4 2=16 3=64
6
7
; REGISTER
8
.def ADRESSE_SLAVE  = R11
9
10
.def DATA_EMPFANG_1 = R12
11
.def DATA_EMPFANG_2 = R13
12
.def DATA_SENDEN_1  = R14
13
.def DATA_SENDEN_2  = R15
14
15
.def temp           = R16
16
.def zeichen        = R17
17
.def speicher       = R18
18
.def ausgang        = R19
19
20
21
22
.cseg                                   ;Beginn eines Code-Segmentes
23
.org 0                                  ;Startadresse=0
24
25
  rjmp RESET                        ; Reset Handler
26
  reti
27
  rjmp EXT_INT0                   ; IRQ0 Handler
28
  reti ;rjmp EXT_INT1                   ; IRQ1 Handler
29
  reti ;rjmp TIM2_COMP                  ; Timer2 Compare Handler            
30
  reti ;rjmp TIM2_OVF                   ; Timer2 Overflow Handler
31
  reti ;rjmp TIM1_CAPT                  ; Timer1 Capture Handler            
32
  reti ;rjmp TIM1_COMPA                 ; Timer1 CompareA Handler           
33
  reti ;rjmp TIM1_COMPB                 ; Timer1 CompareB Handler
34
  reti ;rjmp TIM1_OVF                   ; Timer1 Overflow Handler           
35
  reti ;rjmp TIM0_OVF                   ; Timer0 Overflow Handler           
36
  reti ;rjmp SPI_STC                    ; SPI Transfer Complete Handler
37
  reti ;rjmp USART_RXC                  ; USART RX Complete Handler
38
  reti ;rjmp USART_UDRE                 ; UDR Empty Handler                 
39
  reti ;rjmp USART_TXC                  ; USART TX Complete Handler
40
  reti ;rjmp ADC                        ; ADC Conversion Complete Handler
41
  reti ;rjmp EE_RDY                     ; EEPROM Ready Handler
42
  reti ;rjmp ANA_COMP                   ; Analog Comparator Handler
43
  reti ;rjmp TWSI                      ; Two-wire Serial Interface Handler
44
  reti ;rjmp SPM_RDY                    ; Store Program Memory Ready Handler
45
46
47
48
49
50
RESET:
51
52
;------------------STACK initialiseren-------------------------------------------------------------
53
    ldi   temp, LOW(RAMEND)
54
    out   SPL, temp
55
    ldi   temp, HIGH(RAMEND)
56
    out   SPH, temp
57
58
;------------------Z Pointer laden-----------------------------------------------------------------
59
  ldi     ZL,low(0x03)                       ; Z-Zeiger laden
60
     ldi     ZH,high(0x00)
61
62
;------------------PORTS initialisieren------------------------------------------------------------
63
  rcall  PORTS_INIT
64
65
;------------------Externer Interrupt 0------------------------------------------------------------
66
  in    temp, MCUCR                  ; LOW Pegel ein Interrupt
67
  ori    temp, 0x02
68
  out    MCUCR, temp
69
  in    temp, GICR                  ; Interrupt einschalten
70
  ori    temp, 0x40
71
  out    GICR, temp
72
;------------------TWI-Initialisieren--------------------------------------------------------------
73
  rcall   TWI_INI
74
75
76
  ldi temp,111            ; SLAVE ADRESSE 0...127 (0=General CALL)
77
    mov ADRESSE_SLAVE,temp
78
79
;------------------EEPROM Daten Laden--------------------------------------------------------------
80
81
  
82
83
  clr    ausgang                    
84
  rcall  START_TWI
85
     rcall  ADRESSE_TWI
86
87
  ldi    zeichen, 17
88
  rcall  DATEN_SENDEN
89
  
90
  ldi    zeichen, 9
91
  rcall  DATEN_SENDEN
92
  
93
  ldi    zeichen, 27
94
  rcall  DATEN_SENDEN
95
  
96
  ldi    zeichen, 90
97
  rcall  DATEN_SENDEN
98
  
99
  ldi    zeichen, 76
100
  rcall  DATEN_SENDEN
101
  
102
  ldi    zeichen, 50
103
  rcall  DATEN_SENDEN
104
  
105
  ldi    zeichen, 82
106
  rcall  DATEN_SENDEN
107
108
  ldi    ZL, 0x03
109
  rcall  EEPROM_READ
110
  mov    ausgang, speicher
111
  ldi    zeichen, 48
112
  add    zeichen, speicher
113
  rcall  DATEN_SENDEN
114
115
  ldi    ZL, 0x02
116
  rcall  EEPROM_READ
117
  add    ausgang, speicher
118
  ldi    zeichen, 48
119
  add    zeichen, speicher
120
  rcall  DATEN_SENDEN
121
122
  ldi    ZL, 0x01
123
  rcall  EEPROM_READ
124
  add    ausgang, speicher
125
  ldi    zeichen, 48
126
  add    zeichen, speicher
127
  rcall  DATEN_SENDEN
128
129
  ldi    zeichen, 00
130
  rcall  DATEN_SENDEN
131
132
  ldi    zeichen, 239
133
  add   zeichen, ausgang
134
  rcall  DATEN_SENDEN
135
136
  rcall  STOP_TWI
137
138
;------------------Hauptprogramm-------------------------------------------------------------------
139
140
  sei
141
endlos:
142
  rjmp endlos
143
144
;------------------START TWI-----------------------------------------------------------------------
145
146
START_TWI:
147
    ldi   temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)    ; Start Kondition senden
148
    out   TWCR, temp
149
    rcall   TWI_TWINT_wait                ; warten, bis TWINT wieder = 1
150
151
    in     temp,TWSR                   ; Register überprüfen       
152
    andi   temp, 0xF8
153
    cpi   temp,  0x08 
154
    breq   NO_ERROR
155
  rcall   TWI_ERROR
156
157
NO_ERROR:
158
  ret                          ; Rücksprung aus Unterprogramm
159
160
;------------------Adresse TWI senden--------------------------------------------------------------
161
162
ADRESSE_TWI:                        
163
    mov   temp, ADRESSE_SLAVE              ; Load SLA + "W"  (W=0)
164
    lsl   temp                        ; 1x links, Bit0 wird '0'
165
    out   TWDR, temp                     
166
    ldi   temp, (1<<TWINT) | (1<<TWEN)        ; senden - Clear TWINT
167
    out   TWCR, temp                     
168
    rcall   TWI_TWINT_wait                ; warten, bis TWINT wieder = 1
169
170
    in     temp,TWSR                  ; Register überprüfen
171
    andi   temp, 0xF8
172
    cpi   temp,  0x18 
173
    breq  NO_ERROR1
174
  rcall   TWI_ERROR
175
176
NO_ERROR1:
177
  ret                          ; Rücksprung aus Unterprogramm
178
179
;------------------Daten TWI senden----------------------------------------------------------------
180
181
DATEN_SENDEN:
182
     out    TWDR, zeichen                ; Zahl in Ausgabe geben
183
    ldi   temp, (1<<TWINT) | (1<<TWEN)        ; senden - Clear TWINT
184
    out   TWCR, temp
185
    rcall   TWI_TWINT_wait                ; warten, bis TWINT wieder = 1
186
187
    in     temp,TWSR                  ; Register überprüfen
188
    andi   temp, 0xF8
189
    cpi   temp, 0x28  
190
    breq  NO_ERROR2 
191
  rcall  TWI_ERROR
192
193
NO_ERROR2:
194
  ret                          ; Rücksprung aus Unterprogramm
195
196
;------------------STOP TWI------------------------------------------------------------------------
197
198
STOP_TWI:
199
  ldi   temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)    
200
    out   TWCR, temp
201
  ret                          ; Rücksprung aus Unterprogramm
202
203
;------------------TWI Error-----------------------------------------------------------------------
204
205
TWI_ERROR:
206
    ldi   temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)    ; TWI Stop
207
    out   TWCR, temp
208
    ldi   temp, (0<<TWEN)                ; TWI abschalten
209
    out   TWCR, temp
210
    rcall   TWI_INI
211
  ret                          ; Rücksprung aus Unterprogramm
212
213
;------------------TWI wait------------------------------------------------------------------------
214
215
TWI_TWINT_wait:
216
    in     temp, TWCR
217
    sbrs   temp, TWINT
218
    rjmp   TWI_TWINT_wait
219
  ret                          ; Rücksprung aus Unterprogramm
220
221
;------------------Eeprom read---------------------------------------------------------------------
222
223
EEPROM_READ:
224
    sbic    EECR,EEWE                           ; prüfe ob der vorherige Schreibzugriff
225
                                                ; beendet ist
226
    rjmp    EEPROM_READ                         ; nein, nochmal prüfen
227
 
228
    out     EEARH, ZH                           ; Adresse laden
229
    out     EEARL, ZL    
230
    sbi     EECR, EERE                           ; Lesevorgang aktivieren
231
    in      speicher, EEDR                         ; Daten in CPU Register kopieren
232
    ret                          ; Rücksprung aus Unterprogramm
233
234
;------------------PORTS Initialisieren------------------------------------------------------------
235
236
PORTS_INIT:
237
238
  ser    temp
239
  out    DDRA,temp
240
241
    clr   temp                    ; PORT C alles Eingänge 
242
    out   DDRC,temp
243
  ser    temp                    ; Pull ups einschalten
244
  out    PORTC,temp
245
  
246
  clr    temp                    ; PORTD als Eingänge
247
  out    DDRD,temp
248
  ser    temp                    ; Pull ups einschalten
249
  out    PORTD,temp
250
  ret                          ; Rücksprung aus Unterprogramm
251
252
;------------------TWI Initialisieren--------------------------------------------------------------
253
254
TWI_INI:
255
    ldi   temp, TWI_BIT_RATE              ; Bit Rate Register laden
256
    out   TWBR, temp
257
    ldi   temp, TWI_PRESCALER              ; Prescaler laden
258
    out   TWSR, temp
259
    ldi   temp, 0<<TWINT|1<<TWEA|1<<TWEN        ; Konrtoll Register laden
260
    out   TWCR,temp
261
  ret                          ; Rücksprung aus Unterprogramm
262
263
264
;-----------------Externer Interrupt 0-------------------------------------------------------------
265
266
EXT_INT0:
267
  push  temp                    ;temp auf den Stack sichern
268
  rcall  START_TWI
269
  rcall  ADRESSE_TWI
270
  ldi    zeichen, 18                  ;Empfang des Displays aktivieren
271
  rcall  DATEN_SENDEN
272
  ldi    zeichen, 1
273
  rcall  DATEN_SENDEN
274
  ldi    zeichen, 73
275
  rcall  DATEN_SENDEN
276
  ldi    zeichen, 92
277
  rcall  DATEN_SENDEN
278
  rcall  STOP_TWI
279
280
281
      ldi temp, (1<<TWINT | 1<<TWEA | 1<<TWSTA | 1<<TWEN )
282
    out TWCR, temp
283
; warten, bis TWINT wieder = 1
284
    rcall TWI_TWINT_wait
285
; Check TWSR
286
    in temp,TWSR
287
    andi temp, 0xF8
288
    cpi temp,  0x08     ; START erfolgreich
289
    brne TWI_ERROR
290
  mov temp, ADRESSE_SLAVE                ; Adresse mit Write Befehl senden
291
    lsl temp                          ; 1 x links
292
    subi temp,-1
293
    out TWDR, temp        
294
    ldi temp, (1<<TWINT | 1<<TWEA  | 1<<TWEN )      ; senden - Clear TWINT
295
    out TWCR, temp                   
296
    rcall TWI_TWINT_wait                ; warten, bis TWINT wieder = 1
297
    in temp,TWSR                    ; Register überprüfen
298
    andi temp, 0xF8
299
    cpi temp, 0x40                    ; SLA+R gesendet; ACK empfangen
300
    breq weiter5
301
  rcall TWI_ERROR
302
  
303
weiter5:ldi temp, (1<<TWINT | 1<<TWEA  | 1<<TWEN )      ; senden  "ACK" (TWEA=1) für mehrere Daten-Bytes
304
    out TWCR, temp                                 
305
    rcall TWI_TWINT_wait                ; TWINT abfragen
306
    in temp,TWSR                    ; Register überprüfen
307
    andi temp, 0xF8
308
    cpi temp, 0x50                    ; Data Byte empfangen- ACK zurückgesendet
309
    breq weiter
310
  rcall TWI_ERROR  ; ERROR
311
weiter:  
312
    in speicher, TWDR                  ; DATEN einlesen
313
314
    ldi temp, (1<<TWINT | 1<<TWEA  | 1<<TWEN )      ; senden  "ACK" (TWEA=1) für mehrere Daten-Bytes
315
    out TWCR, temp                                 
316
    rcall TWI_TWINT_wait                ; TWINT abfragen
317
    in temp,TWSR                    ; Register überprüfen
318
    andi temp, 0xF8
319
    cpi temp, 0x50                    ; Data Byte empfangen- ACK zurückgesendet
320
    breq weiter2
321
  rcall TWI_ERROR  ; ERROR
322
weiter2:  
323
    in speicher, TWDR                  ; DATEN einlesen
324
325
    ldi temp, (1<<TWINT | 1<<TWEA  | 1<<TWEN )      ; senden  "ACK" (TWEA=1) für mehrere Daten-Bytes
326
    out TWCR, temp                                 
327
    rcall TWI_TWINT_wait                ; TWINT abfragen
328
    in temp,TWSR                    ; Register überprüfen
329
    andi temp, 0xF8
330
    cpi temp, 0x50                    ; Data Byte empfangen- ACK zurückgesendet
331
    breq weiter3
332
  rcall TWI_ERROR  ; ERROR
333
weiter3:  
334
    in speicher, TWDR                  ; DATEN einlesen
335
  out  PORTA,speicher
336
337
; senden "NOT ACK" (TWEA=0) für letztes bzw für ein Daten-Byte
338
    ldi temp, (1<<TWINT | 0<<TWEA  | 1<<TWEN )
339
    out TWCR, temp
340
; TWINT abfragen
341
    rcall TWI_TWINT_wait
342
; Check TWSR
343
    in temp,TWSR
344
    andi temp, 0xF8
345
    cpi temp, 0x58  ; letztes Data Byte empfangen-NOT ACK zurückgesendet
346
    breq weiter1
347
  rcall TWI_ERROR  ; ERROR
348
weiter1: 
349
; DATEN einlesen                                    
350
    in speicher, TWDR
351
352
; STOP
353
    ldi temp, (1<<TWINT | 1<<TWEN |1<<TWSTO)
354
    out TWCR, temp
355
  rcall  STOP_TWI
356
  pop    temp                    ;temp wiederherstellen
357
  reti                        ;Interrupt beenden
358
359
360
.eseg
361
.org 1 
362
  .db 0x05
363
  .db 0x08
364
  .db 0x02