TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ivancho en 22 de Noviembre de 2008, 14:13:40
-
Hola a todos!!! soy nuevo en esto y en realidad no se si lo estoy haciendo bien pero quiero saber si me podrian ayudar...tengo que hacer un programa que me incremente un registro cada vez que se de la comparación de PR2=TMR2, sin embargo a pesar de haber habilitiado la interrupcion, nunca se produce, les pongo el programa para ver si me pueden ayudar.....gracias!!!
;-------------------------------
;
;-------------------------------
LIST P=16F877A
RADIX HEX
INCLUDE <P16F877.inc>
;-------------------------------
;
;-------------------------------
ORG 0x00
GOTO INICIO
ORG 0x05
;-------------------------------
;
;-------------------------------
TIEMPO EQU 0X20
;-------------------------------
;
;-------------------------------
INICIO
BANKSEL PIE1
BSF PIE1,TMR2IE
MOVLW b'11111111'
MOVWF TRISB
MOVLW b'00000000'
MOVWF TRISC
MOVLW b'00000111'
MOVWF PR2
BANKSEL T2CON
MOVLW b'01111011'
MOVWF T2CON
MOVLW b'10000000'
MOVWF INTCON
CLRF PORTC
CLRF TIEMPO
;-------------------------------
;
;-------------------------------
TEMPORIZADOR
BTFSC PORTB,0
GOTO APAGAR
BTFSC PORTB,1
GOTO ENCENDER
GOTO TEMPORIZADOR
ANADIR
MOVLW b'00000111'
ADDWF PORTC
GOTO ENCENDER
ENCENDER
BSF T2CON,2
CONTINUAR
BTFSC PORTB,0
GOTO APAGAR
BTFSC PIR1,TMR2IF
GOTO SUMAR
GOTO CONTINUAR
SUMAR
MOVLW b'00001001'
SUBWF PORTC,0
BTFSC STATUS,DC
GOTO ANADIR
INCF PORTC
GOTO ENCENDER
APAGAR
BCF T2CON,2
BTFSC PORTB,1
GOTO ENCENDER
GOTO APAGAR
END
-
sin embargo a pesar de haber habilitiado la interrupcion, nunca se produce
Lo que pasa es que no has escrito código en la posición 04 de la memoria de programa, la interrupción se va a producir cuando el registro del timer2 se desborde, ahi es donde debes incrementar otro contador si quieres hacer incrementos anidados.
Asi como está tu programa la interrupción al producirse va a la posición 04 de la M.P. pero no encuentra instrucción y pasa a la siguiente que viene a ser "Inicio" (ORG 0x05 en tu programa) es decir se vuelve a resetear y asi se la va a pasar todo el tiempo por los siglos de los siglos.
Javicho.
-
Hola Javicho....antes que nada muchas gracias por ayudarme....bueno te cuento que ya inicie el vector de interrupciones, pero nunca salta a la interrupcion, es decir nunca se incrementa....esta bien definida la parte de la interrupcion de PR2=TMR2? por fa ayudame...
-
Tengo tiempo que no programo en ASM, pero veo ese programa como un poco desordenado... pero nada que no se pueda arreglar...
Ivancho, cómo sabes que no está interrumpiendo? Estás simulando paso por paso con el simulador del MPLAB?
Podrías colocar tu último código, al que le añadiste la muy buena corrección que te hizo javicho?
Ok saludos, nos leemos! :mrgreen:
-
hola firepic
si...le corro paso a paso en el MPLAB, y veo que nunca se va al vector interrupcion...te pongo otra vez el código, lo único que hice es añadirle el vector interrupcion y ahí que me añada un 1 al puerto C pero nunca sucede, también cambié el registro INTCON para activar las interrupciones....gracias por tu ayuda
;-------------------------------
;
;-------------------------------
LIST P=16F877A
RADIX HEX
INCLUDE <P16F877.inc>
;-------------------------------
;
;-------------------------------
ORG 0x00
GOTO INICIO
ORG 0x04
GOTO INTERRUPCION
ORG 0x05
;-------------------------------
;
;-------------------------------
TIEMPO EQU 0X20
;-------------------------------
;
;-------------------------------
INTERRUPCION
NOP
NOP
NOP
NOP
NOP
INCF PORTC
RETFIE
;-------------------------------
;
;-------------------------------
INICIO
BANKSEL PIE1
BSF PIE1,TMR2IE
MOVLW b'11111111'
MOVWF TRISB
MOVLW b'00000000'
MOVWF TRISC
MOVLW b'00000111'
MOVWF PR2
BANKSEL T2CON
MOVLW b'01111011'
MOVWF T2CON
MOVLW b'11000000'
MOVWF INTCON
CLRF PORTC
CLRF TIEMPO
;-------------------------------
;
;-------------------------------
TEMPORIZADOR
BTFSC PORTB,0
GOTO APAGAR
BTFSC PORTB,1
GOTO ENCENDER
GOTO TEMPORIZADOR
ANADIR
MOVLW b'00000111'
ADDWF PORTC
GOTO ENCENDER
ENCENDER
BSF T2CON,2
CONTINUAR
BTFSC PORTB,0
GOTO APAGAR
BTFSC PIR1,TMR2IF
GOTO SUMAR
GOTO CONTINUAR
SUMAR
MOVLW b'00001001'
SUBWF PORTC,0
BTFSC STATUS,DC
GOTO ANADIR
INCF PORTC
GOTO SUMAR
APAGAR
BCF T2CON,2
BTFSC PORTB,1
GOTO ENCENDER
GOTO APAGAR
END
-
Porque no rabajas con el Timer1 mejor? asi te evitas de usar el PR2 ya que lo podrias reservar para el módulo PWM, es mas el Timer1 es de 16bits frente al Timer2 que solo es de 8bits.
Ademas el PR2 es un registro de periodo y cuando la cuenta del Timer2 iguale al del PR2 se activa un flag pero si el Timer2 es de 8bits esta cuenta se dará muy rapido aun asi uses preescaler y si usas uno de los puertos del PIC para visualizar solo veras tal vez todos los leds prendidos, es que el PR2 está diseñado mas para trabajar con el PWM.
En cambio el Timer1 si está mas diseñado para temporizar porque es de 16bits, seria mejor que trabajes con este temporizador porque es mas facil.
Javicho.
PD: A tu RSI (ORG 0x04) le falta guardar Status, w, etc.
-
Que tal amigos!
Ivancho, estoy viendo varias cosas que te faltan y por esa razon NUNCA se generara la interrupcion del timer2 :shock: :D
Veo que habilitas los bit gie y peie, pero y que paso con el tmr2ie y el tmr2if? pertenecientes a los registros pie1 y pir1 respectivamente?
Si no habilitas el tmr2ie pues nunca se dara la interrupcion, ademas una vez en la interrupcion debes borrar el flag el tmr2if para que no reentre en la interrupcion de nuevo y se cree un lazo sin fin :mrgreen:
La cosa seria algo como esto:
INICIO
BANKSEL PIE1
BSF PIE1,TMR2IE
MOVLW b'11111111'
MOVWF TRISB
MOVLW b'00000000'
MOVWF TRISC
MOVLW b'00000111'
MOVWF PR2
BANKSEL T2CON
MOVLW b'01111011'
MOVWF T2CON
BCF PIR1,1 ;Borro flag del tmr2if
MOVLW b'00000010
MOVWF PIE1 ;Habilito interrupcion para el tmr2ie
MOVLW b'11000000'
MOVWF INTCON
CLRF PORTC
CLRF TIEMPO
INTERRUPCION
NOP
NOP
NOP
NOP
NOP
INCF PORTC
BCF PIR1,1
RETFIE
Pruebalo y nos avisas!
Nota: Si piensas incrementar algun registro ese debe ser dentro de la rutina de interrupcion, segun lo que lei en tu primer post pero veo que en tu codigo chequeas el tmr2if y eso esta mal, ademas debes guardar los registros W, Status, por lo menos al entrar a la interupcion y luego devolver los valores al salir de esta, en el foro hay informacion y en la red de como hacerlo.
Saludos
-
BUeno....antes que nada gracias por la ayuda....y pues Javicho estoy trabajando con el TMR2 porque asi tengo que hacer el trabajo para la universidad, mostrar el incremento del TMR2 en el puerto C, y pues RALF2 ya hice eso que me dijiste...lo que no entiendo es que es lo que tiene que ver el registro STATUS en la interrupcion....y lo otro del programa, eso solo lo puse para ver si lo trabajaba no como interrupción si no mas bien cuando se me active el TMR2IF para que cuando eso pase, se me incremente el registro....entonces todos esos son mis problemas, pero igual no me funciona...no se por que...
Ivancho
-
Que tal ivancho!
Mira en tu programa debes salvar el registro status y W porque estas empleando en el programa principal (el que esta fuera de la interrupcion) operaciones logicas y aritmeticas cuando realizas operaciones como suma o resta, el registro w tambien lo empleas alli asi que tambien debes salvarlo :mrgreen:
Ya que si se genera una interrupcion, el registro status y w podrian ser afectados, si llegases a utilizar alguna instruccion que los modifique por eso es recomendable siempre salvarlos y luego restaurarlos antes salir de la interrupcion.
Lo otro tu chequeas el tmr2if en el programa principal y como estas utilizando precisamente interrupciones con ese flag, en el programa principal, nunca cambiara de estado :shock: porque cada vez que el flag pase a 1 este ira a la rutina de interrupcion y luego alli lo borras por lo que nunca veras el estado de este, a menos que quites la interrupcion o utilices algun truco :D
Podrias modificar el programa para que cuando se genere la interrrupcion este incremente una variable y muestre su contenido por el puerto que desees :mrgreen:
Luego en el programa principal lo puedes utilizar para hacer otras cosas
Espero haberte orientado mejor el camino :mrgreen:
Saludos
-
Hola a todos!!!
Bueno antes que nada les agradezco a todos por su ayuda...finalmente me corrio el programa...el problema que paso es que cuando lo corri en el simulador de MPLAB no me funcionaba, pero cuando arme el circuito y lo simulé en PROTEUS me funciono perfectamente, no se por que se pudo dar esto...pero bueno de todas maneras gracias a todos por su ayuda!!!
Ivancho