You are on page 1of 7

;

; _\\|//_ M E T R O N O M O
; (` o-o ') D I G I T A L
; ------ooO-(_)-Ooo----------------------------------------------------
;
; www.todopic.com.ar
; .oooO Oooo.
; ( ) ( ) obtenga su email gratis
; _____\ (_______) /___________________________________________________
; \_) (_/
;
; METRONOMO DIGITAL: NORBERTO DANIEL PELLEGRINI 27/01/2002
; CON UN PULSADOR INCREMENTA LOS BPM (BEATS POR MINUTO),OTRO LOS DECREMENTA
; CADA CAMBIO ES GRABADO EN EEPROM, CALCULA EL TIEMPO ENTRE CADA BEATS,
REALIZANDO
; UNA DIVISION DE 16 BITS, LA SALIDA ESTA DADA POR 4 LED QUE DESTELLAN SEGUN
LOS COMPASES
; INDICADOS EN 3 DIGITOS DE 7 SEGMENTOS
; PARA EMPLEARLO CON MUSICOS, BATEROS, DJ'S ;-)
; CUALQUIER CAMBIO O SUJERENCIA A info@todopic.com.ar
; aun no lo probe COMPLETO en circuito...mmmmmmmm y hay mejoras posibles
;----------------------------------------------------------------------------------

list p=16F84A
#include <p16F84A.inc>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

cblock 0x1c
DIGITO_C
DIGITO_D
DIGITO_U
NUMERO
BPM
TIEMPO
DELAY
DESTELLO
CONTA
DIGITOS
loops
loops2
DIRECCION
CONTADOR
COUNT
DIVIDENDHI
DIVIDENDLO
DIVISORHI
DIVISORLO
QUOTIENTHI
QUOTIENTLO
REMAINDERHI
REMAINDERLO
endc

Z EQU 2H
C EQU 0H
W EQU 0H
R EQU 1H
PULSA_MAS EQU 7 ;BIT MAS ALTO DE PORTB
PULSA_MENOS EQU 4 ;BIT MAS ALTO DE PORTA

;-----------------------------------------------------------------
ORG 0
GOTO INICIO
;-----------------------------------------------------------------

RETARDO
MOVF DELAY,W ;subrutina de retardo en milisegundos, QUE LLEGA DE LA
DIVISION
; MOVLW .1
movwf loops
top1 movlw .17 ;el numero de milisegundos llega
movwf loops2 ;cargado en el registro loops
top2 nop
nop
NOP
nop ;TODOS LOS NOP ESTAN COMPENSADOS,Y OBTENGO UN ERROR
nop ;MENOR A 1 MILI SEGUNDO EN CADA BPS
nop
nop
BTFSS PORTB,PULSA_MAS
CALL SUMAR
BTFSS PORTA,PULSA_MENOS ;CAMBIAR NUMERO DE BPS?
CALL RESTAR
INCF DIGITOS,F
MOVF DIGITOS,W
ADDWF PCL,F ;SALTO SEGUN VALOR DE DIGITOS
NOP
GOTO DIG1
GOTO DIG2
GOTO DIG3
MOVLW .1 ;
MOVWF DIGITOS ;2uS IGUAL AL GOTO CORRESPONDIENTE

;---------------------<PRESENTACION EN 3 DISPLAY 7 SEGMENTOS>----------


DIG1 CLRF PORTB
MOVF DIGITO_U,W
MOVWF PORTB ;SACO POR EL PUERTO EN BCD
BSF PORTB,4 ;ENCIENDO EL DISPLAY DE UNIDADES
GOTO SALIR

DIG2 CLRF PORTB


MOVF DIGITO_D,W
MOVWF PORTB ;SACO POR EL PUERTO EN BCD
BSF PORTB,5 ;ENCIENDO EL DISPLAY DE DECENAS
GOTO SALIR

DIG3 CLRF PORTB


MOVF DIGITO_C,W
MOVWF PORTB ;SACO POR EL PUERTO EN BCD
BSF PORTB,6 ;ENCIENDO EL DISPLAY DE CENTENAS
NOP
NOP ;COMPENSO CON LOS OTROS GOTOS 2 uS
;---------------------------------------------------------------------
SALIR
nop
nop
nop
nop
nop
nop
nop
nop
nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
; nop
nop
nop
; nop
; nop
; nop
; nop
; nop
nop
decfsz loops2,1 ;pregunta si termino 1 ms
goto top2
decfsz loops,1 ;pregunta si termina el retardo
goto top1
RETURN
;--------------------------------------------------------------------------
PRINCIPAL
BCF STATUS,C
RLF DESTELLO,F
BTFSS DESTELLO,4 ;SI YA PASO EL 4 LED, LO COLOCO EN EL PRIMERO
GOTO PROXIMO
CLRF DESTELLO
BSF DESTELLO,0

PROXIMO
MOVF DESTELLO,W ;PASO DESTELLO A LOS LED DEL PUERTO A
MOVWF PORTA
CALL RETARDO ;SOLO PERMANECEN ENCENDIDO ESTE TIEMPO,1/4 DEL TOTAL
CLRF PORTA ;APAGO LOS LED
CALL RETARDO
CALL RETARDO
CALL RETARDO ;LOS 4 RETARDOS FORMAN UN BPS O TIEMPO

GOTO PRINCIPAL
;---------------------------------------------------------------------------
INICIO
MOVLW B'11110000' ;4 SALIDAS A LOS LED Y UN PULSADOR
TRIS PORTA
MOVLW B'10000000' ;UN PULSADOR Y 3 SALIDAS TRANSISTORES Y 4 BCD
TRIS PORTB
CLRF DIGITO_C
CLRF DIGITO_D
CLRF DIGITO_U
CLRF DELAY
CLRF PORTA
CLRF PORTB
BSF PORTA,3
;LEER EEPROM VALOR BPM
;============== MANEJO DE EEPROM =================================
LECTURA MOVLW .1
;MOVF DIRECCION,W ;TOMAR DIRECCION A LEER
MOVWF EEADR ;PASO DIRECCION A EEADR
BSF STATUS,RP0 ;BANCO 1
BSF EECON1,RD ;LEER DATO DE LA EEPROM
BCF STATUS,RP0
MOVF EEDATA,W ;DATA --->W EN W TENGO AHORA EL ULTIMO VALOR GRABADO DE
BPM
;-------------------------------------------------------------------------
MOVWF BPM ;GUARDO EL DATO ALMACENADO DE EEPRON EN BPM
CLRF DIGITOS
CLRF DESTELLO
BSF DESTELLO,0 ;SALIDAS DE LED A DESTELLAR (BPM)
CALL BIN2BCD ;ACTUALIZA LOS TRES DIGITOS
GOTO PRINCIPAL
;---------------------------------------------------------------------------
SUMAR
DECFSZ CONTADOR,F ;GENERA UN RETARDO PARA INCREMENTAR LOS BEATS BMP
RETLW 0 ;TESTEA EL BIT, E INCREMENTA

INCF BPM,F
MOVLW .65 ;VERIICAR SI BPM ES MAYOR A 190,LIMITE MAXIMO
ADDWF BPM,W
BTFSS STATUS,C ; SI ES > SALTA
GOTO GRABAR ;ACTUALIZA EL VALOR DE BPM EN EEPROM
MOVLW .200 ;REGRESO AL VALOR MAXIMO-QUEDA EN EL MAXIMO 200
MOVWF BPM ;Y NO GRABA, YA FUE GRABADO ANTERIORMENTE EL ULTIMO VALOR
RETLW 0
;---------------------------------------------------------------------------
RESTAR

DECFSZ CONTADOR,F ;GENERA UN RETARDO PARA DECREMENTAR LOS BEATS BMP


RETLW 0 ;TESTEA EL BIT, E DECREMENTA

DECF BPM,F
MOVLW .59 ;VERIFICO SI ES MENOR A 60, LIMITE INFERIOR
SUBWF BPM,W
BTFSS STATUS,Z ;SI Z=1, ES BPM<60
GOTO GRABAR
MOVLW .60 ;MANTENGO EL ULTIMO VALOR MENOR POSIBLE (60 BPM)
MOVWF BPM
RETLW 0
;---------------------------------------------------------------------------
;AQUI VA A GRABAR EL ULTIMO VALOR EN LA EEPROM
;-------------------------------------------------------------------------
ESCRITURA ;DE LA EEPROM
MOVF DIRECCION,W ;TOMA DIRECCION
MOVWF EEADR
MOVF BPM,W ;BYTE,W
MOVWF EEDATA
BSF STATUS,RP0
BSF EECON1,WREN ;HABILITA ESCRITURA
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
BSF EECON1,WR ;WR-->1
BCF EECON1,WREN ;DESHABILITA ESCRITURA
BCF STATUS,RP0 ;BANCO 0
RETURN
;--------------------------------------------------------------------------
GRABAR BCF STATUS,RP0
MOVLW .1
MOVWF DIRECCION ;CARGO EL VALOR A LA DIRECCION

;MOVWF BYTE ;CARGO LA CUENTA EN BYTE PARA GRABAR


CALL ESCRITURA ;ENVIO A GRABAR EEPROM
BSF STATUS,RP0
ESCRCOMPLETA
BTFSC EECON1,WR ;BYTE ESCRITO?
GOTO ESCRCOMPLETA
BCF STATUS,RP0

; CADA VEZ QUE GRABA, ADEMAS ACTUALIZA LOS VALORES BCD PARA PRESENTAR
BIN2BCD
CLRF DIGITO_U
CLRF DIGITO_D
CLRF DIGITO_C

MOVF BPM,W
MOVWF NUMERO ;GUARDO EL VALOR DE BMP EN NUMERO, MAS UNO
INCF NUMERO,F
OTRO DECFSZ NUMERO,F
GOTO CALCULAR

;------------->DIVISION 15000 / BPM PARA OBTENER EL CUARTO DE TIEMPO EN


DEMORA<-----------
movlw 3AH
movwf DIVIDENDHI
movlw 98H
movwf DIVIDENDLO ;ESTO ES 15000 EN DOS BYTES 3AH Y 98H
CLRF DIVISORHI
MOVF BPM,W ;<<<<< AQUI ENTRA EL NUMERO QUE DIVIDE (BPM)
MOVWF DIVISORLO ;<-------------------------------------BPM
CLRF QUOTIENTHI
CLRF QUOTIENTLO

DIVIDE16:
CLRF REMAINDERHI ;Borrar
CLRF REMAINDERLO ;el resto

MOVLW .16 ;Para dividir


MOVWF COUNT ;16 bits
DIVLOOP:
RLF DIVIDENDLO ;Correr el dividendo
RLF DIVIDENDHI ;1 bit hacia la izquierda
RLF REMAINDERLO ;dentro del
RLF REMAINDERHI ;del resto

MOVF DIVISORHI,W ;Compara el divisor con la porcion del


SUBWF REMAINDERHI,W ;dividendo que fue corrida dentro del resto

BNZ CHECKLESS ;Si los dos bytes HI no son los mismos


;saltar hacia adelante
MOVF DIVISORLO,W ;De otro modo tendremos
SUBWF REMAINDERLO,W ;que compara los bytes LO
CHECKLESS:
BNC NOSUB ;Si la porcion corrida del dividendo fu
;menor que el divisor, saltar hacia adelante
MOVF DIVISORLO,W ;De otro modo, REMAINDER = REMAINDER - DIVISOR.
SUBWF REMAINDERLO ;
MOVF DIVISORHI,W ;
SKPC ;
INCFSZ DIVISORHI ;
SUBWF REMAINDERHI ; En este punto el STATUS,C es siempre 1
NOSUB:
RLF QUOTIENTLO ;Si hemos restado, corremos un "1" dentro
RLF QUOTIENTHI ;del cociente, de otro modo, corremos un "0".

DECFSZ COUNT ; Tenemos corridos todos los bits ?


GOTO DIVLOOP ;no, volvemos

;En este punto, el cociente esta en QUOTIENTHI:LO


;y el resto en REMAINDERHI:LO

MOVF QUOTIENTLO,W
MOVWF DELAY

RETLW 0 ;TERMINA DE PASAR BPM A BCD

CALCULAR
;UNIDAD
INCF DIGITO_U,1
MOVLW .10 ; VERIFICA SI ES IGUAL A 10
XORWF DIGITO_U,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO OTRO
CLRF DIGITO_U ; SI LLEGO A 10 LA COLOCO EN CERO
;DECENAS
INCF DIGITO_D,1 ;LE SUMO 1 A LA DECENA
MOVLW .10 ; VERIFICA SI ES IGUAL A 10
XORWF DIGITO_D,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO OTRO
CLRF DIGITO_D
;CENTENAS
INCF DIGITO_C,1 ;LE SUMO 1 A LA CENTENA
GOTO OTRO

;-------------------------------------------------------------------------;
; seteos de valores iniciales en data EEPROM ;
;-------------------------------------------------------------------------;
ORG H'2100'

DE .60 ,.137 , .160, .200, .60 ; SOLO EMPLEO EL 120


;--------------------------------------------------------------------------
END

;*****************PROGRAMA PRINCIPAL********************************

;
; Division de 16-Bit. Escrito por Andy Warren
;
; Derechos Reservados (C) 1996 Fast Forward Engineering.; Todos los derechos
reservados.
; Por este medio se garantiza el permiso de uso, para cualquier uso no comercial
con la
; condicion que esta nota de derechos reservados permanezca intacta.
;
; entrar el dividendo en DIVIDENDHI:DIVIDENDLO
; entrar el divisor en DIVISORHI :DIVISORLO
; salida con el cociente en QUOTIENTHI:QUOTIENTLO
; salida con el resto en REMAINDERHI:REMAINDERLO
;

You might also like