Microcontroladores - PIC16F877A_DISPLAYS

 
Vista:

PIC16F877A_DISPLAYS

Publicado por dekike (1 intervención) el 15/05/2006 20:45:06
Hola amigos. Tengo un problema y no he podido encontrar la solucion. Tengo que mostrar un numero de cuatro digitos a traves de cuatro displays. Estoy haciendo la simulacion por Proteus 6. Tengo que hacer manejo dinamico de displays con un PIC16F877A pero se ve muy lento el cambio entre cada activacion por display. Ademas, por medio de un pulsador conectado al RB0 (interrupcion por RB0) tengo que incrementar el numero que se visualiza. Cuando presiono el pulsador el numero se incrementa, pero lo raro es que en tres segundos se vuelve cero.

Los datos para los displays los envio por el puerto D, el control de cada transistor para activar los displays lo hago por puerto A y la interrrupcion la hago por RB0.

Les coloco el contenido del codigo para que lo revisen y gracias por sus colaboraciones.

;PROGRAMA DISPLAYS_F877A
;Interrrupcion del microcontrolador pic16f877a a traves de pin rb0.
;
;Autor: David Murillo Marquez
;----------------------------------------------------------------------
LIST P=16F877A

#INCLUDE "P16F877A.INC"

__CONFIG _XT_OSC

CBLOCK 0X20
COUNTER_1 ;Contador para unidades
COUNTER_10 ;Contador para decenas
COUNTER_100 ;Contador para centenas
COUNTER_1000 ;Contador para miles
STORE_w ;Reg para guardar temporalmente el contenido de W
STORE_st ;Reg para guardar temporalmente STATUS despues del swapf
PDel0
PDel1
RETAR1
RETAR2
RETAR3
SELECTOR ;Para seleccionar el transistor a activar
ENDC

#DEFINE BANK_1 BSF STATUS,RP0 ;Bit 5
#DEFINE BANK_0 BCF STATUS,RP0

RESET_VECTOR
ORG 00h
GOTO START
ORG 04h
GOTO ISR ;Interrupcion Service Routine

START
BANK_1
CLRF TRISA ;Control de transistores
CLRF TRISD ;Salida para displays
MOVLW 11110001h ;rbo:input; rb1-7: output
MOVWF TRISB
BCF OPTION_REG,INTEDG ;Interrupcion con flanco descendente en rb0
BCF OPTION_REG,NOT_RBPU ; resistencias Pullup

BANK_0
BCF INTCON,INTF ;Bandera INTF a cero.
BSF INTCON,GIE ;Interrupciones globales
BSF INTCON,INTE ;Habilita interrupcion por rb0
;Inicializacion de contadores y registros
CLRF COUNTER_1
CLRF COUNTER_10
CLRF COUNTER_100
CLRF COUNTER_1000 ;Inicializacion de puertos
CLRF PORTA
CLRF PORTB
CLRF PORTD

;------------------------------------------------------------------------------
;=========== PRINCIPAL =======
MAIN

BSF INTCON,GIE ;Interrupciones globales
BSF PORTA,0 ;Active transistor 1
MOVF COUNTER_1,W
CALL TABLE
MOVWF PORTD
CALL PAUSE
BCF PORTB,0 ;Desactive transistor 1

BSF PORTA,1 ;Active transistor 2
MOVF COUNTER_10,W
CALL TABLE
MOVWF PORTD
CALL PAUSE
BCF PORTA,1 ;Desactive transistor 2

BSF PORTA,2 ;-----
MOVF COUNTER_100,W
CALL TABLE
MOVWF PORTD
CALL PAUSE
BCF PORTB,2 ;Desactive transistor 3

BSF PORTA,3 ;Active transistor 4
MOVF COUNTER_1000,W
CALL TABLE
MOVWF PORTD
CALL PAUSE
BCF PORTA,3 ;Desactive transistor 4

GOTO MAIN ;===========
;-----------------------------------------------------------------------------

;===========RUTINA INTERRUPCION
ISR
;Comienzo de la rutina IRS----
SAVE_REGS
MOVWF STORE_w ;Guarda contenido de W
SWAPF STATUS,W ;Swap el contenido de STATUS en W
MOVWF STORE_st ;Guarda el contenido de STATUS (swapped)
BCF INTCON,GIE
;Tratamiento----------------
BTFSS INTCON,INTF ;Verfifica estado de la bandera
GOTO EXIT_IRS ;Sino, salir
MOVLW .9 ;Para saber si counter_1 es igual a menor que 9

SUBWF COUNTER_1,0 ;( resta f-W )el resultado se almacena en W BTFSC STATUS,Z ;verfificar la bandera Z (zero): Z=1 solo cuando el resultado es cero.
GOTO INC_10
INC_1
INCF COUNTER_1
GOTO WATCH ;salir

INC_10
CLRF COUNTER_1
MOVLW .9 ;Para saber si counter_1 es igual a menor que 9
SUBWF COUNTER_10,0 ;( resta f-W )el resultado se almacena en W
BTFSC STATUS,Z ;verfificar la bandera Z (zero): Z=1 solo cuando el resultado es cero.
GOTO INC_100
INCF COUNTER_10
GOTO WATCH

INC_100
CLRF COUNTER_10
MOVLW .9 ;Para saber si counter_1 es igual a menor que 9
SUBWF COUNTER_100,0 ;( resta f-W )el resultado se almacena en W
BTFSC STATUS,Z ;verfificar la bandera Z (zero): Z=1 solo cuando el resultado es cero.
GOTO INC_1000
INCF COUNTER_100
GOTO WATCH

INC_1000
CLRF COUNTER_100
MOVLW .9 ;Para saber si counter_1 es igual a menor que 9
SUBWF COUNTER_1000,0 ;( resta f-W )el resultado se almacena en W
BTFSC STATUS,Z ;verfificar la bandera Z (zero): Z=1 solo cuando el resultado es cero.
GOTO ALARM
INCF COUNTER_1000
GOTO WATCH
ALARM
BSF PORTA,4 ;Avisar que llego a 10.000 unidades GOTO WATCH

WATCH BTFSS PORTB,0 ;Verificar el estado del pulsador.
GOTO WATCH
BCF INTCON,INTF
BSF INTCON,INTE

;Fin de la rutina IRS---------
EXIT_IRS
SWAPF STORE_st,W ;Deja STATUS como estaba
MOVWF STATUS ;y lo restaura
SWAPF STORE_w,1 ;Restaura el contenido de W
SWAPF STORE_w,W

RETFIE ;========= SALIR DE INTERRUPCION


;------------------------------------------------------------------------------
TABLE
ADDWF PCL
RETLW 3Fh ;Código para el cero
RETLW 06h ;Código para el uno
RETLW 5Bh
RETLW 4Fh
RETLW 66h
RETLW 6Dh
RETLW 7Dh
RETLW 07h
RETLW 7Fh
RETLW 6Fh ;;Código para el nueve


PAUSE
MOVLW D'30' ;
MOVWF RETAR1
P1 MOVLW D'50'
MOVWF RETAR2
P2 MOVLW D'5'
MOVWF RETAR3
P3 DECFSZ RETAR3,F
GOTO P3
DECFSZ RETAR2,F
GOTO P2
DECFSZ RETAR1,F
GOTO P1
RETURN

;------------------------------------------------------------------------------
END
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:PIC16F877A_DISPLAYS

Publicado por codero (21 intervenciones) el 20/05/2006 23:07:20
no te preocupes, el problerma es que el proteus te simula el asunto, pero no en tiempo real, asi que si el programa te funciona, está bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar