TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado 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
-
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???
-
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.
-
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.
-
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.
-
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).