Multitarea PICC pic18f4550 ayuda

saludos a tod@s,

primero que todo debo agradecer a este foro, estoy registrado hace algun tiempo sin hacer post o comentarios, ahora ya ando en un curso de pics de la universidad...

necesito hacer un codigo algo sencillo que se podria realizar de una forma mas sencilla, pero he encontrado la funcion rtos que especificamente se usa para realizar tareas simultaneas, :) y he construido mi code usando esta funcion, pero al momento de simularlo en reloj interno se me va a overflow, pero en simulacion todo va perfecto...

me gustaria que alguien que supiera sobre esta funcion, me ayudara a revisar mi codigo, y me dijera si lo monto funcionaria o que me hace falta...

a parte pues es un pequenio aporte ya que en internet hay muy poco sobre esta funcion...

adjuntos: source files... desing file (isis 7.7) aunque creo que esta en compatibilidad 7.0

desde ya mil gracias...
se trata de el control de un motor paso a paso...
pero mi inetres es sobre la explicacion de la funcion rtos...

gracias!
 

Adjuntos

  • source code.rar
    56.2 KB · Visitas: 68
Yo veo que hasta en la simulacion "se te va en overflow".

Me gustó tu programa, 1988blaster. Espero tener algo de tiempo para revizarlo mas profundamente.
 
Última edición:
Yo veo que hasta en la simulacion "se te va en overflow".

Me gustó tu programa, 1988blaster. Espero tener algo de tiempo para revizarlo mas profundamente.

muchas gracias... la verdad pues si me gustaria mucho que me ayudaras, no se mucho de micros, pero si me gusta mucho programar y siempre hacer que las cosas funcionen perfecto si se puede XD
 
Tu programa provoca un desbordamiento en la Pila porque estas llamando la funcion lol (que se supone tiene su propio hilo de ejecucion) como una funcion ordinaria.
Asi que, o la dejas de llamar desde la funcion teclado o le quitas el hilo de ejecucion. Yo hice esto ultimo comentando la directiva #task(rate=7ms,max=7ms) (que esta encoiima de lol) y el programa funcionó sin desbordamientos de Pila. El motor funcionó a medias.
Pruébalo y cuentamos cómo te va. Por ahora yo tengo que dejar el foro. Saludos.
 
Tu programa provoca un desbordamiento en la Pila porque estas llamando la funcion lol (que se supone tiene su propio hilo de ejecucion) como una funcion ordinaria.
Asi que, o la dejas de llamar desde la funcion teclado o le quitas el hilo de ejecucion. Yo hice esto ultimo comentando la directiva #task(rate=7ms,max=7ms) (que esta encoiima de lol) y el programa funcionó sin desbordamientos de Pila. El motor funcionó a medias.
Pruébalo y cuentamos cómo te va. Por ahora yo tengo que dejar el foro. Saludos.

ummm ya lo intente, aca dejo una imagen de lo que dice ISIS>



si le doy click en la parte del code que me genera overflow... me dirigue a donde defino:

#use delay(clock=4000000)

bueno, ahora posteo el code aca en qoute... porfavor si alguien sabe que sucede porfavor ayudeme...

/*
uso por rtos multiproceso del pic 18f4550
*/
#include <18f4550.h>
//uso de teclado
#include <kbd.c>//libreria aun sin modificar

//intento de definir que se puede producir overflow en el pic
#if BUFFER_SIZE < 32
#warning Buffer Overflow may occur
#endif
//final del intento de dejar producir overflow




#fuses WDT,NOPROTECT,NOCPD,NOLVP,NOPBADEN,INTRC_IO,MCLR,BROWNOUT,BORV20,NOPUT
//overflow por clk interno???
//variables estatic mantiene las variables aunque el codigo este en otro punto
#use delay(clock=4000000)

#include <lcd.c>//LCD normal

#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#define LCD_DATARXD PIN_D3 //intento de usar ese pin como el de salida
//LCD serial


#use rtos(timer=0,minor_cycle=7ms)
int retardo=100;
int ayuda=1;

// the function can be called anything that a standard function can be called
//subrutinas

void lol(void){
//codigo para evaluar el estado de al menos 2 posiciones del teclado

if(input(PIN_A1)==0||input(PIN_A0)==0){
Lcd_putc ("\f");
lcd_gotoxy(1,1); //posicion a escribir
printf(lcd_putc,"pressing a key0");

if(input(PIN_A0)==0){
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"Right Turn");//imprimir entero
//0xa,0x9,0x5,0x6//valores de paso a paso
output_B(0xa);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x6);
delay_ms( retardo);
}

