; º º
; º _\\|//_ º
; º (` o-o ') º
; º--------------------------------------------------------ooO-(_)-Ooo---º
; º º
; º obtenga su email gratis www.todopic.com.ar º
; º control de un modulo LCD inteligente .oooO Oooo. º
; º CONTADOR DE PULSOS HASTA 9.999.999 CON MEMORIA LAP ( ) ( ) º
; º_______________________________________________________\ (_______) /__º
; º \_) (_/ º
; NORBERTO PELLEGRINI
; 28/01/2001->CAMBIO A 4 BITS el LCD e INTERRUPCIONES 16/02/2002
;se empleo en un medidor de distancias, con 8 tornillos en la rueda de un vehiculo
;obteniendose pulsos cada 21 cm, llegamos a obtener mediciones hasta una velocidad
;del vehiculo de 64 Km/h, si bien el micro puede responder, la falla era por el sensor
;(sensor inductivo industrial,12V, tres cables - marron +, azul - ,negro salida)
;este dispositivo es empleado para las "carreras de regularidad"
;para adaptar el pulso del sensor (12v) empleo un BC337, colector al micro,y colector
; a +5v con R=1k, ademas de un led y R=330 para visualizar los pulsos
;en la base 10K al sensor, y 6,8 k a masa.
;FUNCIONA OK
;-------------------------------------------------------------------------
list p=16f84A
INCLUDE "P16F84A.INC"
OPCION EQU 01h
PC EQU 2H
STATUS EQU 3H
PORT_A EQU 5H
PORT_B EQU 6H
cblock 0x1c
SENSOR
PUERTO ;GUARDO EL VALOR VIEJO DEL PUERTO
LAP ;SI LAP=1 MANTIENE EL VISOR SIN ACTUALIZAR
UNIDAD ;CONTADORES UNIDADES
DECENA
CENTENA
UNIMIL
DECMIL
CENMIL
MILLON
DELAY2
DELAY1
BANDERA ;solo empleo TRES bit, para que barra solo una vez el mensaje
TEMPO
SALVAW
SALVASTATUS
TEMPORAL
DESTELLO
CONTA
NUM_LETRA
endc
MEMO EQU 0H
MOSTRO EQU 1H
HABILITA EQU 2H
LED EQU 4H ;LED CONECTADO A RA4 PATA 3 PORT_A
Z EQU 2H
C EQU 0H
W EQU 0H
R EQU 1H
E EQU 5H ;PATA 11 ;1H ;PATA7 RB1 MICRO A LA PATA 6 (E) HABILITACION DEL MODULO
RS EQU 4H ;PATA 10 ;2H ;PATA 8 RB2 MICRO A LA PATA 4 DEL MODULO (RS - INSTRUCCION O CARACTER)
; PATA 2 DEL MODULO A +VCC
; 3 REGULA CONTRASTE, AL PUNTO MEDIO DE UN POTE 5K ENTRE VCC Y MASA
; 5 Y 1 A MASA - YO EMPLEO 2 R FIJAS, DE 470 ohms a masa y 10k a +
; PATAS DEL PIC----->A LA DEL MODULO LCD
; 2--------------> 14
; 1--------------->13 ; DATOS
; 18-------------->12
; 17-------------->11
;
; CONTROL
; 11; 7-------------->6 (ENABLED)
; 10 ; 8-------------->4 (RS)
;
; PARA LA ILUMINACION POSTERIOR, UNA RESISTENCIA DE 220 OHMS A +5V
; PATA 10 DEL MICRO, RESISTENCIA 1K A VCC, Y PULSADOR A MASA (memoria)
; PATA 6 (rb0/int) DEL MICRO, RESISTENCIA 1K A VCC, Y SENSOR (YO EMPLEO INDUCTIVO)
;
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;CONFIGURO
; PARA LA GRABACION, CODE PROTECT OFF, RESET DE ENCENDIDO ,ETC
;*****************PROGRAMA PRINCIPAL********************************
;
ORG H'000'
NOP
GOTO INICIO
ORG H'004'
Interrupciones ;interrupciones
;
BCF INTCON,GIE ;Asegura la
BTFSC INTCON,GIE ;deshabilitacion
GOTO Interrupciones ;global de las interrupciones
;
;Salva registros
;
MOVWF SALVAW ;Salva W
SWAPF STATUS,W ;Invierte STATUS --> W
MOVWF SALVASTATUS ;Salva STATU
;
;SELECCION
;
; BTFSC INTCON,INTF ;? Hubo interrupcion en RB0 ?
; GOTO SUMA1 ;Si ir a contar
; GOTO RestaurarRegistros ;Retorna habilitando todas las interrupciones
btfsc INTCON,T0IF ;? Hubo sobrefujo en TMR0 ?
goto T0 ;Si
btfsc INTCON,INTF ;? Hubo interrupcion en RB0 ?
goto In ;Si
btfsc INTCON,RBIF ;? Hubo algun cambio de RB4-RB7 ?
goto Rb ;Si
Ee
; bsf STATUS,RP0 ;Banco 1
; bcf EECON1,EEIF ;Pone a cero el indicador para poder salir de la ISR
; bcf STATUS,RP0 ;Banco 0
goto RestaurarRegistros ;Retorna habilitando todas las interrupciones
T0 bcf INTCON,T0IF ;Pone a cero el indicador para poder salir de la ISR
goto RestaurarRegistros ;Retorna habilitando todas las interrupciones
In bcf INTCON,INTF ;Pone a cero el indicador para poder salir de la ISR
;--------------------------CONTADOR DE PULSOS-------------
SUMA1
BCF INTCON,GIE
MOVLW .7
MOVWF CONTA
CALL RETARDO ;RUTINITA PARA DARLE TIEMPO A ESTABILIZAR
DECFSZ CONTA,1 ;LOS CONTACTOS O SENSORES - ANTIRREBOTES
GOTO $-2 ;
BSF BANDERA,HABILITA ; REFRESH,0 ;MARCO UN BIT PARA PRESENTAR EN PANTALLA
;SI ES 1, LO MUESTRA SOLO UNA VEZ, cuando hay cambio en contadores
SUME INCF UNIDAD,1 ;Y NO QUEDA PARPADEANDO EL DISPLAY
CLRF STATUS
MOVLW .10 ; VERIFICA SI ES IGUAL A 10
XORWF UNIDAD,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO CONTO ; RETLW 0
CLRF UNIDAD ; SI LLEGO A 10 LA COLOCO EN CERO
;DECENAS
INCF DECENA,1 ;LE SUMO 1 A LA DECENA
CLRF STATUS
MOVLW .10 ; VERIFICA SI ES IGUAL A 10
XORWF DECENA,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO CONTO ; RETLW 0
CLRF DECENA
;CENTENAS
INCF CENTENA,1 ;LE SUMO 1 A LA DECENA
CLRF STATUS
MOVLW .10 ;VERIFICA SI ES IGUAL A 10
XORWF CENTENA,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO CONTO ; RETLW 0
CLRF CENTENA
;UNIDAD DE MIL
INCF UNIMIL,1 ;LE SUMO 1 A LA DECENA
CLRF STATUS
MOVLW .10 ;VERIFICA SI ES IGUAL A 10
XORWF UNIMIL,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO CONTO ; RETLW 0
CLRF UNIMIL
;DECENA DE MIL
INCF DECMIL,1 ;LE SUMO 1 A LA DECENA
CLRF STATUS
MOVLW .10 ;VERIFICA SI ES IGUAL A 10
XORWF DECMIL,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO CONTO ; RETLW 0
CLRF DECMIL
;CENTENA DE MIL
INCF CENMIL,1 ;LE SUMO 1 A LA DECENA
CLRF STATUS
MOVLW .10 ;VERIFICA SI ES IGUAL A 10
XORWF CENMIL,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO CONTO ; RETLW 0
CLRF CENMIL
;MILLON
INCF MILLON,1 ;LE SUMO 1 A LA DECENA
CLRF STATUS
MOVLW .10 ;VERIFICA SI ES IGUAL A 10
XORWF MILLON,W ;PREGUNTA SI=10
BTFSS STATUS,Z ;
GOTO CONTO ; RETLW 0
CLRF MILLON
; ; RETLW 0
CONTO
bcf INTCON,INTF ;Pone a cero el indicador para poder salir de la ISR
goto RestaurarRegistros ;Retorna habilitando todas las interrupciones
Rb bcf INTCON,RBIF ;Pone a cero el indicador para poder salir de la ISR
RestaurarRegistros
swapf SALVASTATUS,W ;Invierte STATUS --> W
movwf STATUS ;Restaura STATUS
swapf SALVAW,F ;Invierte --> F
swapf SALVAW,W ;Restaura W
retfie ;Retorna habilitando todas las interrupciones
;-----------------------------------------------------------------
RETARDO MOVLW .255 ;240
MOVWF TEMPO ;RETARDO MUY CORTO
DECRE DECFSZ TEMPO,R
GOTO DECRE
RETLW 0
;-----------------------------------------------------------------
DEMORA
MOVLW .3
MOVWF DELAY2 ;RETARDO LARGO
RETAR3 MOVLW .30
MOVWF DELAY1 ;RETARDO DE VISUALIZACION DE MARCA
DECRE1 CALL RETARDO ;SOLO APARECE EN EL RESET DE INICIO
DECFSZ DELAY1,R
GOTO DECRE1
DECFSZ DELAY2,R
GOTO RETAR3
RETLW 0
;----------------------- LCD ----------------------------------------
CONTROL BCF PORT_B,RS ;ESTA RUTINA GENERA LAS
GOTO DATO2 ;SEÑALES DE CONTROL Y ENVIA
DATO BSF PORT_B,RS ;EL DATO Al MODULO
NOP
NOP
NOP
DATO2 BSF PORT_B,E ;CON INTERFACE DE 4 BITS
MOVWF TEMPORAL ;GUARDO EL DATO COMO ORIGINAL
SWAPF TEMPORAL,W ;PASO LA PARTE ALTA
MOVWF PORT_A ;PARA SACARLO POR EL PUERTO
CALL RETARDO
BCF PORT_B,E
CALL RETARDO
BSF PORT_B,E ;PORQUE TRABAJAN 4 Y 4 BITS
; primero se envian los bit altos (mayor peso)
MOVF TEMPORAL,W ; luego los 4 bit de menor peso
MOVWF PORT_A ;porque asi lo requiere el LCD
CALL RETARDO
BCF PORT_B,E
CALL RETARDO
RETLW 0
;========================================================
TABLA2 ADDWF PCL,F ;TABLA DE ASCII
DT "0123456789" ;NUMEROS A PRESENTAR
;========================================================
TABLA3 ADDWF PCL,F ;TABLA DE ASCII
DT " * MICROPIC * " ;16 LETRAS
;========================================================
TABLA4 ADDWF PCL,F ;TABLA DE ASCII
DT " CONTADOR 2002 " ;15 LETRAS
;========================================================
TABLA5 ADDWF PCL,F ;TABLA DE ASCII
DT " MEMORIA " ;9 LETRAS
;========================================================
TABLA6 ADDWF PCL,F ;TABLA DE ASCII
DT " todopic.com.ar " ;15 LETRAS
;========================================================
INICIO NOP
;CLRF UNIDAD
MOVLW .255 ;PORQUE APARECE EL CONTADOR EN UNO
MOVWF UNIDAD ; Y ASI AL SUMAR EMPIEZA EN CERO (???)
CLRF DECENA
CLRF CENTENA
CLRF UNIMIL
CLRF DECMIL
CLRF CENMIL
CLRF MILLON
CLRF LAP
CLRF BANDERA ;REFRESH
CLRF PUERTO
BSF STATUS,5 ; ENTRA AL BANCO 1
MOVLW 80H ; CARGA 80h EN W
MOVWF OPCION ; CONFIGURA FLANCO DE BAJADA PARA INT
BCF STATUS,5 ; SALE DEL BANCO 1
MOVLW 90H ; CARGA 90h EN W
MOVWF INTCON ; MUEVE W AL REGISTRO INTCON
MOVLW B'11100000' ; PROGRAMACION DE PUERTOS
TRIS PORT_A ;SEGUN CIRCUITO, SALIDAS DATO A DISPLAY
MOVLW B'00001101' ;ENTRADA INT/RB0 Y ENTRADA PULS.MEMORIA pata 9
TRIS PORT_B ; ;UN pulso COLOCA Y OTRO SACA MEMORIA
CLRF PORT_A
CLRF PORT_B
CLRW
;---------------------------------------------------------------------------
MOVLW .4
MOVWF DESTELLO
BSF PORT_A,4 ;TEMPORIZACION PARA EL LCD
CALL DEMORA ;SE ESTABILIZA, PUES SINO APARECE BASURA
BCF PORT_A,4 ; LED DESTELLOS EN EL ARRANQUE
CALL DEMORA
DECFSZ DESTELLO,1
GOTO $-5
;-----------------------------------------------------------------
BEGIN MOVLW 02H ;INICIO DEL MODULO A 4 BITS
CALL CONTROL ;
MOVLW 28H ;4 BITS 2 LINEAS
;MOVLW 07H ;SELECCIONA MODO ROTAR,EL MENSAJE SALE DE LA DERECHA Y PASA A IZQ.
;MOVLW 06H ;modo fijo a la izq y se agregan a la derecha
CALL CONTROL ;EL MENSAJE
MOVLW 0CH ;ACTIVA EL DISPLAY
CALL CONTROL
MOVLW 06H ;MENSAJE FIJO, SIN ROTAR
CALL CONTROL
;---------------------------------------------------------------------
MOVLW 01H ;BORRA DISPLAY
CALL CONTROL
call RETARDO
;---------------------------------------------------------------------
; MOSTRAR >>>>> TODOPIC.COM.AR <<<<<
CLRF NUM_LETRA ;CONTADOR DE LETRA A CARGAR
MOVLW .15
MOVWF CONTA ;TOTAL DE LETRAS
INCF NUM_LETRA,1 ;ES POSIBLE EMPLEAR UN SOLO CONTADOR
MOVF NUM_LETRA,W ;PERO EL MENSAJE SERIA DE ATRAS PARA ADELANTE
CALL TABLA6 ;QUEDARIA ALREVES
CALL DATO
CALL RETARDO
DECFSZ CONTA,1
GOTO $-6 ;DE DONDE ESTA, 6 PARA ARRIBA (INCF)
MOVLW .20
MOVWF DESTELLO
BSF PORT_A,4 ;RETARDO EN PRESENTACION
CALL DEMORA
BCF PORT_A,4 ;LED ;DESTELLOS EN EL ARRANQUE
CALL DEMORA
DECFSZ DESTELLO,1
GOTO $-5
MOVLW 01H ;BORRA DISPLAY
CALL CONTROL
CALL RETARDO
;************************MOSTRAR MARCA**************************
; MICROPIC 2001 *
;***************************************************************
CLRF NUM_LETRA ;CONTADOR DE LETRA A CARGAR
MOVLW .14
MOVWF CONTA ;TOTAL DE LETRAS
INCF NUM_LETRA,1 ;ES POSIBLE EMPLEAR UN SOLO CONTADOR
MOVF NUM_LETRA,W ;PERO EL MENSAJE SERIA DE ATRAS PARA ADELANTE
CALL TABLA3 ;QUEDARIA ALREVES
CALL DATO
CALL RETARDO
DECFSZ CONTA,1
GOTO $-6 ;DE DONDE ESTA, 6 PARA ARRIBA (INCF)
;-----------------------------------------------------------------------
MOVLW .15
MOVWF DESTELLO
BSF PORT_A,4
CALL DEMORA
BCF PORT_A,4 ;;LED ;DESTELLOS EN EL ARRANQUE
CALL DEMORA
DECFSZ DESTELLO,1
GOTO $-5
;--------------------------------------------------------------------------
MOVLW 01H ;BORRA DISPLAY
CALL CONTROL
CALL RETARDO
;CD2002 ESCRIBE CONTADOR EN EL LCD,
CLRF NUM_LETRA ;CONTADOR DE LETRA A CARGAR
MOVLW .14
MOVWF CONTA ;TOTAL DE LETRAS
INCF NUM_LETRA,1 ;ES POSIBLE EMPLEAR UN SOLO CONTADOR
MOVF NUM_LETRA,W ;PERO EL MENSAJE SERIA DE ATRAS PARA ADELANTE
CALL TABLA4 ;QUEDARIA ALREVES
CALL DATO
CALL RETARDO
DECFSZ CONTA,1
GOTO $-6 ;DE DONDE ESTA, 6 PARA ARRIBA (INCF)
CALL H'004'
;-------------------------------------------------------------------------
MOVLW .15
MOVWF DESTELLO
BSF PORT_A,4
CALL DEMORA
BCF PORT_A,4 ;;LED ;DESTELLOS EN EL ARRANQUE
CALL DEMORA
DECFSZ DESTELLO,1
GOTO $-5
;---------------------------------------------------------------
BSF INTCON,GIE ;activo las interrupciones
BSF INTCON,INTF
CALL H'004' ;FUERZA INTERRUPCION PARA HABILITAR
;---------------<PRESENTACION EN EL LCD>------------------------
MOSTRAR
BCF BANDERA,HABILITA ;REFRESH,0 ;BORRO BIT PORQUE YA LO MUESTRO el contador
BLANK MOVLW 01H ;BORRA DISPLAY
CALL CONTROL
CICLO
MOVLW ">" ;PARA DESPLAZAR UN CARACTER (00H) QUE NO ES VISIBLE
CALL DATO ;Y EMPIECE A ESCRIBIR EN 01H DEL DISPLAY
CALL RETARDO
MOVF MILLON,W ;IMPRIMO VALOR DE "MILLON"
CALL TABLA2 ;PASO DEL NUMERO AL ASCII
CALL DATO ;INFORMO AL LCD QUE ENVIO UN "DATO"
CALL RETARDO ;RETARDO POR EL LENTO LCD
MOVF CENMIL,W ;
CALL TABLA2 ;IMPRIMO VALOR DE CENTENA DE MILLON
CALL DATO
CALL RETARDO
MOVF DECMIL,W ;DECENA DE MILLON
CALL TABLA2
CALL DATO
CALL RETARDO
MOVF UNIMIL,W ;UNIDAD DE MILLON
CALL TABLA2
CALL DATO
CALL RETARDO
MOVF CENTENA,W ;CENTENA
CALL TABLA2
CALL DATO
CALL RETARDO
MOVF DECENA,W ;DECENA
CALL TABLA2
CALL DATO
CALL RETARDO
MOVF UNIDAD,W ;UNIDAD
CALL TABLA2
CALL DATO
CALL RETARDO
; GOTO PRINCIPAL ; QUEDA EN LOOP PRESENTANDO HASTA QUE
; OCURRA UNA INTERRUPCION
;************************** SENSAR *************************
PRINCIPAL
LEER
PULSADOR ;LEER ESTADO DE Los PULSADORES (coloca o saca memoria)
; BTFSS PORT_B,3 ;ESTA SIN PRESIONAR rb3 =(1) SALTO
; GOTO MARCAR
; BTFSS REFRESH,2 ;LEO SI YA INDICO QUE PULSARON
; GOTO SALIDA
; BCF REFRESH,2 ;BORRO LA MARCA,SOLTARON EL PULSADOR
; INCF LAP,1 ;SUMA POR CADA FLANCO ASCEND O DESCEND
; BCF REFRESH,1 ;BORRO PARA QUE ESCRIBA "MEMORIA" ---->refresh 1 es memoria
; GOTO SALIDA
;MARCAR
; BSF REFRESH,2 ;------- marca que fue pulsado Pulsador
;SALIDA ;SI ESTA PULSADO, QUEDA FIJO LA LECTURA
; BTFSC LAP,0 ;PERO CONTINUA CONTANDO PULSOS
; GOTO MEMORY ;PRINCIPAL
; BTFSS REFRESH,0 ;SI BIT=1 MOSTRAR, LUEGO LO PONGO EN 0 ---->>es el contador
; GOTO PRINCIPAL ;PARA NO PERDER TIEMPO EN MOSTRAR LO MISMO
; GOTO MOSTRAR
BTFSS PORT_B,2 ;PULSO SI MEMO?
GOTO MARCA1 ;SI PULSO VA A MARCA1
BTFSS PORT_B,3 ;PULSO SACAR MEMO?
GOTO MARCA2 ;SI PULSO VA A MARCA2
GOTO MARCA3
MARCA1 BSF BANDERA,MEMO
GOTO MARCA3
MARCA2 BCF BANDERA,MEMO
; BSF BANDERA,HABILITA
MARCA3 BTFSS BANDERA,MEMO
GOTO MARCA5
BTFSC BANDERA,MOSTRO
GOTO LEER
; BSF BANDERA,MOSTRO
GOTO MEMORY
MARCA5 BCF BANDERA,MOSTRO
BTFSS BANDERA,HABILITA
GOTO LEER
GOTO MOSTRAR
;************************************************************************
MEMORY ;ESCRIBE "MEMORIA" EN EL LCD, MANTIENE FIJO EL VALOR DEL CONTADOR
; BTFSC REFRESH,1 ;PARA UNA FACIL VISUALIZACION, PERO SIGUE
; GOTO PRINCIPAL ;INTERNAMENTE ACTUALIZANDO LA CUENTA DE
BCF INTCON,GIE
CLRF NUM_LETRA ;CONTADOR DE LETRA A CARGAR
MOVLW .9 ; MEMORIA ->9 LETRAS
MOVWF CONTA ;TOTAL DE LETRAS
INCF NUM_LETRA,1 ;ES POSIBLE EMPLEAR UN SOLO CONTADOR
MOVF NUM_LETRA,W ;PERO EL MENSAJE SERIA DE ATRAS PARA ADELANTE
CALL TABLA5 ;QUEDARIA ALREVES
CALL DATO
CALL RETARDO
DECFSZ CONTA,1
GOTO $-6 ;DE DONDE ESTA, 6 PARA ARRIBA (INCF)
BSF BANDERA,MOSTRO ; BSF REFRESH,1 ;MEMORIZO QUE YA ESCRIBIO ---->refresh 1 es memoria
BSF INTCON,GIE
GOTO PRINCIPAL
;----------------------------------------------------------------------
END