Buenas gente, me estoy dando la cabeza hace ya algún tiempo y no logro solucionarlo.
![redhot :5]](http://www.todopic.com.ar/foros/Smileys/default/redhot.gif)
Intento hacer un contador, aca les dejo una version mas simple. tiene 4 display y cuando pasa un iman por un sensor, en teoría cuenta. Como me andaba mal, le aumente los tiempos cosa de ver el error.
les cuento, arranca en cero los 4 display, todo bien. cuando pasa el sensor, me aparece un 1 en los cuatro display, pero...despues se apaga y aparece un cero, y luego unos, y luego ceros y asi.
Con los tiempos originales era un enchastre visual entre ceros y otras cosas.
1)¿porque solo veo la unidad?
2)¿porque veo la unidad en los 4 display?
3¿porque varia entre el cero y otra cosa?
lo simulo con el pic simulator y funciona perfecto.
Agradezco cualquier sugerencia.
aca el código para un 16f627A
; **** Encabezado ****
LIST P=16F627A ; Microcontrolador utilizado.-
INCLUDE <P16F627A.INC> ; Definicion de registros SFR.-
__CONFIG _INTOSC_OSC_NOCLKOUT & _PWRTE_ON & _WDT_OFF & _CP_OFF & _MCLRE_ON & _BOREN_OFF & _LVP_OFF
;**** Definicion de Variables ****
CBLOCK 0x20 ; En esta posicion se declaran los registros de usuario (GPR)
UNIDAD ;Guardo Conteo unidad
DECENA
CENTENA
MILLAR
CONTADOR1 ;registro utlizado en demora 5mS
CONTADOR2 ;registro usado en demora 5mS
CONTADOR ;registro usado en Rutina Activ de Display RAD
CONTADOR3 ;Registro utilizado en demora antirrebote
CONTADOR4 ;Registro utilizado en demora antirrebote
ENDC
MUESTROU EQU 3 ;CONTROL 1º DISPLAY
MUESTROD EQU 2 ;control 2º display
MUESTROC EQU 1 ;control 3º display
MUESTROM EQU 0 ;control 4 display
SENSOR EQU 7 ;BIT 7 port B
CUENTA EQU 6 ;BIT6 porta para saber si cuenta o descuenta.
;
BANCO0 MACRO
BCF STATUS,5
BCF STATUS,6
ENDM
BANCO1 MACRO
BSF STATUS,5
BCF STATUS,6
ENDM
;**** Inicio del Microcontrolador ****
RESET ORG 0x00
GOTO INICIO ; Salto a inicio del programa.-
;**** Programa principal ****
ORG 0X05
INICIO
;CONFIGURACIONES PIC
BANCO1
MOVLW 0x70
MOVWF TRISA ;seeessss
MOVLW 0x80
MOVWF TRISB ;Esssssss RB7 como entrada para rbif
MOVLW 0xDF
MOVWF OPTION_REG ; Pull-Up deshabiltado, , Timer0|interno, 1:1
BANCO0
MOVLW 0x7 ; Configuro Comparador Analogico
MOVWF CMCON ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off
;PROGRAMA
CLRF PORTB
CLRF PORTA ;Desactivo todos los displays y sensores, botones.
CLRF UNIDAD
CLRF DECENA
CLRF CENTENA
CLRF MILLAR
;RUTINA DE ACTIVACION DE DISPLAY
BUCLE BTFSS PORTB,SENSOR ;ESTA PASANDO EL SENSOR?
GOTO RAD
CALL ANTIRREBOTE
INCF UNIDAD,1 ;Icremento unidad
MOVLW D'10' ;cargo 10 para resetear unidad si llega a 10
SUBWF UNIDAD,0
BTFSS STATUS,Z
GOTO RAD ;NO ES 10, muestro unidad
CLRF UNIDAD ;Si reseteo
INCF DECENA,1 ;Incremento decena
MOVLW D'10' ;cargo 10 para resetar decena si llega a 10
SUBWF DECENA,0
BTFSS STATUS,Z
GOTO RAD
CLRF DECENA ;Reseteo
INCF CENTENA,1 ;Incremento Centena
MOVLW D'10' ;cargo 10 para resetar si llega a 10
SUBWF CENTENA,0
BTFSS STATUS,Z
GOTO RAD
CLRF CENTENA ;Reseteo
INCF MILLAR,1 ;Incremento Millar
MOVLW D'10' ;Cargo 10 para resetar si Millar llega a 10
SUBWF MILLAR,0
BTFSS STATUS,Z
GOTO RAD
CLRF MILLAR ;RESETEO
GOTO RAD
RAD
MOVLW D'20' ;Cargo contador de repeticiones display
MOVWF CONTADOR
REFRESCO
MOVF UNIDAD,0 ;Obtengo código 7 seg para unidad
CALL BCD7SEG
BCF PORTA,MUESTROM ;Apago display MILLAR
MOVWF PORTB ;Cargo unidad en PORTB
BSF PORTA,MUESTROU ;Enciendo display unidad.
CALL ANTIRREBOTE
MOVF DECENA,0 ;Obtengo código 7 seg para decena
CALL BCD7SEG
BCF PORTA,MUESTROU ;apago display unidad
MOVWF PORTB ;cargo decena en portb
BSF PORTA,MUESTROD ;Enciendo display decena
CALL ANTIRREBOTE
MOVF CENTENA,0 ;Obtengo código 7 seg para centena
CALL BCD7SEG
BCF PORTA,MUESTROD ;APAGO DISPLAY DECENA
MOVWF PORTB ;Cargo centena en portB
BSF PORTA,MUESTROC ;Enciendo display Centena
CALL ANTIRREBOTE
MOVF MILLAR,0 ;Obtengo código 7 seg para centena
CALL BCD7SEG
BCF PORTA,MUESTROC ;Apago display centena
MOVWF PORTB ;Cargo millar en portB
BSF PORTA,MUESTROM ;Enciendo display Millar
CALL ANTIRREBOTE
DECFSZ CONTADOR,1 ;¿Se repitió 5 veces?
GOTO REFRESCO
GOTO BUCLE
BCD7SEG ; retlw b'gfedcba' para display catodo comun
ADDWF PCL,1 ; Se incrementa el contador del programa.-
DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
;
;DEMORA 5mS
DEMORA5MS
MOVLW 0XFF
MOVWF CONTADOR1
REPETICION1
MOVLW 0X05
MOVWF CONTADOR2
REPETICION2
DECFSZ CONTADOR2,1
GOTO REPETICION2
DECFSZ CONTADOR1,1
GOTO REPETICION1
RETURN
;
;DEMORA ANTIRREBOTE 20mS
;
ANTIRREBOTE
MOVLW 0XFF ;Carga contador
MOVWF CONTADOR3 ;Inicia contador 1
REP1 MOVLW 0XFF
MOVWF CONTADOR4 ;Inicia contador 2
REP2 DECFSZ CONTADOR4,1 ;decrementa contador 2 hasta que vale 0
GOTO REP2 ;vuelve a decrementar.
DECFSZ CONTADOR3,1 ;decrementa con1 y vuelve a cargar cont2
GOTO REP1 ;cuando termina de decremtar 1 sale del ciclo
RETURN
END