TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: bluesboy en 27 de Mayo de 2013, 15:56:47

Título: problema para multiplexar 4 display 7 seg
Publicado por: bluesboy en 27 de Mayo de 2013, 15:56:47
Buenas gente, me estoy dando la cabeza hace ya algún tiempo y no logro solucionarlo. :5]

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
Título: Re: problema para multiplexar 4 display 7 seg
Publicado por: tapi8 en 28 de Mayo de 2013, 13:09:45
Veras creo que el problema esta en que no cuenta casi nunca, porque el sensor lo chequea cada 15,884971seg es decir cada casi 16seg, por tanto ese iman pasara por el sensor pero si lo detecta sera de casualidad. Tu programa esta casi siempre haciendo bucles de tiempo.

Esa demora antirrebotes a mi me sale de 196,1ms (A 4Mhz) es grande para el antirrebotes, si es que necesitas antirrebotes para ese sensor??? pero es que tambien la usas en el multiplexado, con tanto tiempo los displays parpadearan.

Un antirrebotes con 20ms debe llegar (aunque yo no se como es ese sensor) y para el multiplexado tiempos de 5ms van bien, de hecho tienes una demora de 5ms pero no la llamas nunca creo???
Título: Re: problema para multiplexar 4 display 7 seg
Publicado por: bluesboy en 31 de Mayo de 2013, 13:04:56
Gracias, Tapi8, el codigo del prog final, (casi final) esta en el foro de almacen de assembler.

No funcionab porque tenía unos transistores mosfet para multiplexar y estos tienen una capacidad en el gate que alenta l tiempo de respuesta en velocidad rápida, para solucionarlo hay que hacerle un driver.
Lo solucione poniendo unos BC337.

Muchas gracias por el aporte. :-/
Sebastián.
Título: Re: problema para multiplexar 4 display 7 seg
Publicado por: AleSergi en 31 de Mayo de 2013, 14:18:36
Hola BluesBoy, te esta dando que renegar tu projecto...  Chaque!

Yo por mi parte ya tengo mi velocímetro indigente con pic, programado en CCS, funka super la simulación, queria probar un prototipo físico, pero el porquería del programador, murio, y tambien la vieja PC al que lo conectaba (muerte de disco duro!). hace unos días me daban ganas de zapatear arriba de todas estas cosas juntas!, todavía no encontre solución y ahora estoy emboladaso, porque tampoco logro hacer funcionar un Arduino, como programador de pic.

Te dejo lo que suelo hacer Yo al momento de controlar cuatro Led Display de Siete Segmentos, lo hago siempre con el ULN2803, en un solo chip de 18 pines ocho "buffer's" que pueden controlar directamente un relé, aparte de los display, claro. Es para no jorobar con los transistores y sus resistencias en la base del mísmo, simplifica las cosas.

En los últimos tiempos se me dio por conectalo como muestro en el archivo que te dejo del Proteus, con tres líneas del pic (me ahorro un pin), hago el "barrido" de cuatro display, empleando el truco que vez, corre la simulación, move la llave conmutadora SW1 y le entenderás que hace.
Los pines del pic deben generar la secuencia  001  010  100  000 y con ello logras conmutar el ULN2803, según la conexión.
Esto es, que el cuarto dígito lo conmuto con una compuerta NAND que toma señal de los tres primeros pines, implementado en el ULN2803 con unas resistencias.
Título: Re: problema para multiplexar 4 display 7 seg
Publicado por: bluesboy en 03 de Junio de 2013, 07:48:04
Hola AleSerg, gracias por la colaboración. Uso transistores porque ocupan muy poco espacio y los 4 valen menos de $2, por otro lado, estuve mirando y casi seguro creo poder usar los transistores sin resistencia de base, porque el pic maneja unos 25mA y teniendo en cuenta el hfe del transistor, con esa corriente de base puedo manejar mas de 300mA de corriente de colector, asi que voy a probar otra verion sin resistencias.

Lo que me gusta de tu idea es que logras tener un pin mas.
gracias por tu colaboracion.
Título: Re: problema para multiplexar 4 display 7 seg
Publicado por: AleSergi en 03 de Junio de 2013, 11:33:19
Je jeh...  si esta bueno eso de los tres pines para manejar cuatro led display... (sin caer en un registro de desplazamiento)
pero no es mío el crédito, Yo solo lo adapte para el ULN2803, que como dije siempre instalo eso en vez de transistores.
La versión original salio de la página
http://www.qsl.net/dl4yhf/freq_counter/freq_counter.html
cuando andaba buscando info para mi velocímetro, un frecuencímetro de baja frecuencia, es lo mísmo que un velocímetro, por eso recaí en ese sitio.
Y de verdad que podes controlar los display sin transistor alguno como propone ahí, siempre y cuando sean los led display que indica, accidentalmente tenía de esos aquí, los probe y andaban super (FYS-3911AX/BX-XX).