Autor Tema: PROBLEMAS CON TIMER2 PARA PIC 16F877A  (Leído 4416 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ivancho

  • PIC10
  • *
  • Mensajes: 5
PROBLEMAS CON TIMER2 PARA PIC 16F877A
« 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

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #1 en: 22 de Noviembre de 2008, 14:52:49 »
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.

Desconectado ivancho

  • PIC10
  • *
  • Mensajes: 5
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #2 en: 23 de Noviembre de 2008, 00:37:41 »
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...

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #3 en: 23 de Noviembre de 2008, 00:57:53 »
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:

"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado ivancho

  • PIC10
  • *
  • Mensajes: 5
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #4 en: 23 de Noviembre de 2008, 12:13:59 »
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

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #5 en: 23 de Noviembre de 2008, 12:53:12 »
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.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #6 en: 23 de Noviembre de 2008, 12:57:59 »
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:

Código: [Seleccionar]
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


Código: [Seleccionar]
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
 
« Última modificación: 23 de Noviembre de 2008, 13:09:28 por RALF2 »

Desconectado ivancho

  • PIC10
  • *
  • Mensajes: 5
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #7 en: 23 de Noviembre de 2008, 20:33:50 »
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

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #8 en: 24 de Noviembre de 2008, 20:25:30 »
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

Desconectado ivancho

  • PIC10
  • *
  • Mensajes: 5
Re: PROBLEMAS CON TIMER2 PARA PIC 16F877A
« Respuesta #9 en: 24 de Noviembre de 2008, 21:03:54 »
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


 

anything