Autor Tema: Problema con interrupcion por TMR0 con pic 16f886  (Leído 4379 veces)

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

Desconectado PIC666

  • PIC10
  • *
  • Mensajes: 5
Problema con interrupcion por TMR0 con pic 16f886
« en: 23 de Diciembre de 2010, 20:43:58 »
Buena tarde, este es un código hecho por mi, trato de hacer oscilar un led (conectado al bit 7 del puerto C) con un retardo de 1 segundo, hago la rutina de retardo por interrupción por TMR0, he simulado este código en MPLAB y funciona correctamente en el simulador, en el momento de hacerlo en físico el led conectado al bit 7 del puerto C se queda prendido y no hace la función de interrupción correspondiente, si alguien pudiera ayudarme, se lo agradecería bastante.

Adjunto el código en ensamblador

Saludos.


Código: ASM
  1. LIST            P=16F886
  2.         #INCLUDE <p16F886.inc>
  3.  
  4.         __CONFIG _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTOSCIO
  5.         __CONFIG _CONFIG2, _WRT_OFF & _BOR40V
  6.  
  7.         #DEFINE RS              PORTC,0
  8.         #DEFINE RW              PORTC,1
  9.         #DEFINE ENABLE  PORTC,2
  10.  
  11.         CBLOCK  20H
  12.         BUSY_REG
  13.         CONT
  14.         ENDC
  15.  
  16.         RESET   ORG             00H
  17.                         GOTO    MAIN
  18.                         ORG             04H
  19.                         GOTO    ISR
  20.                         ORG             05H
  21.  
  22.         MAIN    CLRF    PORTA                   ;BANCO 0
  23.                         CLRF    PORTB
  24.                         CLRF    PORTC
  25.  
  26.                         BSF             STATUS,RP0              ;BANCO 3
  27.                         BSF             STATUS,RP1
  28.  
  29.                         MOVLW   B'00000001'
  30.                         MOVWF   ANSEL                   ;ENTRADA RA0 COMO ANALOGICA
  31.                         CLRF    ANSELH
  32.  
  33.                         BCF             STATUS,RP1              ;BANCO1
  34.  
  35.                         MOVLW   B'00000001'
  36.                         MOVWF   TRISA
  37.                         CLRF    TRISB
  38.                         CLRF    TRISC
  39.  
  40.                         MOVLW   B'00000111'
  41.                         MOVWF   OPTION_REG
  42.  
  43.                         BCF             STATUS,RP0              ;BANCO 0
  44.                         BCF             STATUS,RP1
  45.  
  46.                         MOVLW   D'60'
  47.                         MOVWF   TMR0
  48.  
  49.                         MOVLW   B'10100000'
  50.                         MOVWF   INTCON
  51.        
  52.                         MOVLW   D'20'
  53.                         MOVWF   CONT
  54.  
  55.         LOOP    NOP
  56.                         GOTO    LOOP
  57.  
  58.         ISR             DECFSZ  CONT,F
  59.                         GOTO    FIN
  60.                        
  61.                         MOVLW   D'20'
  62.                         MOVWF   CONT
  63.  
  64.                         BTFSS   PORTC,7
  65.                         GOTO    ON_LED
  66.                         BCF             PORTC,7
  67.                         GOTO    FIN
  68.  
  69.         ON_LED  BSF             PORTC,7
  70.  
  71.         FIN             MOVLW   D'60'
  72.                         MOVWF   TMR0
  73.  
  74.                         BCF             INTCON,2
  75.                         RETFIE
  76.  
  77.                         END



Desconectado Fidel Martins

  • PIC16
  • ***
  • Mensajes: 143
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #1 en: 23 de Diciembre de 2010, 22:16:22 »
no entendi porque le pones 60 al TMR0, si ya le pusiste el preescalado al maximo y todavia mas aun el reg. cont lo cargas con 20?

Desconectado PIC666

  • PIC10
  • *
  • Mensajes: 5
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #2 en: 24 de Diciembre de 2010, 00:04:48 »
Buen dia Fidel, antes que nada gracias por tomarte el tiempo de revisar mi código y responder, cargué el tmr0 con el valor de 60 y configuré el preescaler en 256, porque con estos requisitos cada desbordamiento de tmr0 genera un retardo de 50us, este proceso de repite 20 veces (es la razón por la que cargo con 20 el registro cont), para generar el retardo de 1 segundo.


Saludos.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #3 en: 24 de Diciembre de 2010, 00:45:34 »
Creo que tu problema radica en el tipo de oscilador que estas utilizando.

Es decir debes cambiar de un oscilador interno a un oscilador externo, o debes modificar el registro OSCCON con respecto a la frecuencia que vas a trabajar.
« Última modificación: 24 de Diciembre de 2010, 00:58:57 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Fidel Martins

  • PIC16
  • ***
  • Mensajes: 143
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #4 en: 24 de Diciembre de 2010, 16:32:11 »
Aun asi la cuenta no resulta. ese es el tema!

