Autor Tema: INCOVENIENTES CON LA INTERRUPCIÓN DEL TIMER2  (Leído 2485 veces)

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

Desconectado Joshuegp

  • PIC10
  • *
  • Mensajes: 7
INCOVENIENTES CON LA INTERRUPCIÓN DEL TIMER2
« en: 19 de Abril de 2020, 00:53:27 »
Buenas,

Estoy usando un PIC18F4550 con un cristal de 20MHz, donde quiero que la interrupción se dé para una frecuencia de 7200Hz (T=138.89useg). Calculo el PR2 con la formula PR2=[(T*Fcristal)/(4*TMR2Prescaler)]-1 .

Todo genial para el cálculo de valores e ingresarlos al MPLAB XC8, pero al momento que hago la simulación en Proteus 8.9 viene el incoveniente, al tomar la medición de la frencuencia que obtengo me resulta solo la mitad de la deseada, 3600Hz. Por favor, me podría ayudar con dicha falla o encontrando mi error en el código o simulación.

Código: C
  1. #include <xc.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5.  
  6. #define _XTAL_FREQ 20000000
  7.  
  8. #pragma config FOSC = HS
  9. #pragma config PWRT = OFF    
  10. #pragma config BOR = OFF      
  11. #pragma config WDT = OFF        
  12. #pragma config MCLRE = ON  
  13.  
  14.  
  15. void main(void) {
  16.     ADCON1 =0x0A;
  17.     TRISB =0x00;
  18.     LATB =0x00;
  19.  
  20.     INTCON=0b01000000;
  21.  
  22.     T2CON =0;
  23.  
  24.     T2CONbits.T2CKPS1 =0;
  25.     T2CONbits.T2CKPS0 =1;
  26.        
  27.     PR2 =173;
  28.    
  29.     PIR1bits.TMR2IF =0;
  30.     PIE1bits.TMR2IE =1;
  31.     IPR1bits.TMR2IP =1;
  32.     INTCONbits.GIE =1;
  33.     T2CONbits.TMR2ON =1;
  34.    
  35.       while(1){
  36.          
  37.       }
  38.    
  39. }
  40.  
  41. void interrupt TMR2_int(void){
  42.     if(PIR1bits.TMR2IF ==1){
  43.        
  44.         LATBbits.LATB0=~LATBbits.LATB0;
  45.        
  46.     PIR1bits.TMR2IF =0;
  47.     }
  48. }


He realizado el código lo más detallado para ver en qué puedo estar equivocandome, pero no detecto.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:INCOVENIENTES CON LA INTERRUPCIÓN DEL TIMER2
« Respuesta #1 en: 19 de Abril de 2020, 02:02:34 »
...
Estoy usando un PIC18F4550 con un cristal de 20MHz, donde quiero que la interrupción se dé para una frecuencia de 7200Hz (T=138.89useg). Calculo el PR2 con la formula PR2=[(T*Fcristal)/(4*TMR2Prescaler)]-1 .

Todo genial para el cálculo de valores e ingresarlos al MPLAB XC8, pero al momento que hago la simulación en Proteus 8.9 viene el incoveniente, al tomar la medición de la frencuencia que obtengo me resulta solo la mitad de la deseada, 3600Hz.

7200Hz  es la frecuencia con que se llama la interrupción y en cada llamado invertís la salida --->  Si se ocupan dos llamados para completar un período pues la frecuencia de RB0 será la mitad (3600Hz)

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:INCOVENIENTES CON LA INTERRUPCIÓN DEL TIMER2
« Respuesta #2 en: 19 de Abril de 2020, 05:05:41 »
...
Estoy usando un PIC18F4550 con un cristal de 20MHz, donde quiero que la interrupción se dé para una frecuencia de 7200Hz (T=138.89useg). Calculo el PR2 con la formula PR2=[(T*Fcristal)/(4*TMR2Prescaler)]-1 .

Todo genial para el cálculo de valores e ingresarlos al MPLAB XC8, pero al momento que hago la simulación en Proteus 8.9 viene el incoveniente, al tomar la medición de la frencuencia que obtengo me resulta solo la mitad de la deseada, 3600Hz.

7200Hz  es la frecuencia con que se llama la interrupción y en cada llamado invertís la salida --->  Si se ocupan dos llamados para completar un período pues la frecuencia de RB0 será la mitad (3600Hz)

Tal y como te ha dicho el compañero, necesitas dos cambios de estado para tener un periodo completo. Por lo que los 138,89 us lo tienes que dividir entre 2: 69,45 us.


Aplicando regla de tres sabiendo que el Timer2 sin prescalador se incrementa fosc/4 = 5000000 en un segundo,  para conseguir 69,45us de semiperiodo, el Timer deberá incrementarse 347 veces.

   Para acercarte lo más posible a ese tiempo, al ser un timer de 8 bits me sale que lo más cercano es fijar el valor de PR2 a 29 (-1) y el postcaler a 12 (-1) ya que 347/12= 28,91. Es lo más cerca de un entero que he calculado así a lo rápido.

   Con esos datos si que deberías tener la frecuencia a la salida que quieres.

 
« Última modificación: 19 de Abril de 2020, 10:35:48 por remi04 »

Desconectado Joshuegp

  • PIC10
  • *
  • Mensajes: 7
Re:INCOVENIENTES CON LA INTERRUPCIÓN DEL TIMER2
« Respuesta #3 en: 24 de Abril de 2020, 00:19:20 »
Citar

Tal y como te ha dicho el compañero, necesitas dos cambios de estado para tener un periodo completo. Por lo que los 138,89 us lo tienes que dividir entre 2: 69,45 us.


Aplicando regla de tres sabiendo que el Timer2 sin prescalador se incrementa fosc/4 = 5000000 en un segundo,  para conseguir 69,45us de semiperiodo, el Timer deberá incrementarse 347 veces.

   Para acercarte lo más posible a ese tiempo, al ser un timer de 8 bits me sale que lo más cercano es fijar el valor de PR2 a 29 (-1) y el postcaler a 12 (-1) ya que 347/12= 28,91. Es lo más cerca de un entero que he calculado así a lo rápido.

   Con esos datos si que deberías tener la frecuencia a la salida que quieres.


Sí, amigo. Era algo que lo estuve pasando por alto. Es que me había cegado con la elaboración de la senoidal mediante PWM y estuve confundiendome de variable. Ya me pudo salir, al fin.

Muy agradecido.


 

anything