Autor Tema: Problemas con Timer1 del dsPIC33FJ128GP802  (Leído 7407 veces)

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

Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Problemas con Timer1 del dsPIC33FJ128GP802
« en: 03 de Mayo de 2016, 17:58:52 »
Hola como están.
Tengo un problema con la configuración del TMR1 ... no puedo darle a la formula para configurarlo como temporizador... He intentado mil veces la carga del PR1 ... y ni por casualidad veo en el osciloscopio, el periodo calculado. Alguien podría ayudarme con algún ejemplo... bien con formulas para calcular el PR1 a cargar... y como quedaría en un archivo..
No se bien la función del PR1 ... y la del registro TMR1 .. ?
Muchas gracias.
PD: Este es el programa que estoy Corriendo en el dsPIC... y que no puedo calcular el tiempo de retardo ... ( me sale cualquier cosa el periodo cuando lo miro en el osciloscopio ).

#include "xc.h"
#include<p33FJ128GP802.h>
//#define FCY 10000000UL
#include<libpic30.h>
#include"timer_config.h"
#include<stdio.h>
void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void);

int main(void) {
   
    TRISB = 0x0000;     // Bit B13 como salida.
    T1CONbits.TON =0;
    T1CONbits.TCS =0;
    T1CONbits.TGATE =0;
    T1CONbits.TCKPS =0b11;
    TMR1 =0x00;
    PR1= 1;                   // Valor en el registro ( Retardo 20ms)
   
    IPC0bits.T1IP =0x01;
    IFS0bits.T1IF=0;            // Borra el Flag de Interrup Timer1
    IEC0bits.T1IE =1;           // Habilita interrupcion Timer1   
    T1CONbits.TON =1;           // Start Timer
   
      while(1){
       /* LATBbits.LATB12 = 1;
        __delay32(3000);
        LATBbits.LATB12 = 0;
        __delay32(3000);*/

           }
   
    return 0;
}


// Timer 1 interrupt service routine toggles LED on RD1
void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void)
{
 
    IFS0bits.T1IF = 0;
    _LATB13 = 1 - _LATB13;
   
    TMR1=0x00;
}



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #1 en: 03 de Mayo de 2016, 18:42:36 »
no entiendo por que necesitas un prototipo para la funcion de interrupcion, realmente no hace falta, tambien no necesitas cargar libpic30.h, ni tampoco el p33FJxxxx eso deberia cargarse solo con el xc.h

Todavia no vamos a hablar del timer, sino del oscilador. Que oscilador tenes  ( cristal, interno, etc ) ?, como esta configurado? Los fuses que estas usando?, y recien ahi veamos lo del timer.

Vos decis que el timer NO te funciona correctamente, Pero lo de los delay32 si funciona con los tiempos de forma correcta?

Que ecuacion estas usando para calcular el Timer?

Responde esas cosas y luego seguimos, por que falta mucho del programa ahi.

Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #2 en: 03 de Mayo de 2016, 19:48:45 »
Hola como estas. Muy amable por responder.
Te paso a responder:
Uso un oscilador de cristal de cuarzo de Fosc =20 MHz. ... un Preescaler de 256.
Calculo Tcy = 2 / Fosc
Calculo 1TYC = Tcy x 256 ( tiempo en realizar un conteo )
Uso la formula de tiempo de desbordamiento ... como:
Tdesb = ( 65536 - TMR1 ) x 1TYC  --- > de esta formula despejo TMRO ( poniendo como dato el tiempo q quiero obtener en el timer)
TMR1 = 65536 - ( Tdesb / 1 TYC )
Ahora para cargar el RP1 .....
RP1 = 65536 - Valor obtenido para TMR1

Eso básicamente es lo que encontré buscando en internet para hacer.
por eso es que pongo el TMR1 = 0 .... y cargo en el RP1 el valor que obtengo al final.


Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #3 en: 03 de Mayo de 2016, 19:53:38 »
Estos son los FUses que estoy usando.

// FBS
#pragma config BWRP = WRPROTECT_OFF     // Boot Segment Write Protect (Boot Segment may be written)
#pragma config BSS = NO_FLASH           // Boot Segment Program Flash Code Protection (No Boot program Flash segment)
#pragma config RBS = NO_RAM             // Boot Segment RAM Protection (No Boot RAM)