Desconectado PIC666

  • PIC10
  • *
  • Mensajes: 5
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #5 en: 24 de Diciembre de 2010, 23:26:37 »
bigluis, he cargado el registro osccon del banco 1  con el siguiente binario:

Código: ASM
  1. MOVLW   B'01100001'
  2.                         MOVWF   OSCCON

Frecuencia de trabajo a 4Mhz,  activando el oscilador interno como reloj de sistema.




Desconectado PIC666

  • PIC10
  • *
  • Mensajes: 5
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #6 en: 24 de Diciembre de 2010, 23:39:18 »
y no me ha resultado el modificar el registro osccon, sigo teniendo el mismo problema.

Fidel, en mi respuesta anterior quise decir 50ms, no 50us me disculpo por ello, en la rutina que anteriormente expliqué, genero un retardo de 50ms (.05s), esta rutina se repite 20 veces para generar un retardo de 1 segundo.

 .05 x 20 = 1

Saludos.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #7 en: 25 de Diciembre de 2010, 16:56:43 »
 :? Ya probaste utilizando un oscilador de cristal externo?
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado PIC666

  • PIC10
  • *
  • Mensajes: 5
Re: Problema con interrupcion por TMR0 con pic 16f886
« Respuesta #8 en: 25 de Diciembre de 2010, 20:25:31 »
He depurado mi código y he encontrado algunos errores lógicos, en fin, el programa funciona correctamente hace el retardo de 1 segundo por interrpción pot tmr0, adjunto el código, por si llega a ser útil para alguien.

Código: ASM
  1. LIST            P=16F886
  2.         #INCLUDE        <P16F886.INC>
  3.        
  4.         __CONFIG _CONFIG1,      _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_ON & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTOSCIO
  5.         __CONFIG _CONFIG2,   _WRT_OFF & _WRT_OFF
  6.        
  7.         CBLOCK 20H
  8.         CONT
  9.         W_TEMP
  10.         STATUS_T
  11.         ENDC
  12.        
  13.         RESET   ORG             00H
  14.                         GOTO    MAIN
  15.                         ORG             04H
  16.                         GOTO    INISR
  17.                         ORG             05H
  18.                        
  19.         MAIN    CLRF    PORTA
  20.                         CLRF    PORTB
  21.                         CLRF    PORTC
  22.  
  23.                         BSF             STATUS,RP0              ;BANCO 3
  24.                         BSF             STATUS,RP1
  25.  
  26.                         CLRF    ANSEL
  27.                         CLRF    ANSELH
  28.  
  29.                         BCF             STATUS,RP1              ;BANCO 1
  30.  
  31.                         CLRF    TRISA
  32.                         CLRF    TRISB
  33.                         CLRF    TRISC
  34.  
  35.                         MOVLW   B'00000111'
  36.                         MOVWF   OPTION_REG
  37.  
  38.                         MOVLW   B'10100000'
  39.                         MOVWF   INTCON
  40.                
  41.                         BCF             STATUS,RP0              ;BANCO 0
  42.  
  43.                         CLRF    PORTA
  44.                         CLRF    PORTB
  45.                         CLRF    PORTC
  46.  
  47.                         MOVLW   D'20'
  48.                         MOVWF   CONT
  49.  
  50.                         MOVLW   D'60'
  51.                         MOVWF   TMR0
  52.  
  53.                         BSF             PORTA,1
  54.                         BSF             PORTC,7
  55.  
  56.         LOOP    NOP
  57.                         GOTO    LOOP           
  58.                        
  59.         INISR   MOVWF   W_TEMP
  60.                         SWAPF   STATUS,W
  61.                         MOVWF   STATUS_T
  62.  
  63.         ISR             BTFSS   INTCON,2
  64.                         GOTO    FINISR
  65.  
  66.                         DECFSZ  CONT,F
  67.                         GOTO    FINISR
  68.  
  69.                         MOVLW   D'20'
  70.                         MOVWF   CONT
  71.  
  72.                         BTFSS   PORTA,1
  73.                         GOTO    OFF_LED
  74.                         BCF             PORTA,1
  75.                         BCF             PORTC,7
  76.                         GOTO    FINISR
  77.        
  78.         OFF_LED BSF             PORTA,1
  79.                         BSF             PORTC,7
  80.  
  81.         FINISR  MOVLW   D'60'
  82.                         MOVWF   TMR0
  83.  
  84.                         SWAPF   STATUS_T,W
  85.                         MOVWF   STATUS
  86.                         SWAPF   W_TEMP,F
  87.                         SWAPF   W_TEMP,W
  88.                         BCF             INTCON,2
  89.                         RETFIE
  90.                        
  91.                         END

Agradezco a bigluis y a Fidel por haberse tomado la molestia en asistirme, aunque el problema no era el oscilador ni tampoco el retardo.

Saludos. 


 

anything