if(input(PIN_A1)==0){
delay_ms(50);
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"Left Turn");//imprimir entero
output_B(0x6);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0xa);
delay_ms( retardo);
}

}

}

void teclado(void){

if(input(PIN_C0)==1&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
output_B(0x10);lol();delay_ms(10);
output_B(0x20);lol();delay_ms(10);
output_B(0x40);lol();delay_ms(10);
output_B(0x80);lol();delay_ms(10);
}

}

void incremento(void){
if(input(PIN_C0)==0||input(PIN_C1)==0){
if(input(PIN_C2)==0&&input(PIN_C4)==1){
retardo = retardo+1;}
}
}

void decremento(void){
if(input(PIN_C0)==0||input(PIN_C1)==0){
if(input(PIN_C2)==1&&input(PIN_C4)==0){
retardo = retardo-1;}
}
}

void derecha(void){
if(input(PIN_C0)==0&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
lcd_gotoxy(1,1); //posicion a escribir
printf(lcd_putc,"Right Turn");//imprimir entero
delay_ms(50);
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"%u",retardo);//imprimir entero
lcd_gotoxy(5,2); //posicion a escribir
printf(lcd_putc,"(ms)");//imprimir entero
output_B(0xa);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x6);
delay_ms( retardo);
}
}

void izquierda(void){lcd_gotoxy(1,1); //posicion a escribir
if(input(PIN_C0)==1&&input(PIN_C1)==0&&input(PIN_C2)==1&&input(PIN_C4)==1){
printf(lcd_putc,"Left Turn");//imprimir entero
output_B(0x6);
delay_ms( retardo);
output_B(0x5);
delay_ms( retardo);
output_B(0x9);
delay_ms( retardo);
output_B(0xa);
delay_ms( retardo);
}
}
//fn subrutinas
void detenido(void){
if(input(PIN_C0)==1&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
Lcd_putc ("\f");
delay_ms(10);
lcd_gotoxy(1,2); //Lcd_putc ("\f"); clarear LCD
printf(lcd_putc,"Future Engineers");//imprimir entero
delay_ms(1);
lcd_gotoxy(1,1); //primera posicion primera linea
printf(lcd_putc,"engine stopped");//imprimir entero
ayuda++;

}
}

//#task(rate=7ms,max=7ms)
void The_first_rtos_task ( )
{
if(input(PIN_C0)==1&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
detenido();

}

}

#task(rate=7ms,max=7ms)
void The_second_rtos_task ( )
{

if(input(PIN_C0)==0&&input(PIN_C1)==1&&input(PIN_C2)==1&&input(PIN_C4)==1){
derecha();
rtos_yield ( );
}

teclado();
rtos_yield ( );
}
#task(rate=7ms,max=7ms)
void The_other_rtos_task ( )
{
if(input(PIN_C0)==1&&input(PIN_C1)==0&&input(PIN_C2)==1&&input(PIN_C4)==1){
izquierda();
}
teclado();
rtos_yield ( );
}

#task(rate=7ms,max=7ms)
void The_other2_rtos_task ( ){
if(input(PIN_C0)==0||input(PIN_C1)==0&&input(PIN_C2)==1&&input(PIN_C4)==0){
delay_ms(50);
decremento();
rtos_yield ( );
}
teclado();
rtos_yield ();
}

#task(rate=7ms,max=7ms)
void The_other3_rtos_task ( ){
if(input(PIN_C0)==0||input(PIN_C1)==0&&input(PIN_C2)==0&&input(PIN_C4)==1){
incremento();rtos_yield ( );
if(retardo==-1){retardo=0;}
}
teclado();
rtos_yield ( );
}


#task(rate=7ms,max=7ms)
void The_third_rtos_task ( )
{
if(input(PIN_C0)==0||input(PIN_C1)==0||input(PIN_C2)==0||input(PIN_C4)==0){
delay_ms(1);
Lcd_putc ("\f");
lcd_gotoxy(1,2); //posicion a escribir
printf(lcd_putc,"%u",retardo);//imprimir entero
lcd_gotoxy(5,2);
printf(lcd_putc,"(ms)");rtos_yield ( );
}

if(input(PIN_C0)==1||input(PIN_C1)==1||input(PIN_C2)==1||input(PIN_C4)==1){
delay_ms(100);
detenido();
}
teclado();
}

void main(void)
{
// Configura los pines del puerto A como entradas
//Inicio LCD
lcd_init();
rtos_run ( );

}
 
Atrás
Arriba