TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: neosud en 06 de Marzo de 2006, 15:10:00
-
HOLA AMIGOS COMO ESTAN, QUISIERA HACER UNA CONSULTA EN CUANTO A LOS DISPLAY.
CUANDO QUIERO HACER UN CONTADOR Q CUENTE LOS PULSOS ENTRANTES POR RA0 DE UN PIC16F877A Y SIENDO EL CONTADOR DE 6 DIGITOS, OBSERVO Q LA VELOCIDAD DE CONTEO ES LENTA YA Q DE UNA TARJETA EXTERNA GENERO LOS PULSOS Y CUANDO ESTOS INGRESAN A LA TARJETA DEL CONTADOR A UNA FRECUENCIA CADA VEZ MAYOR, EL CONTADOR PIERDE DE LEER MUCHOS PULSOS A PESAR DE ESTAR TRABAJANDO A UNA VELOCIDAD DE 20MHZ.
ESTE ES EL PROGRAMA:
DEVICE 16F877A
XTAL=20
DIM _U AS BYTE
DIM _D AS BYTE
DIM _C AS BYTE
DIM _M AS BYTE
DIM UM AS BYTE
DIM DM AS BYTE
DIM CONTADOR AS DWORD
ADCON1=%0110
OUTPUT PORTB
OUTPUT PORTC
TRISA=%000001
DENUEVO:
CONTADOR=0
MAIN:
GOSUB MOSTRAR
IF PORTA.0=0 THEN INCREMENTAR
GOTO MAIN
INCREMENTAR:
INC CONTADOR
IF CONTADOR=1000000 THEN DENUEVO
ESPERA:
GOSUB MOSTRAR
IF PORTA.0=0 THEN ESPERA
GOTO MAIN
MOSTRAR:
_U=DIG CONTADOR,0
_D=DIG CONTADOR,1
_C=DIG CONTADOR,2
_M=DIG CONTADOR,3
UM=DIG CONTADOR,4
DM=DIG CONTADOR,5
LOOKUPL _U,[CERO,UNO,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE],_U
LOOKUPL _D,[CERO,UNO,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE],_D
LOOKUPL _C,[CERO,UNO,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE],_C
LOOKUPL _M,[CERO,UNO,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE],_M
LOOKUPL UM,[CERO,UNO,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE],UM
LOOKUPL DM,[CERO,UNO,DOS,TRES,CUATRO,CINCO,SEIS,SIETE,OCHO,NUEVE],DM
PORTC=%11111110
PORTB=_U
DELAYMS 1
PORTC=%11111101
PORTB=_D
DELAYMS 1
PORTC=%11111011
PORTB=_C
DELAYMS 1
PORTC=%11110111
PORTB=_M
DELAYMS 1
PORTC=%11101111
PORTB=UM
DELAYMS 1
PORTC=%11011111
PORTB=DM
DELAYMS 1
RETURN
ESTE PROGRAMA ADEMAS DE NO SER TAN RAPIDO PARA CONTAR TAMBIEN ME GENERA Q EL DISPLAY MAS SIGNIFICATIVO SE VEA MAS ILUMINADO Q LOS DEMAS, Q ES OTRO DE LOS PROBLEMAS Q TENGO.
COMO PUEDO SOLUCIONAR LO DE LA VELOCIDAD Y LA LUMINOSIDAD.
DESDE YA LES AGRADEZCO POR SUS AYUDA.
-
Hola, pues por lo que veo tu programa parece bueno... pero te tengo una pregunta, cual es la frecuencia de la señal que quieres contar???
Pues con eso pueden cambiar algunas cosas... A ver revisa eso y nos dices.
-
Bueno
Sucede que cuando uno multiplexa.
el voltaje de acuerdoa la frecuencia con que actualices baja.
Pareciendo a menos voltaje, menos intencidad, y mas parpadeo.
Este es un problema solucionable dependiendo de las dimenciones de los displays.
Cuanto mas grandes, mas es el problema.
**************************
trata de bajarle un poco la frecuencia. (Para 9 Displays lo actualizaba de 500us a 900us y se veia bien)
bye
-
Hola amigo
Baja la frecuencia de actualización para q esten un poco mas brillantes, yo pondria el contador en un timer bien se el 0 o el 1 para que sea el conteo independiente del proceso general del programa, ya que si se genera un pulso mientras lso display se actulizan no lo vas a contar, q frecuencia tienen los pulsos?
Salu2
-
caracteristicas del pulso: 6ms de periodo
el ultimo display es el q se ilumina demasiado en comparacion a los demas.
el contador deberia contar 10000 pulsos por minuto pero pierde mucho muchos pulsos, supongo q debe ser porque mientras ejecuta el codigo de programa llegan los pulsos y el pic no los lee y solo lee algunos a pesar de estar con 20mhz.
lo del timer seria una buena opcion pero no se como hacerlo ya q eltimer es de 16 bits y solo cuenta hasta 65535, pueden ayudarme al respecto.
desde ya gracias por sus ayuda
-
Hola
Trabaja con interrupciones, colocas el contador de tres registros en la rutina de interrupción y te garantiza que no pierdas ningun pulso.
Salu2
-
CON ESTE PROGRAMA MEJORO BASTANTE EL MANEJO DE CORRIENTE EN LOS DISPLAY Y AUMENTO LA VELOCIDAD DE CONTEO:
DEVICE 16F876A
XTAL=20
DIM CONTADOR AS DWORD
DIM _U AS BYTE
DIM _D AS BYTE
DIM _C AS BYTE
DIM _M AS BYTE
DIM UM AS BYTE
DIM DM AS BYTE
DIM __U AS BYTE
DIM __D AS BYTE
DIM __C AS BYTE
DIM __M AS BYTE
DIM _UM AS BYTE
DIM _DM AS BYTE
DIM DIGITO AS BYTE
DIM DIGIT AS BYTE
ADCON1=%0110
OUTPUT PORTA
OUTPUT PORTB
CONTADOR=0
INICIO:
FOR CONTADOR=0 TO 999999
GOSUB OBTENER_DIGITO
GOSUB VISUAL
NEXT
CONTADOR=0
GOTO INICIO
OBTENER_DIGITO:
_U=DIG CONTADOR,0
_D=DIG CONTADOR,1
_C=DIG CONTADOR,2
_M=DIG CONTADOR,3
UM=DIG CONTADOR,4
DM=DIG CONTADOR,5
DIGITO=_U
GOSUB TABLA
__U=DIGIT
DIGITO=_D
GOSUB TABLA
__D=DIGIT
DIGITO=_C
GOSUB TABLA
__C=DIGIT
DIGITO=_M
GOSUB TABLA
__M=DIGIT
DIGITO=UM
GOSUB TABLA
_UM=DIGIT
DIGITO=DM
GOSUB TABLA
_DM=DIGIT
RETURN
VISUAL:
PORTA=%000001
PORTB=__U
DELAYUS 300
PORTA=%000010
PORTB=__D
DELAYUS 300
PORTA=%000100
PORTB=__C
DELAYUS 300
PORTA=%001000
PORTB=__M
DELAYUS 300
PORTA=%010000
PORTB=_UM
DELAYUS 300
PORTA=%100000
PORTB=_DM
DELAYUS 300
RETURN
TABLA:
LOOKUPL DIGITO,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],DIGIT
RETURN
AUN NO HE PROBADO HACER CON INTERRUPCIONES YA Q ESTAS NO ME HAN FUNCIONADO EN PIC BASIC PLUSS, SI ALGUIEN PUEDE AYUDARME CON UN EJEMPLO SUPER SENCILLO DE INTERRUPCIONES, POR EJEMPLO POR INTERRUPCION EXTERNA POR RB0 PARA EL PIC16F84A U OTRO LE AGRADECERIA.
SALUDOS.