Autor Tema: rtos ccs minor_cycle  (Leído 2287 veces)

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

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
rtos ccs minor_cycle
« en: 23 de Diciembre de 2009, 16:35:25 »
Hola
Intentando desviar mi atención de la fiebre navideña decidí comenzar con el rtos de ccs asunto al cual le tengo ganas ya de tiempo y es el motivo principal por el que decidí comenzar con ccs, ya que como es sabido por todos ccs lo integra y digamos que es la forma mas fácil de comenzar a entender esto del rtos.
Pues bien gamas pensé en atorarme a los dos segundos de comenzar con el asunto lo cual me frustra en exceso me explico.
Según el excelente tutorial de reiniertl  el minor_cycle debe ser menor o igual al desbordamiento del tmr que se utilice en este caso el tmr0, en los ejemplos se maneja un valor para el minor_cycle de 10ms y no encuentro como es que asido calculado este valor
Según yo como entiendo que  esta configurado el tmr0 es así
#use RTOS(timer=0, minor_cycle=10ms) //temporizador Timer0, tiempo mínimo de ejecución de cada tarea 10ms
Por lo que entiendo en esta línea se esta precargado en tmr0 con un valor de cero

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

En esta  en tiendo que el preescaler esta 1:1
Considerando que el cristal usado esta a 20mhz
Con estos valores el pic timer me da un resultado de 0,0512ms
Entonces como es que se obtiene el desbordamiento cada 10ms ¿??
Como es que se configuro el tmr0 para obtener el valor de 10ms??
Espero que alguien pueda darme luz en este asunto, como pueden ver estoy atorado en algo súper esencial para el rtos la base de tiempo.
También  copie el primer ejemplo de dicho tutorial y resulta que siempre ejecuta la tarea 1 y no tengo ni jodida idea de porque lo hace pego el código, seguramente algo estoy configurando mal.
Como siempre les agradezco cualquier comentario y felices fiestas




Código: [Seleccionar]

#include <16f877a.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT,NOPUT,NOBROWNOUT,NODEBUG               
#use delay(clock=20000000)


////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
////////////////////////////////////////////////////////////////////////////////
 
#define TTL_TX PIN_C6
#define TTL_RX PIN_C7
#use rs232(baud=9600, xmit=TTL_TX, rcv=TTL_RX)

#use RTOS(timer=0, minor_cycle=10ms) //temporizador Timer0, tiempo mínimo de ejecución de cada tarea 10ms
int8 test;

//Definición de las prototipos de función de las tareas
#task (rate=1s, max=10ms)  //Ejecutar cada 1 segundo y consumir como máximo 10ms
void Tarea1();
 
#task (rate=2s, max=5ms)  //Ejecutar cada 2 segundos y consumir como máximo 5ms
void Tarea2();
 
#task (rate=3s, max=250us)  //Ejecutar cada 3 segundo y consumir como máximo 250us
void Tarea3();
 
void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   rtos_run();  //A partir de aquí comenzará la ejecución de las tareas
 
}
 
//Implementación de las tareas
void Tarea1()
{
  printf("Ejecutada tarea 1\r");
}
 
 
void Tarea2()
{
  printf("Ejecutada tarea 2\r");
}
 
void Tarea3()
{
 printf("Ejecutada tarea 3\r");
}







Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: rtos ccs minor_cycle
« Respuesta #1 en: 23 de Diciembre de 2009, 17:38:10 »
Que me acuerde uno no tiene ni que preocparse por como se calcula, solo hay que elegir un timer para que el compilador lo use como base. Lo único que hay que tener en cuenta es que, hay ciertos valores de frecuencia en donde no se cumple la temporización.  :5]



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

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: rtos ccs minor_cycle
« Respuesta #2 en: 23 de Diciembre de 2009, 17:59:19 »
Hola

Te agradezco
 
Lo que me tiene dando vueltas es que el amigo  reiniertl es su segundo ejemplo tiene este comentario.

Citar
//Como el reloj de este micro se ha puesto a correr con 20MHz el Timer0 no tiene
//mayor resolución que 10ms, es por eso que el tiempo mínimo de ejecución es de 10ms
Por más que le doy a los cálculos no me es posible determinar como es que obtiene  ese valor
saludos