Interrupcion RB0 pic16f877

#1
Por favor alguien puede ayudarme a crear una interrupcion RB0 para un pic16f877. ?

Yo ya hice un programita en assembler; pero, este trabaja muy bien el la primera interrupcion que se ejecuta y para las proximas interrupciones, este ya no hace nada.....

Por favor ayudaaaa....

Saludos,

Andrew
 

Adjuntos

#3
tienes un lazo infinito en alguna de estas llamadas
Código:
   CALL	CONTEO_DECENA
	CALL	CONTEO_UNIDAD
	CALL	CONV_DISPLAY_DECENA
	CALL	CONV_DISPLAY_UNIDAD
intenta de una por una para hallar a la culpable

tambien sería bueno colocar la intruccion de borrado al final de esta manera:
Código:
bcf INTCON,INTF
	retfie
intenta con eso y postea los resultados
 
#4
hmmm.... lo del lazo infinito creo q no es.... pues muy bien se ejecuta la primera interrupcion... pero cuando va a ejecutarse nuevamente ... esta se ejecta pero no realiza la rutina.... luego termina y vueleve a donde estaba corriendo el programa princila de donde se ejecuto.
Luego lo de borra el INTF.. si lo hice al final y nada... probe en todas lados y nada.

Gracias... seguire intentado...
 
#5
cambie algunas cosas en la interrupcion y me anduvo bien

Código:
	ORG	0x04


	MOVWF    W_TEMP           ;Copy W to TEMP register
     SWAPF    STATUS,W         ;Swap status to be saved into W 
     CLRF     STATUS           ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
     MOVWF    STATUS_TEMP      ;Save status to bank zero STATUS_TEMP register
    ; MOVF     PCLATH, W        ;Only required if using pages 1, 2 and/or 3
    ; MOVWF    PCLATH_TEMP      ;Save PCLATH into W
    ; CLRF     PCLATH           ;Page zero, regardless of current page

;*****************************
	BSF	PORTE,0

	MOVF	PORTC,W			;MUEVE EL VALOR DEL PORTC AL
	MOVWF	TEMPO			;AL REGISTRO "TEMPO".

;	BCF	PORTE,0

	CALL	CONTEO_DECENA
	CALL	CONTEO_UNIDAD
	CALL	CONV_DISPLAY_DECENA
	CALL	CONV_DISPLAY_UNIDAD

;	BCF	PORTE,0

	CALL	DISPLAY_TO_DIG

	BCF	PORTE,0

;*****************************

     ;MOVF     PCLATH_TEMP, W   ;Restore PCLATH
    ; MOVWF    PCLATH           ;Move W into PCLATH
     SWAPF    STATUS_TEMP,W    ;Swap STATUS_TEMP register into W 
                               ;(sets bank to original state)
     MOVWF    STATUS           ;Move W into STATUS register
     SWAPF    W_TEMP,F         ;Swap W_TEMP
     SWAPF    W_TEMP,W         ;Swap W_TEMP into W

	bcf INTCON,1 
	RETFIE
checalo

hay que agragar algunas variables y borrar F y W. Postea como te fue
 
#6
Hola Mabauti,
Probe estas modificaciones, pero no logro conseguir buenos resultados (sigue el mismo problema). Sabes, estuve revisando paso a paso las subrutinas y veo q tenias razon (pero hay algo extraño) solo que en un primer momento funciona bien y luego para repetir la interrupcion ya no corre la interrupcion y regresa al programa incial de donde salto la interrupcion. Bueno veo que quitando los CALL CONV_DISPLAY_DECENA y CALL CONV_DISPLAY_UNIDAD la interrupcion funciona ok y todas las veces. La pregunta es, en que afecta la siguente concversion:


;************************************************************

CONV_DISPLAY_DECENA
MOVF DECENA,W
CALL DISPLAY
MOVWF DECENA
RETURN

;******************************************************

CONV_DISPLAY_UNIDAD
MOVF UNIDAD,W
CALL DISPLAY
MOVWF UNIDAD
RETURN

;*****************************************************

