Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

21/02/2008 #1


Interrupcion RB0 pic16f877
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
21/02/2008 #2

Avatar de Ardogan

Errata
Hay una errata en el sitio de microchip: http://ww1.microchip.com/downloads/e...Doc/80053b.pdf

Ahí menciona en al primera página que hay que poner al final de la última instrucción del ciclo de programa las siguientes 16 posiciones de memoria con unos.
Será eso?.
21/02/2008 #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
21/02/2008 #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...
21/02/2008 #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
22/02/2008 #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
22/02/2008 #7


Ahi te va el archivo completo, en la simulacion me esta trabajando OK
Archivos Adjuntos
Tipo de Archivo: asm display_channel_new_124.asm (11,2 KB (Kilobytes), 105 visitas)
25/02/2008 #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
25/02/2008 #9


postea el circuito que estas utilizando, quiza ahi este el detalle
25/02/2008 #10


Ok.... ya esta el diagrama. Por favor, ayudarme.

Gracias.

Andrew
25/02/2008 #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
Archivos Adjuntos
Tipo de Archivo: asm display_channel_new_404.asm (12,2 KB (Kilobytes), 36 visitas)
25/02/2008 #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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.