Autor Tema: Configuración del timer1 para Freertos en el PIC18F46K80  (Leído 3367 veces)

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

Desconectado trunksx64

  • PIC10
  • *
  • Mensajes: 16
    • Trunksx64-Blog
Configuración del timer1 para Freertos en el PIC18F46K80
« en: 12 de Abril de 2012, 17:51:02 »
Hola, estoy realizando un pequeño proyecto para el PIC18F46K80, y estoy intentando implementar FreeRTOS, pero he tenido muchos inconvenientes y luego de indagar o mas bien darme cuenta que el error que tengo es de la configuración del Timer1, pues la declaración de la función OpenTimer1 de este en el archivo Port.C es incompatible con este PIC, ya que la función para este requiere dos argumentos:

Función original
Código: [Seleccionar]
OpenTimer1(T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T1_CCP1_T3_CCP2);
Función que he modificado
Código: [Seleccionar]
OpenTimer1(T1_16BIT_RW & T1_SOURCE_FOSC & T1_PS_1_1 , TIMER_GATE_ON);
Para usar el Timer1, he configurado el modulo CCP en su modulo numero 5, ajustando los valores y añadiendo:
Código: [Seleccionar]
CCPTMRSbits.C5TSEL = portBIT_CLEAR;
Y corrijiendo los valores para que la interrupción de prvLowInterrupt(void) sea ahora a  PIR4bits.CCP5IF.

El problema que tengo, es que no se si esto estará bien, sobre todo en la configuracion del Timer1, usando TIMER_GATE_ON, les agradecería mucho su ayuda pues ya he buscado y casi no encuentro información para este PIC y este RTOS.
« Última modificación: 12 de Abril de 2012, 17:57:34 por trunksx64 »
Uno es Amo y Señor de lo que calla, pero un esclavo de lo que dice....

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Configuración del timer1 para Freertos en el PIC18F46K80
« Respuesta #1 en: 12 de Abril de 2012, 21:32:51 »
El tema de GATE en los timer lo habia visto en los PIC24, no en los PIC18  :roll: Muy interesante, igualmente cuando se selecciona el modo Gate, el timer puede ser usado para la medir la duración de una señal externa. En este modo el timer se incrementa al recibir un flanco ascendente en el pin TxCK y continua incrementándose a razón del clock interno (FCY) mientras este se mantenga en nivel alto (1).  Cuando se recibe un flanco descendente en el pin TxCK se detiene la cuenta y se genera una interrupción. Entonces en este caso no hay que habilitarlo.

Igualmente aquí encuentras un port para el 18F46k20, puede ayudar: http://www.embeddedcodesource.com/rtos


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado trunksx64

  • PIC10
  • *
  • Mensajes: 16
    • Trunksx64-Blog
Re: Configuración del timer1 para Freertos en el PIC18F46K80
« Respuesta #2 en: 16 de Abril de 2012, 11:00:16 »
Gracias por Responder, si efectivamente el timer1 de este PIC tienes algunas cualidades que jamas había visto en la serie 18F y ahí mi confusión, luego de hacer algunas pruebas y leer cuidadosamente el DataSheet del 18F46K80, usar el CCP1 junto al timer1 no es posible, pues este esta reservado para el ECCP1, esta tabla muestra como deben ser usados en conjunto:


Ademas de esto requiero el uso de los vectores de interrupción de baja y alta prioridad, la configuración del PORT.C usa solo uno por lo que he modificado el archivo así: donde cambie  algunos nombres y especificando el uso del CCP2, donde se usa PIR1bits.CCP1IF por PIR3bits.CCP2IF

Código: [Seleccionar]
static void High_Interrupt(void);

#pragma code high_vector=0x08

static void High_Interrupt(void) {
    /* Was the interrupt the tick? */
    if (PIR3bits.CCP2IF) {
        _asm goto prvTickISR _endasm
    }
}
#pragma code

Para la configuración del CCP, use el modulo2 dejándolo así;

Código: [Seleccionar]
   ulCompareValue = ulConstCompareValue;
    CCPR2L = (unsigned char) (ulCompareValue & (unsigned long) 0xff);
    ulCompareValue >>= (unsigned long) 8;
    CCPR2H = (unsigned char) (ulCompareValue & (unsigned long) 0xff);

    CCP2CONbits.CCP2M3 = portBIT_SET; /*< Compare match mode. */
    CCP2CONbits.CCP2M2 = portBIT_CLEAR; /*< Compare match mode. */
    CCP2CONbits.CCP2M1 = portBIT_SET; /*< Compare match mode. */
    CCP2CONbits.CCP2M0 = portBIT_SET; /*< Compare match mode. */

    CCPTMRSbits.C2TSEL = portBIT_CLEAR;

    PIR3bits.CCP2IF = portBIT_CLEAR;
    IPR3bits.CCP2IP = portBIT_SET; /*< Interrupt priority. */
    PIE3bits.CCP2IE = portBIT_SET; /*< Interrupt enable. */

En la configuración de las Interrupciones así:

Código: [Seleccionar]
   RCONbits.IPEN = 1; // Habilita los niveles de interrupcion

    INTCONbits.GIEH = 1; // Habilita las interrupciones de alto nivel
    INTCONbits.GIEL = 1; // Habilita las interrupciones de bajo nivel

Ya para finalizar la configuración del Timer1:

Código: [Seleccionar]
unsigned char config1 = 0x00;
unsigned char config2 = 0x00;

config1 = T1_16BIT_RW & T1_PS_1_1 & T1_SOURCE_FOSC & T1_OSC1EN_OFF;
config2 = TIMER_GATE_OFF & TIMER_GATE_INT_OFF;

OpenTimer1(config1, config2);

Y Ahora si, tengo el FreeRTOS funcionando, gracias por la ayuda y espero que les sirva esto.
« Última modificación: 04 de Mayo de 2012, 13:48:31 por trunksx64 »
Uno es Amo y Señor de lo que calla, pero un esclavo de lo que dice....

Desconectado djrc3000

  • PIC10
  • *
  • Mensajes: 4
Re: Configuración del timer1 para Freertos en el PIC18F46K80
« Respuesta #3 en: 04 de Junio de 2012, 14:03:22 »
Disculpa la Pregunta... ¿Con que programador estas programando el PIC18F46K80???... es que compre el PICKIT 2 y desafortunadamente no lo reconoce...