Ascensor controlado con RTOS del CCS en PC

hola

quisiera saber si existe un tutorial para poder crear rtos en pic c, ya que necesito hacer un ascensor en este lenguaje, pero a la hora de controlar los motores, se queda atorado.

muchas gracias
 
quisiera saber si existe un tutorial para poder crear rtos en pic c, ya que necesito hacer un ascensor en este lenguaje, pero a la hora de controlar los motores, se queda atorado.

Por que no explicas claramente de que estás hablando?
Yo he controlado motores de CC con el RTOS del CCS y funciona perfectamente.
 
Por que no explicas claramente de que estás hablando?
Yo he controlado motores de CC con el RTOS del CCS y funciona perfectamente.

mi proyecto consiste en un ascensor controlado con rtos, por eso debo controlar los motores tanto de las puertas como los de movimiento, he generado las tareas para ello, pero cuando llega a la tarea del movimiento del motor, no sale de ella.

quisiera saber si hay algo mal en mi codigo, o si estoy omitiendo algo, podrias mostrarme como manejaste los motores con rtos?

gracias
 
mi proyecto consiste en un ascensor controlado con rtos, por eso debo controlar los motores tanto de las puertas como los de movimiento, he generado las tareas para ello, pero cuando llega a la tarea del movimiento del motor, no sale de ella.

Eso es por que la tarea está mal diseñada.
El RTOS es un multitarea cooperativo y si te quedás encerrado en un loop (y seguro que eso es lo que has hecho) ninguna otra tarea va a quitarlo de allí.

El, RTOS dispara las tareas al ritmo temporal que hayas especificado SIN NECESIDAD DE NINGUN LOOP, así que si has puesto algo del tipo
Código:
while( true) {
...
}
Andá pensando en quitarlo.

quisiera saber si hay algo mal en mi codigo, o si estoy omitiendo algo

Como no pongas el código, no puedo decirte nada.
 
Hola, planteo mi problema:
Estoy intentando hacer un control PID de luz para una habitación, el pic tiene que hacer el PID, imprimir en un lcd, leer pulsos en distintos pines y leer adc en tres canales distintos y asignarlos a un pwm, para que éste responda rápido estoy utilizando un RTOS, simulado sale muy bien en proteus pero una vez que lo monto en el circuito, el cálculo del PID lo hace muy lento y mi lámpara se va prendiendo a la velocidad de un caracol.
No sé si el pic se alenta con tantas tareas, o si el tiempo de ejecución entre tareas está mal, les dejo parte del código de las tareas:
Código:
#INCLUDE <18F4550.h>
#device adc=10
#use delay(clock=8000000)
#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL1,CPUDIV1
#include <lcd.c>
#use rtos(timer=0,minor_cycle=1ms)

//TAREAS
#task (rate=10ms,max=1ms)
void leer_pulsadores( );//LEE los pulsos y mediante éstos habilita distintas tareas 
#task (rate=1ms,max=1ms,enabled=false)  
void pid();//TAREA PID
#task (rate=10ms,max=1ms,enabled=false)  
void manual();//TAREA PWM MANUAL
#task (rate=10ms,max=1ms,enabled=false)  
void off();//TAREA APAGADO PWM
#task (rate=10ms,max=1ms,enabled=false)
void display();//TAREA DEL DISPLAY

No uso semáforos en ninguna tarea, puesto que éstas se habilitan con rtos_disable(); y rtos_enable(); si se pulsa un pin específico en el pic mediante la tarea leer_pulsadores.
No utilizo cristales externos, no se si esto sea el problema.

Se aceptan sugerencias D:! ...
 
Ese es un error muy común que pasa por no leer la hoja de datos.
El PIC18F4550 cuenta con un módulo USB que puede ejecutarse a 48 MHz.
Para obtener los 48 MHz, se disponen de varios tipos de configuración para el oscilador principal.

Éste PIC cuenta con un sistema de monitoreo para fallas del oscilador principal. (Fail-Safe Clock Monitor)
Si la palabra de configuración no es correcta, o si existe alguna falla, el sistema entra en funcionamiento.

Como tú lo quieres ejecutar a 8 MHz, necesitas establecer la palabra de configuración correcta.
De otra forma el oscilador trabajará a 1 MHz, que es la frecuencia por defecto del oscilador interno en el POR (Power On Reset)
Esto se define en el registro OSCCON, bits IRCF2<>IRCF0

PIC C Compiler puede establecer la palabra de configuración correcta de forma sencilla.

Oscilador a cristal de 8 MHz.:
Código:
[B][COLOR=Red]#fuses[/COLOR]   NOFCMEN,NOIESO,NOVREGEN,NOPBADEN
#use delay(crystal = [COLOR=Green]8[/COLOR]MHz)[/B]
Aquí se establece lo siguiente:
Desactivar el fuse FCMEN (Fail-Safe Clock Monitor Enable bit)
Desactivar el fuse IESO (Internal/External Oscillator Switchover bit)
Desactivar el fuse VREGEN (USB Internal Voltage Regulator Enable bit)
Desactivar el fuse PBADEN (PORTB A/D Enable bit)

Al desactivar el fuse FCMEN, nos podemos percatar de que el oscilador a cristal esté funcionando.
Si no funciona, el PIC no hará absolutamente nada. (No se activará el sistema de fallas del oscilador)

No se necesita conmutar entre el oscilador externo y el interno, así que se desactiva el fuse IESO.
No se usará el módulo USB, así que se desactiva el regulador de voltaje interno. Fuse VREGEN.
Tampoco se usarán los conversores A/D del puerto B, entonces se desactivan. Fuse PBADEN.
Éste fuse es opcional porque PIC C se encarga de que todos los pines sean Digital I/O al iniciar.

Los demás fuses resulta redundante establecerlos porque de la forma en que se declaró la palabra de configuración, el compilador colocará los bits por defecto sobre cada uno de los registros CONFIGXX, que resultarán adecuados para una ejecución común.

Suerte.
 
D@rkbytes, tienes razón en lo de no leer el data, no me quise adentrar mucho hasta ahora, mi problema se solucionó agregando los FUSES que me comentaste mas otros que agregué desde el PICWizard basado en mi configuración, también mejoró bastante agregando:
Código:
#use delay(internal=8M)

Gracias! Saludos :p
 
Última edición:
Atrás
Arriba