DISPLAY
ADDWF PCL,1
; RETLW b'01111110' ;NO SE USA
RETLW b'10000000' ;VALOR CERO
RETLW b'11110010' ;VALOR UNO
RETLW b'01001000' ;VALOR DOS
RETLW b'01100000' ;VALOR TRES
RETLW b'00110010' ;VALOR CUATRO
RETLW b'00100100' ;VALOR CINCO
RETLW b'00000100' ;VALOR SEIS
RETLW b'11110000' ;VALOR SIETE
RETLW b'00000000' ;VALOR OCHO
RETLW b'00100000' ;VALOR NUEVE

;***********************************************

Hay algun problema con PCL?.

Seguire investigando.

Muchas gracias.

Andrew
 
#8
Ok gracias.

hmmmm.... no se q puede estar pasando... Sigue el problema.

creo q esto va terminar volviendome loco.... jaja.

Bien, si esta trabajando ok en el simulador.... por que no trabaja en el pic real?... q de mal estoy haciendo?... Reviso y reviso y vuelvo a revisar las conexiones.. y nada.

Pregunta... Será la configuracion del quemador?..... Hmmm pero; por que corre bien (trabaja bien) cuando quito los CALL CONV_DISPLAY_DECENA y CALL CONV_DISPLAY_UNIDAD? creo q hay un problema con PCL.

Segure revisando.

Saludos,

Andrew
 
#11
Hola janvama como estas, bueno revisando el programa en asm publicado por mabauti creo que encontre el problema con el plc. Los que sucede es que en un primer comento decena y unidad valen 00x0 (AL INICIAR EL PROGRAMA).

CONV_DISPLAY_DECENA CONV_DISPLAY_UNIDAD
MOVF DECENA,W MOVF UNIDAD,W
CALL DISPLAY CALL DISPLAY
MOVWF DECENA MOVWF UNIDAD
RETURN RETURN

Y al retornar de la tabla Display DECENA se carga con b'10000000' (VALOR CERO para la tabla), pero de valor 128 para el pic, entonces cuando se realiza la siguiente interupcion como Decena vale 128 y al cargar al PLC éste se desborda saltando a la direccion de memoria 193 que es una direccion de memoria perteneciente a DIG_14.

Una manera de arreglar esto es de la siguiente manera:
CONV_DISPLAY_DECENA CONV_DISPLAY_UNIDAD
MOVF DECENA_TEMP,W MOVF UNIDAD_TEMP,W
CALL DISPLAY CALL DISPLAY
MOVWF DECENA MOVWF UNIDAD
RETURN RETURN

Teniendo en cuenta que debemos de crear los registros auxiliares decena_temp y unidad_temp
en el bloque de constantes (CBLOCK ....... ENDC). Y ademas debemos de modificar las siguientes lineas:
INCREMENTA_DECENA INCREMENTA_UNIDAD
MOVWF TEMPO MOVWF TEMPO
INCF DECENA_TEMP,F ;** INCF UNIDAD_TEMP,F ;**
GOTO CONTEO_DECENA GOTO CONTEO_UNIDAD
(Ver que solo he cambiado decena por decena_temp y unidad por unidad_temp). De esta manera lo que se incrementa es decena_temp y unidad_temp y a la hora de ir a la tabla, estos valores al salir a la tabla cargar a decena y unidad sus valores correspondientes.

Bueno esto es lo que pude encontrar en el codigo, a mi parecer esa es la razon por la cual se desborda el PLC; estoy agregado el codigo para que lo revises, y bueno esto es lo poco que puedo agregar sobre este tema, gracias.

"La formulación de un problema, es más importante que su solución."
"La imaginación es más importante que el conocimiento."
Albert Einstein
 

Adjuntos

#12
Wowww... eso esta super!

En verdad si q habia un problema con PCL y q bueno que lo encontraste neo_akatsuki... Muchas gracias amigos! Esto me serviara para poder continuar con mi programa ya q me habia quedado plantado... y mas me sirve para comprender mas del funcionamiento del PIC.

Nuevamente Muchas gracias.

Nos vemos pornto.

Saludos,

Andrew.