-
Notifications
You must be signed in to change notification settings - Fork 0
/
timmer de lavarropas.asm
608 lines (484 loc) · 17 KB
/
timmer de lavarropas.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
;****************************************************************************
;**************PROYECTO: TIMMER DE LAVARROPAS *******************************
;**************MICRO: MC68908JL3*********************************************
;**************TALLER DE MICROCONTROLADORES 2005*****************************
;**************UNIVERSIDAD NACIONAL DE LA MATANZA****************************
;**************PROFESOR: CARLOS MAIDANA**************************************
;**************ALUMNO: DAVID CAO*********************************************
;****************************************************************************
portd equ $0003
ddrd equ $0007
ddrb equ $0005
portb equ $0001
config1 equ $001f
digito equ 6
boton_un equ 4
boton_down equ 5
boton_enter equ 6
valvula equ 7
carga1/2 equ 7
carga1/1 equ 7
tres_seg equ 150 ;// interrupciones del clock
relés_1_2 equ 7
drain equ 7
A equ $77
B equ $7c
C equ $39
D equ $5e
E equ $79
F equ $71
G equ $7d
H equ $76
I equ $06
J equ $1e
;Ahora defino las variables para el uso del Timer
tsc equ $0020
tsc0 equ $0025
tch0h equ $0026
Tch0l equ $0027
tsc1 equ $0028
tch1h equ $0029
Tch1l equ $002A
;Variables en RAM
ORG $0080
;digito rmb 1
aux rmb 1
delay rmb 1
interrup_counter rmb 1
m35_counter rmb 1
min_counter rmb 1
var_time rmb 1 ;//variable de tiempo em minutos
.base 10t
ORG $EC00
start
rsp ;carga el SP al tope de RAM ($00ff)
mov #$00,portd
mov #$ff,ddrd
mov #$00,ddrb
bclr 2,portd
bset 0,config1 ;disable WATCH DOG
clr digito
clr aux
clr var_time
clra
clrx
jsr init_timer
clr digit_counter
clr delay
cli ; Habilita Int.
main_loop
boton_up?
brclr boton_up,portb,check_boton_up?
boton_down?
brclr boton_down,portb,check_boton_down? boton_enter?
brclr boton_enter,portb,check_boton_enter?
bra main_loop
check_boton_up
lda #20 ;delay 20 mseg
jsr sw_delay_mseg ;reviso que no searuido
brset boton_up,portb,boton_down?
jsr inc_counter
fix_boton_up
jsr sw_tycoon_delay
brset boton_up,portb,boton_down?
jsr inc_counter
brclr boton_up,portb,fix_boton_up
bra main_loop
check_boton_down lda #20 ;delay 20 mseg
jsr sw_delay_mseg
brset boton_up,port,boton_up?
jsr dec_counter
fix_boton_down
jsr sw_tycoon_delay
brset boton_up,port,boton_up?
jsr dec_counter
brclr boton_up,port,fix_boton_down
bra main_loop
check_boton_enter
lda #20 ;delay_boton20 milisegundos de delay
jsr sw_delay_mseg
brset boton_enter,portb,main_loop
flash_light
bclr 6,portd
jsr doble_delay_mseg
bset 6,portd
jsr doble_delay_mseg
bra parpadeo
selector(digito):
case'A':
;// lavado, enjuague y centrifugado X 3.
;// segun el programa, varian los tiempos decada modulo.
;// nadie utiliza mas de 3 programas de lavado, los demas quedan no ;//implementados
lda digito ;// lavado ropa blanca
cmpa #A
bne case'B' ;// salida al proximo case
jsr carga_completa
mov #10,var_time ;//variable de tiempo en minutos
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #10,var_time
jsr lavado_horario ;// el ciclo enjuague = lavado
mov #5,var_time
jsr centrifugado
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #7,var_time
jsr lavado_horario
mov #5,var_time
jsr centrifugado
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #7,var_time
jsr lavado_horario
mov #10,var_time ;//el centrifugado final es + largo
jsr centrifugado
case'B':
lda digito ;// ropa color
cmp #B
bne case'C'
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #10,var_time
jsr lavado_horario
mov #10,var_time
jsr centrifugado
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #10,var_time
jsr lavado_horario
mov #9,var_time
jsr centrifugado
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #10,var_time
jsr lavado_horario
mov #9,var_time
jsr centrifugado
case'C':
lda digito ;/ lavado liviano ( poco sucia)
cmp #C
bne case'D'
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #10,var_time
jsr lavado_horario
mov #9,var_time
jsr centrifugado
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #10,var_time
jsr lavado_horario
mov #9,var_time
jsr centrifugado
jsr carga_completa
mov #10,var_time
jsr lavado_horario
jsr carga_completa
mov #10,var_time
jsr lavado_antihorario
mov #10,var_time
jsr lavado_horario
mov #10,var_time
jsr centrifugado
;/ no implementado
;case'D':
;lda digito
;cmp # D
;bne case'E'
;case'E':
;lda digito
;cmp # E
;bne case'F'
;case'F':
;lda digito
;cmp # F
;bne case'G'
;case'G':
;lda digito
;cmp # G
;bne case'H'
;case'H':
;lda digito
;cmp # H
;bne case'I'
;case'I':
;lda digito
;cmp # I
;bne case'J'
;case'J':
;lda digito
;cmp # J
default:
bra main_loop ;
;/*********************** Start Rutinas de lavado ********************/
carga_media:
open1/2:
bset valvula,port
carga_media_full?:
brset carga1/2,port,carga_media_full?
close1/2:
bclr valvula,port
rts
;/************************************************************************
carga_entera:
open1/1:
bset valvula,port
carga_entera_full?:
brset carga1/1,port,carga_entera_full?
close1/1:
bclr valvula,port
rts
;/************************************************************************
carga_vacia:
carga_empty_done?: lda port
and %MASCARA
bne carga_empty_done?
rts
;/************************************************************************
lavado_antihorario:
jsr clr_counters
jsr relay_B
washa_time_out?: lda var_time
cmp XXXXXX
bne washa_time_out?
bclr wash,port
bset drain,port
jsr carga_vacia ; /*revisar
bclr drain,port
rts
;/************************************************************************
lavado_horario:
jsr clr_counters
bclr wash,port
jsr relay_A
washh_time_out?: lda var_time
cmp XXXXXX
bne washh_time_out?
bclr wash,port
bset drain,port
jsr carga_vacia
bclr drain,port
;/************************************************************************
rts
relay_A:
off_B: bclr relé_B,port
relé_A_on: bset relé_A,port
rts
;/************************************************************************
relay_B:
off_A: bclr relé_A,port
relé_B_on: bset relé_A,port
rts
;/************************************************************************
off_relés_1_2:
bclr relés_1_2,port
rts
;/************************************************************************
on_relés_1_2:
bset relés_1_2,port ;
rts
;/************************************************************************
centrifugado:
jsr clr_counters
bset spin,port
jsr off_relés_A_B
espera_time_out?: lda interrup_counter
cmp # tres_seg ;// espero 3seg para darle
bne espera_time_out? ;// línea
jsr relay_B
activo_desagote: bset drain,port
spin_time_out?: lda min_counter
cmp var_time
bne spin_time_out?
desactivo_desagote: bclr drain,port
jsr off_rotation
rts
;/**************************************************************************/
off_rotation:
bclr relé_A,port
bclr relé_B,port
rts
;/**************************************************************************/
jabonera:
brset octo1,rot_horario
brset octo2,rot_anihor
rot_horario:
bset motor_pin1,port;// contactos del motor de
bclr motor_pin2,port;//continua
bra END
rot_anihor:
bset motor_pin2,port
bclr motor_pin1,port
END: rts
;/**************************************************************************/
clr_counters:
clr interrup_counter
clr min_counter
clr m35_counter
rts
;/**************************************************************************/
tim_clock:
pshh ;tiro H al stack
pshx ;tiro X al stack
psha ;Salvo el acum en el stack
inc interrup_counter
bcc siguiente ;/overf incrementa a 35_c
inc m35_counter
lda m35_counter ;256 int * 35 = 1 minuto
cmp #35
bne siguiente
clr m35_counter
inc minut_counter
siguiente:
lda tsc0
and #$7f
sta tsc0 ;Limpio el flag de Output Compare
ldhx tch0h ;Cargo HX (16 bits) con el contenido de TCH0H
aix #ff ;Le sumo ff(decimal) ( ms)
sthx tch0h ;Le indico el proximo valor de INT
clrh
clrx
Stack_recovery :
pula
pulx
pulh ;
rti
;/**************************************************************************/
tim_display:
pshh ;tiro H al stack
pshx ;tiro X al stack
psha ;Salvo el acumulador en el Stack
lda tsc1
and #$7f
sta tsc1 ;Limpio el flag de Output Compare
ldhx tch1h ;Cargo HX (16 bits) con el contenido de TCH0H
aix #77 ;Le sumo 77 (decimal) (2 ms)
sthx tch1h ;Le indico el proximo valor de INT
clrh ;Ahora muestro el digito que corresponde.
clrx
digito:
ldx digito
bclr digito,portd
jsr send_7_seg
bset digito,portd
bra done_tisr
done_tisr:
pula ;recupero el acumulador del Stack
pulx
pulh ;recupero H del stack
inc delay
rti
;/*********************** Start Rutinas del display ***********************/
send_7_seg
lda tabladisplay,x
out_byte
clrx
shiftbyte
lsla
bcs setuno
bcc setcero
setuno
bset 3,portd
bra point1
setcero
bclr 3,portd
point1
bset 2,portd
bclr 2,portd
incx
cmpx #$08
bne shiftbyte
rts
inc_counter
inc digito
lda digito
cmp #10
bne exit_1
clr digito
exit_1
rts
dec_counter
dec digito
lda digito
cmp #$ff
bne exit_2
mov #9,digito
exit_2
rts
;/**************************************************************************/
sw_delay_mseg ;/ delay por software......
clrx
seguimos incx
cmpx #$ff
nop
nop
nop
nop
bne seguimos
deca
cmpa #$00
bne delay_mseg
clra
clrx
rts
;/**************************************************************************/
sw_tycoon_delay:
lda #ff ;/ llama 2 veces a delay con #ff
jsr delay_mseg ;/no valía la pena hacer un ciclo
lda #ff
jsr delay_mseg
rts
;/**************************************************************************/
init_timer:
mov #$36,tsc
mov #$0,tch0h
mov #ff,tch0l
mov #$0,tch1h
mov #$77,tch1l
mov #$50,tsc0 ; Pág 132 Manual
mov #$50,tsc1 ; Channel 0 Enable
; Seteo para la operación de Output Compare
mov #$06,tsc ; Arranco el timer
rts
;/****************** defino los vectores de interrupción ******************/
;Timer vector
org $fff4 ;/TIM Channel 1 lowest priority
dw tim_display ;/ interrupción de display
;Timer vector
; org $fff6 ;/TIM Channel 0 highest priority
;dw tim_clock ;/ interrupción de reloj
;Reset vector
org $fffe
dw start
;/*********************** defino la tabla del display **********************/
tabladisplay db A,B,C,D,E,F,G,H,I,J