;******************************************************
;******* Programa Tablero Electronico 2006 *******
;******* Marcador electronico para los *******
;******* deportes Futsal, Basket, Voley *******
;******* Lleva la cuenta del tiempo, goles o *******
;******* puntos, controlado y configurado *******
;******* via control remoto RF. *******
;******* REV 2.0_v3 *******
;******************************************************
.nolist
.include "m8def.inc"
.list
.DSEG
.org $60
cont_col: .byte 1
min_dec: .byte 1
numerito: .byte 1
seg: .byte 1
min: .byte 1
seg_uni: .byte 1
most: .byte 1
less: .byte 1
temp : .byte 1
numfalt: .byte 1
periodo: .byte 1
faltvis: .byte 1
faltloc: .byte 1
bits_disp: .byte 1
ptoloc: .byte 1
dep : .byte 1
ptovis: .byte 1
inic_cont: .byte 1
boton: .byte 1
dato: .byte 1
cambio: .byte 1
cnt_int: .byte 1
cnt_int2: .byte 1
cnt2: .byte 1
mat: .byte 1
numero: .byte 1
.CSEG
;*******************************************
;******* Vectores de interrupción **********
;*******************************************
.org 0
rjmp Inicio
.org $003
rjmp barrido ;Timer2 Comp CTC 9Khz
;.org $006
;rjmp ult_minuto ;Timer1 CompA CTC
.org $008
rjmp int_tmr1
;*********************************************************
;*********** Rutina que cuenta 1 segundo *****************
;*********** 100 cuentas de 1 ms **************
;*********************************************************
int_tmr1:
push r16
in r16, sreg
push r16
push r17
ldi r17, $d8
ldi r16, $f0
out TCNT1H, r17
out TCNT1L, r16
lds r16, cnt_int
lds r17,cnt2
inc r17
inc r16
sts cnt2,r17
sts cnt_int, r16
;lds r17,numerito
;cpi r17,0
;breq art
;dec r17
;sts numerito,r17
;rjmp sigue
;art: ;rjmp lazo1
;sigue:
cpi r16, $64
brne finalTMR1
ldi r16, $0
sts cnt_int, r16
;ldi r16,1
;sts cambio,r16
lds r16, seg
inc r16
sts seg, r16
cpi r16,60
brlo finalTMR1
ldi r16,0
sts seg,r16
lds r16,min
inc r16
sts min,r16
cpi r16,60
brlo finalTMR1
ldi r16,0
sts min,r16
finalTMR1:
pop r17
pop r16
out sreg, r16
pop r16
reti
;**************************************************
;******* Subrutina de Interrupcion que *******
;******* que se encarga del Barrido y *******
;******* multiplexion de los segmentos *******
;******* y displays *******
;**************************************************
Barrido:
push r16 ;PB0 = clock
in r16, sreg ;PB1 = A/B
push r16
push r17
push r18
lds r16, cont_col ;inicialmente cont_col=0
retorno:
cpi r16, 0
breq es0
cpi r16,56 ;OJO! con este parametro vario la intemsidad de
;los leds, a mayor numero menos intensidad, con 56
;logre el mejor trabajo
brsh rst
rjmp no_es_mayor_q_N
rst:
ldi r16,0b00000010
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb,r16
ldi r16, 0
sts cont_col,r16
rjmp retorno ;PROBAR CON rjmp Fin
no_es_mayor_q_N:
rjmp multiplo_7
fin_multiplo_7:
ldi r16,0b00000001 ;Flanco de subida para mandar un "0"
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb,r16
ldi r16,0b00000000
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb,r16
rjmp fin
es0:
ldi r16,0b00000010 ;PB0=clk PB1=A/B
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb, r16
ldi r16,0b00000011 ;Solo aqui se manda el "1", solo al principio
;de la rutina barrido, se puede ver el cambio
;de flanco
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb, r16
ldi r16,0b00000000
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb, r16
fin:
lds r18, cont_col
inc r18
sts cont_col, r18
pop r18
pop r17
pop r16
out sreg, r16
pop r16
reti ;esta interrupcion se repite con una freq
;de 9Khz aprox
;*****************************************************
;*************** Subrutina doble flanco **********
;*********** asociada a mi rutina de **********
;*********** interrupcion Barrido **********
;*****************************************************
multiplo_7:
mov r17, r16
cpi r17, 7
brsh resta
rjmp fin_flanco
resta:
subi r17, 7
cpi r17, 7
brsh resta
cpi r17, 0
brne fin_flanco
ldi r16,0b00000001
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb, r16 ;mando un "0" con el flanco de subida
ldi r16,0b00000000
in r17,pinb ;N
andi r17,0b00111100 ;N //// probar!!!
or r16,r17 ;N
out portb, r16
fin_flanco:
rjmp fin_multiplo_7 ;cuando mi N es 7 o multiplo de 7 el programa
;debe desplazar dos veces para que el "1" del
;pin 7 del S-R pase al pin 8 y este
;que esta conectado al A/B del siguiente S-R
;con el siguiente flanco de subida pase al pin 1
;del mismo S-R
;***********************************************
;******** Programete Principal ********
;******** Probado para N displays ********
;***********************************************
Inicio:
ldi r16, high(RAMEND)
out sph, r16
ldi r16, low(RAMEND)
out spl, r16
rcall Init_TRM1
rcall conf_timer2
ldi R16, $FF ;PB0(CLK) y PB1(A/B) -----> Reg de desplazamiento
out DDRB, R16 ;PB2(A), PB3(B), PB4(C), PB5(HAB) ----> selectores del demux
ldi r16,1
out DDRC,r16
ldi R16, $FE ;PD0(Comunicacion Serial)
out DDRD, R16 ;PD1(a) ... PD7(g) : Datos
ldi R16, 0
out portD, R16
out portB, R16
sts cnt_int, R16
sts cont_col, R16
sts seg, R16
sts min,r16
sts less,r16
sts most,r16
sts boton,r16
sts bits_disp,r16
sts cnt2,r16
sts mat,r16
;rcall cero
;EsperaP:
;sbis pinC,0
;rjmp EsperaP
;EsperaFP:
;sbic pinC,0
;rjmp EsperaFP ;al presionar y soltar el pulsador
;conectado el PC empiezan las interrupciones
;sei
;ldi r16,99
;sts numerito,r16
sei
lazo:
lds r16,mat
cpi r16,1
breq nosalta
rcall Rel_Cro
rjmp lazo
nosalta:
lds r16,cnt2
cpi r16,100
breq lala
rjmp lazo
lala:
ldi r16,0
sts cnt2,r16
ldi r16,0
sts mat,r16
rjmp lazo
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%% Rutina de Actualizacion del Reloj %%%%%%
;%%%%%%%%%% Mostrado en displays %%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Rel_cro:
push r16
push r17
lds r16,seg ;Mostramos Segundos
sts boton,r16
rcall Separa_dig
lds r16,less
ldi r17,0b00100000 ;habilitamos primer display
sts bits_disp,r17
rcall visualiza ;mostramos unidades de segundo
lds r16,most
ldi r17,0b00100100 ;habilitamos segundo display
sts bits_disp,r17
rcall visualiza ;mostramos decenas de segundo
;/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/
lds r16,min ;Mostramos Minutos
sts boton,r16
rcall separa_dig
lds r16,less
ldi r17,0b00101000 ;habilitamos tercer display
sts bits_disp,r17
rcall visualiza ;mostramos unidades de minutos
lds r16,most
ldi r17,0b00101100 ;habilitamos cuarto display
sts bits_disp,r17
rcall visualiza ;mostramos decenas de minutos
ldi r16,1 ;<-------------------
sts mat,r16
pop r17
pop r16
ret
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%% Rutina que muestra cero %%%%%%%%%
;%%%%%%%%%%%% reseteo del tablero %%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Cero:
push r16
push r17
clr r16
sts boton,r16 ;Mostramos Segundos
rcall Separa_dig
lds r16,less
ldi r17,0b00100000 ;habilitamos primer display
sts bits_disp,r17
rcall visualiza ;mostramos unidades de segundo
lds r16,most
ldi r17,0b00100100 ;habilitamos segundo display
sts bits_disp,r17
rcall visualiza ;mostramos decenas de segundo
;/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/
clr r16
sts boton,r16 ;Mostramos Minutos
rcall separa_dig
lds r16,less
ldi r17,0b00101000 ;habilitamos tercer display
sts bits_disp,r17
rcall visualiza ;mostramos unidades de minutos
lds r16,most
ldi r17,0b00101100 ;habilitamos cuarto display
sts bits_disp,r17
rcall visualiza ;mostramos decenas de minutos
pop r17
pop r16
ret
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%% Rutina selccion de Deporte %%%%%%%%%
;%%%%%%%%%%%% y configuracion del tablero %%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Conf_dep:
push r16
in r16,pinc
push r16
andi r16,0b00000001
cpi r16,1
breq futsal ;configuracion de Futsal
pop r16
push r16
andi r16,0b00000010
cpi r16,2
breq basket ;configuacion de Basket
pop r16
push r16
andi r16,0b00000100
cpi r16,4
breq voley ;confuguracion de Voley
rjmp Conf_dep ;si no se ha preisonado ningun pulsador
;PC0(futsal),PC1(basket),PC2(voley) regresa
;al inicio de la subrutina
;hasta que se haga la seleccion de deporte
futsal:
ldi r16,6
sts numfalt,r16
ldi r16,20
sts tiempo,r16
ldi r16,2
sts periodo,r16
ldi r16,1
sts dep,r16
rjmp fin_conf
Basket:
ldi r16,6
sts numfalt,r16
ldi r16,20
sts tiempo,r16
ldi r16,4
sts periodo,r16
ldi r16,2
sts dep,r16
rjmp fin_conf
Voley:
ldi r16,5
sts numfalt,r16
ldi r16,10
sts tiempo,r16
ldi r16,4
sts periodo,r16
ldi r16,3
sts dep,r16
fin_conf:
pop r16
ret
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%% Rutina de incremento y visualizacion %%%%%%%%%%
;%%%%%%%%% de puntos y faltas %%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PtoFal:
pop r17
pop r18
pop r19
lds r17,numfalt
lds r18,tiempo
lds r19,periodo
in r16,pinc
push r16
andi r16,0b00001000 ;PC3 incrementa puntos del local
cpi r16,8
breq Pto_loc
pop r16
push r16
andi r16,0b00010000
cpi r16,16 ;PC4 incrementa puntos del visitante
breq Pto_vis
pop r16
; push r16
; andi r16,0b00100000
; cpi r16,32
; breq falta_loc
; pop r16
; push r16
; andi r16,0b01000000
; cpi r16,64
; breq falta_vis
rjmp PtoFal
Pto_loc:
lds r16,ptoloc
inc r16
sts ptoloc,r16
push r16
push r17
sts boton,r16
rcall separa_dig
lds r16,less
ldi r17,0b00110000
sts bits_disp,r17
rcall visualiza
lds r16,most
ldi r17,0b00110100
sts bits_disp,r17
rcall visualiza
pop r17
pop r16
cp r16,r17
breq rst_ptoloc
rjmp ptofal
rst_ptoloc:
ldi r16,0
sts ptoloc,r16
rjmp ptofal
Pto_vis:
lds r16,ptovis
inc r16
sts ptovis,r16
push r16
push r17
sts boton,r16
rcall separa_dig
lds r16,less
ldi r17,0b00111000
sts bits_disp,r17
rcall visualiza
lds r16,most
ldi r17,0b00111100
sts bits_disp,r17
rcall visualiza
pop r17
pop r16
cp r16,r17
breq rst_ptovis
rjmp ptofal
rst_ptovis:
ldi r16,0
sts ptovis,r16
rjmp ptofal
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%% Rutina que modifica y visuliza %%%%%%%%
;%%%%%%%%%%% el reloj en displays %%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Conf_rel:
push r16
push r17
ldi r16,1
sts inic_cont,r16
pop r16
pop r17
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%% Rutina de Visualizacion %%%%%%%%
;%%%%%%%%%%%% en cualquier Display %%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Visualiza:
push r16
push r17
lsl r16 ;el carry luego de la instruccion lsl es el bit7,
;entonces para estos valores ya es cero porque el bit
;7 de cada numero es "0" mirar tabla bcd_7seg
;no es necesario utilizar CLC
in r17,pinD
andi r17,0b00000001
or r17,r16
out portD,r17 ;enviando el dato por los pines PD1-PD7
;teniendo cuidado de no modificar el
;dato que hay en PD0
;rcall tiempo
in r16,pinB
andi r16,0b00000011 ;guardo solo los bits pertenecientes
;a CLK y A/B
push r16
lds r17,bits_disp ;100000-disp1, 100100-disp2, 101000-disp3
;101100-disp4, 110000-disp5, 110100-disp6
;111000-disp7, 111100-disp8
or r16,r17
out portB,r16 ;ya esta habilitado el primer display
;rcall tiempo
pop r16
;PB4=0,PB3=0,PB2=0
lds r17,bits_disp ;bits_disp: variable que lleva los datos para
andi r17,0b00011111
;los selectores del decodificador
;habilita un determinado display
out portB,r17 ;Display x desabilitado
;rcall tiempo
pop r17
pop r16
ret
;********************************************************
;************ Rutina que muestra en displays *********
;************ decenas y unidades *********
;********************************************************
Separa_dig:
push r16
lds r16,boton
ldi zh, high(tablacomb*2)
ldi zl, low(tablacomb*2)
add zl,r16
clr r16
adc zh, r16
lpm r16, z
;decenas y unidades
push r16
andi r16,$0f
ldi zh, high(bcd_7seg*2)
ldi zl, low(bcd_7seg*2)
add zl,r16
clr r16
adc zh, r16
lpm r16, z
sts less,r16 ;unidades
pop r16
swap r16
andi r16,$0f
ldi zh, high(bcd_7seg*2)
ldi zl, low(bcd_7seg*2)
add zl,r16
clr r16
adc zh, r16
lpm r16, z
sts most,r16 ;decenas
pop r16
ret
;***********************************************
;******** Tablas BCD ********
;***********************************************
tabla_BCD:
ldi ZH, high (bcd_7seg*2)
ldi ZL, low (bcd_7seg*2)
lds r16, numero
add ZL, r16
clr r16
adc ZH, r16
lpm r16, Z
out portD, R16
ret
;******************************************
;***** Tablas a usar en el programa
;******************************************
bcd_7seg:
; gfedcba
.db 0b00111111, 0b00000110 ;0, 1
.db 0b01011011, 0b01001111 ;2, 3
.db 0b01100110, 0b01101101 ;4, 5
.db 0b01111101, 0b00000111 ;6, 7
.db 0b01111111, 0b01101111 ;8, 9
tablacomb:
.db $00,$01,$02,$03,$04,$05
.db $06,$07,$08,$09,$10,$11
.db $12,$13,$14,$15,$16,$17
.db $18,$19,$20,$21,$22,$23
.db $24,$25,$26,$27,$28,$29
.db $30,$31,$32,$33,$34,$35
.db $36,$37,$38,$39,$40,$41
.db $42,$43,$44,$45,$46,$47
.db $48,$49,$50,$51,$52,$53
.db $54,$55,$56,$57,$58,$59
;*********************************************************
;******* Subrutina que configura la interrupcion ******
;******* del timer 1 (interrup de 1 seg.) ******
;*********************************************************
Init_TRM1:
push r16
ldi r16, $00
out TCCR1A, r16
ldi r16, $01
out TCCR1B, r16
in r16, TIMSK
ldi r17, $04
add r16, r17
out TIMSK, r16
ldi r16, $04
out TIFR, r16
pop r16
ret
;**********************************************
;******* Subrutina de configuración *******
;******* de Timer2 CTC 9KHz aprox *******
;**********************************************
Conf_timer2:
push R16
ldi R16, $0A ;modo CTC 0000 1010
out TCCR2, R16 ;prescalamiento 8
ldi R16, 14 ;era 14 para 9khz
out OCR2, R16 ;(1us)(

(14) = 9 KHz
in R16, TIMSK ;hab interrupcion
ori R16, $80 ;timer2 comp
out TIMSK, R16
pop R16
ret
;*****************************************
;Subrutina q genera un Retardo de 3ms aprox
;*****************************************
tiempo:
push r16
push r17
ldi r17,3
nol: ldi r16,$ff
lanza: dec r16
cpi r16,0
brne lanza
dec r17
cpi r17,0
brne nol
pop r17
pop r16
ret
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%% Relacion de botones del control %%%%%%%%
;%%%%%%%%%%% remoto con sus respectivos %%%%%%%%
;%%%%%%%%%%% codigos en hexadecimal %%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;reset general $00
;activar Futsal $01
;activar basket $02
;activar Voley $03
;anotacion local +1 $04
;anotacion local -1 $05
;anotacion visita +1 $06
;anotacion visita -1 $07
;foul local +1 $08
;foul local -1 $09
;foul visita +1 $0a
;foul visita -1 $0b
;start time $0c
;stop time $0d
;aumenta segundos +1 $0e
;disminuye segundos -1 $0f
;aumenta minutos +1 $10
;disminuye minutos -1 $11
;aumenta periodo +1 $12
;disminuye periodo -1 $13
;tocar chicharra $14
;reset anotaciones $15
;reset tiempo $16
;reset foul $17