// FSS
#pragma config SWRP = WRPROTECT_OFF     // Secure Segment Program Write Protect (Secure segment may be written)
#pragma config SSS = NO_FLASH           // Secure Segment Program Flash Code Protection (No Secure Segment)
#pragma config RSS = NO_RAM             // Secure Segment Data RAM Protection (No Secure RAM)

// FGS
#pragma config GWRP = OFF               // General Code Segment Write Protect (User program memory is not write-protected)
#pragma config GSS = OFF                // General Segment Code Protection (User program memory is not code-protected)

// FOSCSEL
#pragma config FNOSC = PRI              // Oscillator Mode (Primary Oscillator (XT, HS, EC))
#pragma config IESO = OFF               // Internal External Switch Over Mode (Start-up device with user-selected oscillator source)

// FOSC
#pragma config POSCMD = XT              // Primary Oscillator Source (XT Oscillator Mode)
#pragma config OSCIOFNC = OFF           // OSC2 Pin Function (OSC2 pin has clock out function)
#pragma config IOL1WAY = OFF            // Peripheral Pin Select Configuration (Allow Multiple Re-configurations)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Both Clock Switching and Fail-Safe Clock Monitor are disabled)

// FWDT
#pragma config WDTPOST = PS32768        // Watchdog Timer Postscaler (1:32,768)
#pragma config WDTPRE = PR128           // WDT Prescaler (1:128)
#pragma config WINDIS = OFF             // Watchdog Timer Window (Watchdog Timer in Non-Window mode)
#pragma config FWDTEN = ON              // Watchdog Timer Enable (Watchdog timer always enabled)

// FPOR
#pragma config FPWRT = PWR128           // POR Timer Value (128ms)
#pragma config ALTI2C = OFF             // Alternate I2C  pins (I2C mapped to SDA1/SCL1 pins)

// FICD
#pragma config ICS = PGD1               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
#pragma config JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)



Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #4 en: 03 de Mayo de 2016, 20:06:36 »
Aquí limpie un poco el código... para que sea mas prolijo. El valor cargado en PR1 = 1.... es una prueba cualquiera, ya cansado de que no ande... ( no temporice lo que calculaba ... Por ejemplo, me sale que para tener 20ms con Cristal de 20 MHz .. Pre escaler de 256 --- Debo cargarle a PR1 = 781 )...

#include "xc.h"
#include<p33FJ128GP802.h>
#include<libpic30.h>
#include"timer_config.h"
#include<stdio.h>
void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void);

int main(void) {
   
    TRISB = 0x0000;     // Bit B13 como salida.
    T1CONbits.TON =0;
    T1CONbits.TCS =0;
    T1CONbits.TGATE =0;
    T1CONbits.TCKPS =0b11;      // Pre escaler 1:256
    TMR1 =0x00;
    PR1=1562;                   // Valor en el registro ( Retardo 20ms)
   
    IPC0bits.T1IP =0x01;
    IFS0bits.T1IF=0;            // Borra el Flag de Interrup Timer1
    IEC0bits.T1IE =1;           // Habilita interrupcion Timer1   
    T1CONbits.TON =1;           // Start Timer
   
      while(1)
   
    return 0;
}

