lunes, 17 de julio de 2017

TIMER 32-DSPIC33FJ

Los estupendos microcontroladores dsPIC33F nos vuelven a sorprender con su módulo Timer, que incorpora hasta 9 Timer que pueden funcionar a 16 o 32 bits.

La serie de micros dsPIC33F dispone de 9 timers de 16 bits, de los cuales el Timer1 trabaja de manera individual, y el resto puede trabajar de forma individual o en parejas como Timer de 32 bits.

Timer1

El esquema del módulo Timer1 es el siguiente:

Como se puede observar en el gráfico, las características del Timer1 son:
  • Timer de 16 bits
  • Contador síncrono de 16 bits
  • Contador asíncrono de 16 bits
  • Acumulador de pulsos altos en TGate
  • Prescaler seleccionable en ratios 1:1, 1:8, 1:64 y 1:256
  • Ajuste fácil del Periodo con PR1
Además, nuestro Timer1 puede seguir funcionando incluso en el modo Idle o Sleep de la CPU.
El Timer1 puede acumular pulsos tanto externos (TCS=1) a través del pin T1CK como internos (TCS=0) al ritmo de la Frecuencia de instrucciones (Tcy). Además, en el modo de trabajo de acumulación de pulsos altos en TGate puede contar los pulsos internos (Tcy) sólo cuando el pin externo T1CK esté a nivel alto lo que permite contar la duración acumulada de una señal a nivel alto. Para seleccionar este modo hay que poner a 1 los bits TCS y TGATE.
El interruptor que nos permite encender y apagar el Timer1 es el bit TON.
A continuación nuestro tren de impulsos atraviesa el prescaler donde es dividido a razón de 1:1, 1:8, 1:64 y 1:256 en función de la combinación seleccionada en los bits TCKPS<1:0>.
A continuación se incrementa en una unidad el registro TMR1. En función del bit de configuración TSYNC, si su valor es 1 el incremento de dicho registro será sincronizado con una señal externa. Cada vez que se incrementa el registro TMR1, se compara con el registro PR1 y en caso de igualdad se pone a 0 el TMR1 y se señala el bit de interrupción T1IF. El registro PR1por defecto vale 0xFFFF con lo que el periodo del Timer1 será ese, pero podemos ajustarlo al valor que queramos, lo que nos permite seleccionar una frecuencia de interrupción programable muy útil.

Timer2/3, Timer 4/5, Timer 6/7 y Timer 8/9

Estos 8 timers pueden funcionar individualmente como timers de 16 bits o en parejas como timers de 32 bits. Su esquema es el siguiente:

Básicamente el funcionamiento de estos Timers a 16 bits es análogo al del Timer1, con excepciones que veremos más adelante0. Para hacerlos trabajar a 32 bits hay que poner a 1 el bit T32. En este caso, los bits de configuración del Timer de 32 bits serán los del Timer par; es decir, si queremos trabajar con la pareja Timer 4/5 hay que setear los bits del Timer4, incluyendo el bit T32=1.
Sin embargo, el bit de señalización de fin de periodo será el del Timer impar, en nuestro ejemplo se activará el bit T5IF.
En el modo de trabajo a 32 bits, la palabra alta la forma el registro TMR impar y la palabra baja el TMR par.
Las excepciones son las siguientes:
  • Sólo el Timer 2/3 puede servir como base de tiempos al módulo CCP (Capture and Output Compare)
  • Sólo el Timer 2/3 puede activar una transferencia de datos al módulo DMA
  • Sólo los Timer 2/3 y Timer 4/5 pueden activar el Trigger del ADC (1 y 2 respectivamente)

Registros

Los registros que utilizaremos para gestionar los Timer son los siguientes:
  • TMRx
  • PRx
  • TxCON
    • TON: enciende (1) o apaga (0) el timer
    • TSIDL: el Timer puede seguir trabajando (1) en modo Idle o Sleep o puede quedar parado (0).
    • TGATE: selecciona el modo de acumulación de pulso a nivel alto (1)
    • TKCPS: Prescaler, según los ratios 1:1 (00), 1:8 (01), 1:64 (10) o 1:256 (11).
    • TSYNC: Sincroniza entrada de clock externa (1)
    • TCS: Selecciona una fuente de clock externa (1) o la frecuencia interna de instrucciones (0).
    • T32 (sólo en Timer2/4/6/8): activa el modo de 32 bits (1)
  • IFS0
    • T1IF / T2IF / T3IF: se activan al finalizar el periodo del Timer.
  • IFS1
    • T4IF / T5IF: idem
  • IFS2
    • T6IF: idem
  • IFS3
    • T7IF / T8IF / T9IF: idem
Texto copiado de la pagina micropic. 
-->http://www.micropic.es/mpblog/2007/02/dspic33f-capitulo-2-el-timer/

Example Code Timer32-DsPIC33FJ


Freq -->Es la frecuencia de trabajo de su dspic en mi caso es de 40MIPS.


Configuracion de registros.



void config_TIMER32(void) {

    float time = 1000; //en milisegundos
    T3CONbits.TON = 0; //Stop any 16-bit Timer3 operation
    T2CONbits.TON = 0; //Stop any 16/32-bit Timer3 operation
    T2CONbits.T32 = 1; //Enable 32-bit Timer mode
    T2CONbits.TCS = 0; //Select internal instruction cycle clock
    T2CONbits.TGATE = 0; //Disable Gated Timer mode
    T2CONbits.TCKPS = 0b10; //Select 1:1 Prescaler Precontador (0 = 01:01, 1 = 01:08, 2 = 1:64, 3 = 1:256)
    long Time_Setup = (Freq / 64) * time;//Configuramos el tiempo deacuerdo al prescale.
    TMR3 = 0x00; //Clear 32-bit Timer (msw)
    TMR2 = 0x00; //Clear 32-bit Timer (lsw)
    PR3 = (Time_Setup / 1000) >> 16; //Load 32-bit period value (msw)
    PR2 = (Time_Setup / 1000) & 0xffff; //Load 32-bit period value (lsw)
    _T3IP = 0x01; //Set Timer Interrupt Priority Level - 7(highest) to 1(lowest)
    _T3IF = 0; //Clear Timer Interrupt Flag
    _T3IE = 1; //Enable Timer interrupt
    T2CONbits.TON = 1; //Start 32-bit Timer

}

Interrupcion del timer32.


void __attribute__((interrupt, auto_psv)) _T3Interrupt(void) {

    _LATA0 = ~_LATA0;
    _T3IF = 0; //Clear interrupt flag
}






1 comentario: