TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: JAR en 25 de Marzo de 2015, 17:16:43
-
Buenas a todos:
Saqué este código para displays 7 segmentos cátodo común, para hacer unas pruebas de funcionamiento en ánodo común antes de embarcarme en mi proyecto y con la ayuda de varios de vosotros, le hice algunos cambios para ánodo común, pero no me funciona. Me carga el Pic y todo, pero no encienden. Aquí os dejo el código para ver si alguien me puede decir en que estoy fallando. Gracias!!!
; **** Encabezado ****
list p=16F84
#include P16F84.inc
;**** Definicion de variables ****
Unidad equ 0x0C ; Guardamos conteo unidad
Decena equ 0x0D ;
Centena equ 0x0E ;
Contador1 equ 0x0F ; Registro utilizado en demora.-
Contador2 equ 0x10 ; Registro utilizado en demora.-
Contador equ 0x11 ; Control de Refresco de Display.-
MuestroU equ 2 ; Para control del 1º Display
MuestroD equ 1 ; Para control del 2º Display
MuestroC equ 0 ; Para control del 3º Display
;**** Inicio del Micro ****
Reset
org 0x00 ; Aquí comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Tabla de conversion BCD a 7 Segmentos ****
; Se coloca al inicio para asegurar ubicacion en Pagina.-
org 0x05 ; Origen del código de tabla.-
BCD7SEG ;retlw b'gfedcba'para display anodo comun
addwf PCL,1 ; Se incrementa el contador del programa.-
DT 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x98
;**** Programa principal ****
;**** Configuracion de puertos ****
Inicio
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
clrf TRISA ; PORTA como salida
clrf TRISB ; PORTB como salida.-
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
clrf PORTA ; Desactivo todos los Displays
clrf Unidad ; Comienza en cero --> 0 0 0.-
clrf Decena
clrf Centena
goto Actualizo_Display ; Esta rutina multiplexa los displays.-
;**** Testeo de Pulsador ****
Bucle
incf Unidad,1 ; Incremeto Unidad.
movlw d'10' ; Si es 10 reseteo e incremento Decena
subwf Unidad,0
btfss STATUS,Z
goto Actualizo_Display ; no es 10
clrf Unidad ; Si, reseteo.-
incf Decena,1 ; Incremento Decena.-
movlw d'10' ; Si Decena = 10, reseteo e incremento Centena
subwf Decena,0
btfss STATUS,Z
goto Actualizo_Display ; No es 10.-
clrf Decena ; Si, reseteo.-
incf Centena,1 ; Incremento Centena.-
movlw d'10' ; Si es 10 Reseteo.-
subwf Centena,0
btfss STATUS,Z
goto Actualizo_Display ; No es 10.-
clrf Centena ; Si, reseto
;**** Se multiplexan los Display ****
Actualizo_Display
movlw d'20' ; Cargo Contador = 20
movwf Contador ; Para repeticiones de visualizacion del mismo valor
; durante 150 ms.-
Refresco
movfw Unidad ; Obtengo codigo de 7 Segmentos para Unidad.-
call BCD7SEG
bcf PORTA,MuestroC ; Apago Display de Centena, Se entiende al mirar rutina.-
movwf PORTB ; Cargo unidad en PORTB.-
bsf PORTA,MuestroU ; Enciendo Display de Unidad.-
call Demora_5ms
movfw Decena ; Obtengo codigo 7 Segmentos para Decena.-
call BCD7SEG
bcf PORTA,MuestroU ; Apago Display de Unidad.-
movwf PORTB ; Cargo PORTB con Decena.-
bsf PORTA,MuestroD ; Enciendo Display de Decena.-
call Demora_5ms
movfw Centena ; Obtengo codigo de 7 Segmentos para Centena.-
call BCD7SEG
bcf PORTA,MuestroD ; Apago Display de Decena.-
movwf PORTB ; Cargo PORTB con Centena.-
bsf PORTA,MuestroC ; Enciendo Display Centena.-
call Demora_5ms
decfsz Contador,1 ; Pregunto si ya se ha repetido 10 veces el ciclo?
goto Refresco ; No, repito.-
goto Bucle ; Si, actualizo cuenta.-
;**** Demora ****
Demora_5ms
movlw 0xFF
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0x05 ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
end
-
antes de pensar en que el codigo pueda estar mal, mira a ver el hardware, ten en cuenta que no es el mismo que para catodo comun.
para catodo común se usas transistores NPN y para anodo comun se usa PNP.
¿puedes colgar tu esquemático para descartar fallos de hardware?
-
Como dice juaperser y apdemas deberias cambiar la logica al activar los transistores
bcf PORTA,MuestroU ; Apago Display de Unidad.-
-
Como dice juaperser y apdemas deberias cambiar la logica al activar los transistores
bcf PORTA,MuestroU ; Apago Display de Unidad.-
KILLERJC, las pruebas, las estoy haciendo con un esquema tuyo. lo que cambio es, el transistor. En vez de utilizar el BC557, utilizo el BC547 que segun el datasheet, son similares. Os dejo el esquema.
-
De cuanto son las resistencias?
-
KILLERJC, las pruebas, las estoy haciendo con un esquema tuyo. lo que cambio es, el transistor. En vez de utilizar el BC557, utilizo el BC547 que segun el datasheet, son similares. Os dejo el esquema.
No son ni siquiera similares, uno es PNP y el otro NPN xD
-
Si como a mí, te cae como patada en el hígado la lógica ánodo común (0 = encendido?) utiliza un integrado ULN2003 que son 7 darlingtons sumideros de corriente en un cómodo y conveniente encapsulado DIP. Si necesitas usar el punto decimal, su hermano el ULN2803 tiene 8 canales. Son económicos y te evitas de estar cambiando lógica, simplemente coloca los pines que usas para control a los "trigger" del ULN y los segmentos del display a las salidas, desde luego 0v a 0v y listo, ya tienes control de ánodo común sin cambiar lógica.
-
Con un NPN funciona mejor:
El emisor debe estar mirando hacia el ánodo común.
No hace falta resistencia de base
La alimentación de colector puede ser no estabilizada (el regulador de tensión sufre menos)
Las resistencias deben ser un poco más pequeñas debido a la caída de tensión Vbe.
Saludos.
-
KILLERJC, las pruebas, las estoy haciendo con un esquema tuyo. lo que cambio es, el transistor. En vez de utilizar el BC557, utilizo el BC547 que segun el datasheet, son similares. Os dejo el esquema.
No son ni siquiera similares, uno es PNP y el otro NPN xD
Llevas toda la razón KILLERJC. No me pare a mirar el datasheet. Gracias por la rectificación. Un error patético!!!!
-
De cuanto son las resistencias?
1K para transistores y 150 Oh. para display!!
-
El esquema no parece k tenga nada raro, las resistencias de 150 ohmios son pequeñas pon las un poco mas grande y las de 1k las pondría de un 1k5, pero no es grave para el funcionamiento, no se de ensamblador como para mirarte el código, pero revisas k tienes los puertos bien configurados revisa k estén como salidas y no como entradas y además k estén en digital. Cuando te asegures de eso olvidarte de pintar ningún numero he intenta pintar un solo segmento de alguno de los displays. Si lo consigues tu problema es de software.
-
Llevas toda la razón KILLERJC. No me pare a mirar el datasheet. Gracias por la rectificación. Un error patético!!!!
Por cierto no estarás poniendo un bc547 no? Si pones transistores que no sean PNP no te va a funcionar nunca.
Si estas montando bc547 cambialos por un bc55x.
-
Con un NPN funciona mejor:
El emisor debe estar mirando hacia el ánodo común.
No hace falta resistencia de base
La alimentación de colector puede ser no estabilizada (el regulador de tensión sufre menos)
Las resistencias deben ser un poco más pequeñas debido a la caída de tensión Vbe.
Saludos.
Picuino, Gracias por la información. Por fin me han arrancado, aunque tendré que perfeccionarlo ya que centenas y decenas, están siempre en 0 y unidades, solo me cuenta hasta el 6, pero ya hemos conseguido algo.
Mi agradecimiento a todos los que me estais echando una mano!!!!