// Timer 1 interrupt service routine toggles LED on RD1
void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void)
{
 
    IFS0bits.T1IF = 0;
    _LATB13 = 1 - _LATB13;
   
    TMR1=0x00;
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #5 en: 03 de Mayo de 2016, 21:39:54 »
Código: C
  1. #pragma config POSCMD = XT              // Primary Oscillator Source (XT Oscillator Mode)

Para 4Mhz o mas usa HS, XT usalo para 4Mhz o menos.
Eso tal ves te solucione ya el tema de los tiempos.

Código: C
  1. #pragma config FWDTEN = ON              // Watchdog Timer Enable (Watchdog timer always enabled)

Por ahora pasalo a OFF, sino tenes que poner la instruccion para resetear el WDT, porque se te va a reiniciar a cada rato.

Luego me fijo bien en el timer. Pero noto un par de cosas mal aplicadas.

Código: C
  1. TMR1=0x00;

Eso esta mal, el timer1 es un Timer del tipo A ( si es que bajas la hoja de datos del dsPIC ) este timer, cuenta desde 0 hasta PR1, cuando llega a PR1 se resetea el Timer0 por si solo, Entonces si yo quiero que pasen 10000 ticks, directamente cargo 10000 a PR1 y activo el timer, y ya no tengo que hacer mas nada. Respecto al calculo:

Citar
Uso un oscilador de cristal de cuarzo de Fosc =20 MHz. ... un Preescaler de 256.
Calculo Tcy = 2 / Fosc - Correcto
Calculo 1TYC = Tcy x 256 ( tiempo en realizar un conteo ) - Correcto
Uso la formula de tiempo de desbordamiento ... como:
Tdesb = ( 65536 - TMR1 ) x 1TYC  --- > de esta formula despejo TMRO ( poniendo como dato el tiempo q quiero obtener en el timer)
TMR1 = 65536 - ( Tdesb / 1 TYC )

Ahora para cargar el RP1 .....
RP1 = Tdesb / 1 TYC   ( El entero mas cercano )

Pensalo de esta forma, al timer entra una frecuencia que es Tcy, luego se divide con el preescaler por 256 a esa frecuencia, o lo que es lo mismo que el periodo se multiplica por 256, Y esa es la señal de reloj que entra al timer, es decir que por cada 1 que cuente va a pasar

Código: [Seleccionar]
(2 * Preescaler) / Fosc
segundos, Supongamos que tenes 20Mhz y 1:256, eso te da 25.6us cada ves que sume 1 el timer. Si quisiera hacer una interrupcion cada 0.5s deberia contar hasta

Código: [Seleccionar]
0.5s / 25.6us = 19531.25
Obviamente no podemos poner fracciones, asi que nos quedamos con el mas cercano que es 19531, eso lo cargamos en el PR1, ponemos a 0 el TMR1, configuramos, activamos interrupciones y finalmente lo hacemos arrancar. Una ves que arranco Cuando el registro del TMR1 sea igual al PR1 activa la bandera de interrupcion, y ademas de eso procede a poner a 0 el TMR1, asi vuelve a contar de nuevo.

Resumen, Pones a 0 el TMR1 y cargas el PR1 al comienzo y no lo tocas nunca mas ( a no ser que quieras cambiar el tiempo de la interrupcion en el medio del programa )
« Última modificación: 03 de Mayo de 2016, 22:11:40 por KILLERJC »

Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #6 en: 03 de Mayo de 2016, 22:02:16 »
Mil Gracias !!!...
Ya hice lo que me marcaste, y esta bien.... Lo único que el tiempo pasa a ser cualquier cosa.... Para nada respeta la formula. Aclaro, que lo que cargo no es el TMR1 .... sino que cargo el PR1 ... con el valor que me sale de la formula, que como te decía, es 781 para obtener 20ms ... con un oscilador de 20 MHz .. y un preescaler de 256. Nii por casualidad se obtienen los 20 milisegundos... sino que el tiempo es muchisimooo mas alto.... al bajar el numero del PR1 .... a por ejemplo PR1 = 1 ... allí si veo el led parpadear.....
Te juro que agradezco muchisimooo tu ayuda... ya que estoy desde la mañana sin exagenerar con esto...y no me he levantado mas que para comer... y no lo puedo resolver.
Espero puedas mirarlo. Te dejo un Abrazo. Gabriel.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #7 en: 03 de Mayo de 2016, 22:06:53 »
Perdon justo modifique la respuesta. Escribo esto para que sepas que esta editado arriba.

El tema del timer esta aca:
http://ww1.microchip.com/downloads/en/DeviceDoc/70205D.pdf
 
Si buscas tu dsPIC, cada modulo tiene su propio PDF que es valido para los PIC24 y dsPIC. Por si estas acostumbrado a los PIC16/18 que tenias todo en un solo datasheet.

El tema del oscilador creo que un poco mas de regla practica, supuestamente XT en algunos pdfs los vi hasta 10Mhz, pero en otros solo hasta 4Mhz, asi que queda alli.

Para mi este seria todo tu programa:

Código: C
  1. #include "xc.h"
  2.  
  3.  
  4. int main(void) {
  5.    
  6.     TRISB = 0x0000;     // Bit B13 como salida.
  7.     T1CONbits.TON =0;
  8.     T1CONbits.TCS =0;
  9.     T1CONbits.TGATE =0;
  10.     T1CONbits.TCKPS =0b11;      // Pre escaler 1:256
  11.     TMR1=0x00;
  12.     PR1=781;                   // Valor en el registro ( Retardo 20ms)
  13.    
  14.     IPC0bits.T1IP =0x01;
  15.     IFS0bits.T1IF=0;            // Borra el Flag de Interrup Timer1
  16.     IEC0bits.T1IE =1;           // Habilita interrupcion Timer1  
  17.     T1CONbits.TON =1;           // Start Timer
  18.    
  19.     while(1);
  20.    
  21.     return 0;
  22. }
  23.  
  24.  
  25. void __attribute__((__interrupt__, __auto_psv__)) _T1Interrupt(void)
  26. {
  27.  
  28.     IFS0bits.T1IF = 0;
  29.     _LATB13 = ~_LATB13;
  30. }

PD:

20ms / 25.6us = 781.25
« Última modificación: 03 de Mayo de 2016, 22:14:38 por KILLERJC »

Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #8 en: 03 de Mayo de 2016, 22:23:15 »
No me esta respondiendo los tiempos....
Una duda , donde pusiste ... >  0.5s / 25.6us = 19531.25   ...> Alli debes usar las mismas unidades en numerador y denominador.....?...

Calcule tal cual, y me sigue dando RP1 = 781 ---- > para los 20ms y para el cristal de 20Mhz y pre escaler 256... y ni allí que lo cuenta... :-( .... me tiene desconcertado... mas siendo algo sencillo..

Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #9 en: 03 de Mayo de 2016, 23:18:37 »
Mejoro muchicimooo !!!!!! gracias.
Lo único que no responde con los cálculos aun..... me da algo asi como 50ms..... tendría que dar 20 ms.... con la carga de 781 ...
Te paso algunas de las fotos.

* foto11.jpg
(191.04 kB, 850x479 - visto 626 veces)


* foto22.jpg
(181.92 kB, 851x479 - visto 627 veces)

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #10 en: 04 de Mayo de 2016, 19:38:05 »
Saludos,
 
  Al parecer te esta funcionando con el reloj interno 7.37Mhz. Para este reloj coincide la interrupción a los 54,25ms. Esto lo puedes verificar si quitas el cristal y te sigue mostrando la señal en el osciloscopio. Si esta trabajando con el reloj interno te recomendaria utilizar el fuse IESO=ON, el cual arranca el cpu con el reloj interno y luego cambia al externo cuando esta listo.

Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #11 en: 09 de Mayo de 2016, 22:58:05 »
Muchas Gracias por tu Observación ..uZYNQ

Si puede ser, por que no hay manera de obtener el periodo calculado. Voy a probar a ver que pasa.... Pero si puedes fijarte por favor en estos FUSES... a ver si lo puedo hacer trabajar con el reloj externo de 20 MHz.
Muchas Gracias. !!!!
Pd: TE copio los Fuses que estoy usando.

// FBS
#pragma config BWRP = WRPROTECT_OFF     // Boot Segment Write Protect (Boot Segment may be written)
#pragma config BSS = NO_FLASH           // Boot Segment Program Flash Code Protection (No Boot program Flash segment)
#pragma config RBS = NO_RAM             // Boot Segment RAM Protection (No Boot RAM)

// FSS
#pragma config SWRP = WRPROTECT_OFF     // Secure Segment Program Write Protect (Secure segment may be written)
#pragma config SSS = NO_FLASH           // Secure Segment Program Flash Code Protection (No Secure Segment)
#pragma config RSS = NO_RAM             // Secure Segment Data RAM Protection (No Secure RAM)

// FGS
#pragma config GWRP = OFF               // General Code Segment Write Protect (User program memory is not write-protected)
#pragma config GSS = OFF                // General Segment Code Protection (User program memory is not code-protected)

// FOSCSEL
#pragma config FNOSC = PRI              // Oscillator Mode (Primary Oscillator (XT, HS, EC))
#pragma config IESO = OFF               // Internal External Switch Over Mode (Start-up device with user-selected oscillator source)

// FOSC
#pragma config POSCMD = HS              // Primary Oscillator Source (XT Oscillator Mode)
#pragma config OSCIOFNC = OFF           // OSC2 Pin Function (OSC2 pin has clock out function)
#pragma config IOL1WAY = OFF            // Peripheral Pin Select Configuration (Allow Multiple Re-configurations)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Both Clock Switching and Fail-Safe Clock Monitor are disabled)

// FWDT
#pragma config WDTPOST = PS32768        // Watchdog Timer Postscaler (1:32,768)
#pragma config WDTPRE = PR128           // WDT Prescaler (1:128)
#pragma config WINDIS = OFF             // Watchdog Timer Window (Watchdog Timer in Non-Window mode)
#pragma config FWDTEN = OFF              // Watchdog Timer Enable (Watchdog timer always enabled)

// FPOR
#pragma config FPWRT = PWR128           // POR Timer Value (128ms)
#pragma config ALTI2C = OFF             // Alternate I2C  pins (I2C mapped to SDA1/SCL1 pins)

// FICD
#pragma config ICS = PGD1               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
#pragma config JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)



Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #12 en: 10 de Mayo de 2016, 08:51:05 »
Me sucedió eso alguna vez... El problema era que mi cristal no arrancaba y cuando pasa eso el dspic arranca con su oscilador interno... Ya que tienes un osciloscopio, podrías ver también la señal del cristal y confirmar que está oscilando a su frecuencia natural... Que capacitores les pusiste? Lo ideal para esa frecuencia es de 15pF, pero creo que hasta unos 30 pF también funcionaría.

Saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #13 en: 10 de Mayo de 2016, 15:25:15 »
Yo ya no veo nada malo en los fuses, o deberia abrir el MPLAB , crear un proyecto y generarlos, pero parecen estar bien.

Lo que me extraña es que a pesar que esta el IESO deshabilitado ( que NO arranque con el oscilador interno ), que esten deshabilitados los cambios de reloj ( Imposibilita el cambio en la marcha ), aun asi se este ejecutando o arrancando con el oscilador interno.

PD: Tampoco hay nada en el errata.

Desconectado Gabriel_SANLUIS

  • PIC10
  • *
  • Mensajes: 20
Re:Problemas con Timer1 del dsPIC33FJ128GP802
« Respuesta #14 en: 15 de Mayo de 2016, 16:16:26 »
Hola Amigos.
Si, tienen razón. El problema es que no esta arrancando con el cristal Externo de 20MHz .... esta funcionando con el reloj interno. Hice la prueba de sacarle el cristal, mientras funcionaba, y sigue encendiendo el led, con la frecuencia que el quiere. O sea, el problema esta en que no esta bien configurado para arrancar el cristal.
Aca les pego la configuración de los fuses.... que la llamo con un #include"configuracion.h" ..... ( que dicho sea de paso, ya me genero dudas, si esta bien hacerlo asi... pero bue... Aca va.

#include <xc.h>

// FBS
#pragma config BWRP = WRPROTECT_OFF     // Boot Segment Write Protect (Boot Segment may be written)
#pragma config BSS = NO_FLASH           // Boot Segment Program Flash Code Protection (No Boot program Flash segment)
#pragma config RBS = NO_RAM             // Boot Segment RAM Protection (No Boot RAM)

// FSS
#pragma config SWRP = WRPROTECT_OFF     // Secure Segment Program Write Protect (Secure segment may be written)
#pragma config SSS = NO_FLASH           // Secure Segment Program Flash Code Protection (No Secure Segment)
#pragma config RSS = NO_RAM             // Secure Segment Data RAM Protection (No Secure RAM)

// FGS
#pragma config GWRP = OFF               // General Code Segment Write Protect (User program memory is not write-protected)
#pragma config GSS = OFF                // General Segment Code Protection (User program memory is not code-protected)

// FOSCSEL
#pragma config FNOSC = PRI              // Oscillator Mode (Primary Oscillator (XT, HS, EC))
#pragma config IESO = ON                // Internal External Switch Over Mode (Start-up device with FRC, then automatically switch to user-selected oscillator source when ready)

// FOSC
#pragma config POSCMD = HS              // Primary Oscillator Source (HS Oscillator Mode)
#pragma config OSCIOFNC = OFF           // OSC2 Pin Function (OSC2 pin has clock out function)
#pragma config IOL1WAY = ON             // Peripheral Pin Select Configuration (Allow Only One Re-configuration)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Both Clock Switching and Fail-Safe Clock Monitor are disabled)

// FWDT
#pragma config WDTPOST = PS32768        // Watchdog Timer Postscaler (1:32,768)
#pragma config WDTPRE = PR128           // WDT Prescaler (1:128)
#pragma config WINDIS = OFF             // Watchdog Timer Window (Watchdog Timer in Non-Window mode)
#pragma config FWDTEN = ON              // Watchdog Timer Enable (Watchdog timer always enabled)

// FPOR
#pragma config FPWRT = PWR128           // POR Timer Value (128ms)
#pragma config ALTI2C = OFF             // Alternate I2C  pins (I2C mapped to SDA1/SCL1 pins)

// FICD
#pragma config ICS = PGD1               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
#pragma config JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)





 

anything