Autor Tema: Funciones simultáneas, multitarea?  (Leído 6741 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Funciones simultáneas, multitarea?
« en: 19 de Diciembre de 2009, 14:54:41 »
Hola a todos,

Me ha surgido un inconveniente en un programa y no se como solucionarlo.

Dentro de un programa, en el que realiza una serie de funciones tal que así

void main()
{
Función 1();
Función 2();
Función 3();
..
}

me encuentro con que una de ellas tiene una demora de 1 segundo, y me preguntaba si podría usarse simultáneamente con otras.

Otras funciones usan las interrupciones, como muestrar en display, lectura de sondas, etc. pero ésta mueve un pequeño pap, y el movimiento dura ese segundo, y hasta que no acabe no pasa de función y las otras no pueden tomar decisiones.

Se me había ocurrido introducirla en el timer2 (el resto ocupados), y que por desborde entre paso y paso del motor me haga el resto de las funciones, pero no estoy seguro.

He leído algo sobre RTOS, funcionaría para lo que busco?

Gracias de antemano.

Un saludo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones simultáneas, multitarea?
« Respuesta #1 en: 19 de Diciembre de 2009, 15:59:45 »
Puedes mediante interrupción por algún timer controlar en ese segundo al motor PAP.


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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Funciones simultáneas, multitarea?
« Respuesta #2 en: 19 de Diciembre de 2009, 16:56:16 »
Gracias Suki,

He introducido una rutina en el timer2 que cada desborde sume un paso, lo he probado físicamente y funciona, ahora está en que funcione con el resto del programa.

Esperemos que funcione y no haga cosas extrañas  :-).

Un saludo!

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Funciones simultáneas, multitarea?
« Respuesta #3 en: 21 de Diciembre de 2009, 07:04:06 »
Hola de nuevo,

Pues todo el gozo a un pozo..   :5] después de medio terminar el programa, no funciona...

Os explico, tengo una rutina que muestra la hora de un ds1307 dentro del timer1 a un display lcd, otra rutina que mueve un pap dentro del timer2, otra que hace la lectura del adc dentro del timer3 y el resto del programa con sus correspondientes funciones.

Pues el programa se pasa el tiempo dentro de las interrupciones, sin embargo, si a las rutinas las llamo desde las funciones del programa, va muy lento, al menos en la simulación (CPU al 60%) y eso que tengo el reloj a 48MHz. El problema es que así, si tengo que hacer un delay dentro del programa principal, el resto no corre y eso es lo que no me interesa, no se si lo que trato de hacer será posible con estos pic.

Lo que busco es que haga cada una de las tareas independientemente, que cada una vaya por separado, si el programa principal hace digamos un delay, que lo haga pero el resto de rutinas que sigan trabajando, no sé si con un 18f4550 se podrá hacer.

A ver si me podéis aclarar algo.

Gracias de antemano.

Un saludo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones simultáneas, multitarea?
« Respuesta #4 en: 21 de Diciembre de 2009, 08:28:38 »
Muéstranos como estas administrando las tareas para ver si es posible o solo algún error.


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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Funciones simultáneas, multitarea?
« Respuesta #5 en: 21 de Diciembre de 2009, 08:49:37 »
Voy a poner algo del código, la parte de las interrupciones, y la función que estoy simulando, no sé si te referirás a eso Suky

Se me había ocurrido el dividir el programa en varios pic pequeños, uno con el control pap y las sondas, otro con el lcd y el ds1307 y el del programa principal, que lo que trato de hacer más o menos es eso, programas independientes..

Código: C
  1. #int_timer1
  2. Void DisplayTime()
  3. {
  4. T0++;
  5.  
  6. if (T0==10)
  7.  
  8.    {
  9.  
  10. ds1307_get_time(hr,min,sec);
  11. ds1307_get_date(day,mth,year);
  12.  
  13. lcd_gotoxy(1,2); printf(lcd_putc,"%02d:%02d",hr,min);
  14. lcd_gotoxy(9,2); printf(lcd_putc,"%02d/%02d/%02d",day,mth,year);
  15.  
  16. if (sec==0) MinCont++;
  17. if (sec==0 && ModeSet==2 && CompOnFlag==1) MinContDSC++;
  18.  
  19. if (MIN==0 && ON==1) CleanF++;
  20.  
  21. if (CleanF==240)
  22.    {
  23.    CleanFilter=1;
  24.    DisplayCF();
  25.    }
  26.  T0=0;
  27.  }
  28.  
  29.  clear_interrupt(INT_TIMER1);
  30. }
  31.  
  32. #int_timer2
  33. Void louver()
  34.    {
  35.  
  36.  
  37. //POSICIONAMIENTO DE PARADA DEL DIFUSOR
  38.  
  39.   if (ON==0)
  40.       {
  41.     if (NPasos > 0)
  42.         {
  43.          output_d(Secuencia[Paso]);
  44.          Paso-=1;
  45.          NPasos-=1;
  46.          if (Paso == -1) Paso = 3;
  47.          if (NPasos==0) OkStop=1;
  48.          }
  49.       }
  50.  
  51.  else {
  52. //MODO AUTOMÁTICO
  53.  
  54.    if (swing==1)
  55.       {
  56.  
  57. //HACIA ATRAS
  58.  
  59.        if (Rw == 0){
  60.              output_d(Secuencia[Paso]);
  61.              Paso+=1;
  62.              NPasos+=1;
  63.          if (Paso==4) Paso=0;    
  64.          if (Npasos==Posicion[3]) {Paso=3; rw=1;}
  65.                 }
  66. //HACIA ADELANTE
  67.  
  68.   else if (Rw == 1){
  69.              output_d(Secuencia[Paso]);
  70.              Paso-=1;
  71.              NPasos-=1;
  72.          if (Paso == -1) Paso = 3;    
  73.          if (NPasos==Posicion[0]) {Paso=0; rw=0;}
  74.                }      
  75.  
  76.       }
  77.      
  78. //MODO MANUAL
  79.  
  80. //POSICION 1  
  81.  
  82.   if (swing==2)
  83.       {
  84.         if (Npasos != Posicion[1])
  85.          {
  86.           if (Npasos < Posicion[1])
  87.             {
  88.              output_d(Secuencia[Paso]);
  89.              Paso+=1;
  90.              NPasos+=1;
  91.          if (Paso==4) Paso=0;
  92.  
  93.             }
  94.          
  95.          if (Npasos > Posicion[1])
  96.             {
  97.              output_d(Secuencia[Paso]);
  98.              Paso-=1;
  99.              NPasos-=1;
  100.          if (Paso == -1) Paso=3;
  101.             }
  102.  
  103.          }
  104.      if (Npasos == Posicion[1]) output_d(0x00);
  105.      
  106.      }
  107.  
  108. //POSICION 2
  109.  
  110.   if (swing==3)
  111.       {
  112.         if (Npasos != Posicion[2])
  113.          {
  114.           if (Npasos < Posicion[2])
  115.             {
  116.              output_d(Secuencia[Paso]);
  117.              Paso+=1;
  118.              NPasos+=1;
  119.          if (Paso==4) Paso=0;
  120.             }
  121.          
  122.          if (Npasos > Posicion[2])
  123.             {
  124.              output_d(Secuencia[Paso]);
  125.              Paso-=1;
  126.              NPasos-=1;
  127.          if (Paso == -1) Paso=3;
  128.             }
  129.  
  130.          }
  131.      if (Npasos == Posicion[2]) output_d(0x00);
  132.      }
  133.  
  134. //POSICION 3
  135.  
  136.   if (swing==4)
  137.       {
  138.         if (Npasos < Posicion[3])
  139.          {
  140.              output_d(Secuencia[Paso]);
  141.              Paso+=1;
  142.              NPasos+=1;
  143.          if (Paso==4) Paso=0;
  144.          }
  145.      if (Npasos == Posicion[3]) output_d(0x00);
  146.      }
  147.  
  148. //VUELVE AL MODO AUTO
  149.  
  150.   if (swing==6) {Rw=1; Swing=1;}
  151.  }
  152.  clear_interrupt(INT_TIMER2);
  153.  
  154.  }
  155.  
  156.  
  157. #int_timer3
  158. Void LecturaSondas()
  159.  {  
  160.   int16 NtcBeta=4050, ReadNtc=0;
  161.   float ResNtc=0,Vntc=0;
  162.  
  163.    set_adc_channel(0);
  164.    delay_us(20);
  165.    
  166.    ReadNtc = Read_ADC();
  167.    Vntc = 5.0 * ReadNtc  / 1024.0;
  168.  
  169.    ResNtc =  Vntc * 10000.0  / ( 5.0 - Vntc ) ;
  170.    TempRoom = (1.0 / (((log(ResNtc/20000.0) * (1.0 / NtcBeta) )) + (1 / 298.15))) - 273.15;
  171.    
  172.    set_adc_channel(1);
  173.    delay_us(20);
  174.    
  175.    ReadNtc = Read_ADC();
  176.    Vntc = 5.0 * ReadNtc  / 1024.0;
  177.  
  178.    ResNtc =  Vntc * 10000.0  / ( 5.0 - Vntc ) ;
  179.    TempHeatExchanger = (1.0 / (((log(ResNtc/20000.0) * (1.0 / NtcBeta) )) + (1 / 298.15))) - 273.15;
  180.  
  181.    Templimit = fabs(TempRoom);
  182.  
  183.    set_adc_channel(2);
  184.    delay_us(20);
  185.    
  186.    ReadNtc = Read_ADC();
  187.    Vntc = 5.0 * ReadNtc  / 1024.0;
  188.  
  189.    ResNtc =  Vntc * 10000.0  / ( 5.0 - Vntc ) ;
  190.    TempHeXExt = (1.0 / (((log(ResNtc/20000.0) * (1.0 / NtcBeta) )) + (1 / 298.15))) - 273.15;
  191.  
  192.   set_timer3(50000);
  193.   clear_interrupt(INT_TIMER3);
  194.  
  195.  }

y aquí la función con la que estoy probando, el resto son parecidas

Código: C
  1. Void MarchaMenu()
  2.    {
  3.    
  4.          while (ON==1)
  5.             {
  6.                switch (ModeSet)
  7.                   {
  8.                // case 0:  Swing=1; Autom();       Break;
  9.                   case 1:  Swing=1; Frio();        Break;
  10.                   case 2:  Swing=5; Calor();       Break;
  11.                   case 3:  Swing=2; Dry();         Break;
  12.                   case 4:  Swing=1; Vent();        Break;
  13.                   case 5:  TimeAdjust();           Break;
  14.                   default:                         Break;
  15.                   }
  16.      
  17.           }
  18.    }  
  19.  
  20.  
  21. Void Frio()
  22.    {
  23.    
  24.       short FrostProtect=0;
  25.      
  26.       lcd_gotoxy(1,1); lcd_putc("COOL");
  27.      
  28.       CompMinTimeOFF = MinCont;
  29.      
  30. //EN CASO DE CAMBIO DE MODO
  31.  
  32.    if (FlagCambio==1)                
  33.        {
  34.         COMPRESOR=0;
  35.         VENTEXT=0;
  36.         RetardoV4
  37.         V4=0;
  38.         RetardoOnCompresor;
  39.         FlagCambio=0;
  40.        }
  41.        
  42. //FUNCIONAMIENTO NORMAL
  43.  
  44.        V4=0;
  45.        VintON=1;
  46.        
  47. //SI LA TEMPERATURA DE LA HABITACION ES >=
  48. //QUE LA TEMPERATURA PREFIJADA + 1 GRADO ...
  49. //Y SE CUMPLEN LOS 3 MIN DE SEGURIDAD DE PARO DEL COMPRESOR...
  50.  
  51.     if (TempLimit >= (TempSet+Diferencial) && (MinCont >= (3 + CompMinTimeOFF)) )
  52.        {
  53.         COMPRESOR = 1;
  54.         VENTEXT = 1;
  55.        
  56.         if (FlagTimeCompOFF == 1)
  57.          {
  58.            MinCont=0;
  59.            CompMinTimeON = MinCont;
  60.            FlagTimeCompOFF = 0;
  61.            FlagTimeCompON = 1;
  62.          }
  63.        }
  64.  
  65. //SI LA TEMPERATURA DE LA HABITACION ES <=
  66. //QUE LA TEMPERATURA PREFIJADA - 1 GRADO
  67. //Y SE CUMPLEN LOS 5 MIN DE SEGURIDAD DE MARCHA DEL COMPRESOR...
  68.  
  69.  else if ((TempLimit <= (TempSet - Diferencial)) && (MinCont >= (5 + CompMinTimeON)))
  70.        {
  71.         COMPRESOR = 0;
  72.         delay_ms(15000);
  73.         VENTEXT = 0;
  74.         FlagTimeCompOFF=1;
  75.        
  76.         if (FlagTimeCompON == 1)
  77.          {
  78.            MinCont=0;
  79.            CompMinTimeOFF = MinCont;
  80.            FlagTimeCompON=0;
  81.          }
  82.        }
  83.        
  84.        
  85.  
  86. //PROTECCIÓN DE CONGELACIÓN DEL EVAPORADOR
  87.  
  88.     if (TempHeatExchanger < 0)
  89.        {
  90.        delay_ms(180000);
  91.        FrostProtect = 1;
  92.        
  93.      
  94.         COMPRESOR = 0;
  95.         delay_ms(15000);
  96.         VENTEXT = 0;
  97.         VintMid
  98.      
  99.        while (FrostProtect == 1)
  100.         {
  101.        
  102.         if (TempHeatExchanger > 10)
  103.         FrostProtect=0;
  104.         }
  105.        
  106.        }
  107.  
  108. //CONTROL DE LA VENTILACION
  109.  
  110.     Vent();
  111.     SleepTime();
  112.  
  113.   }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones simultáneas, multitarea?
« Respuesta #6 en: 21 de Diciembre de 2009, 09:12:38 »
Está clarito el problema, no puedes realizar tantas tareas dentro de la interrupción. El que muestra la hora en el LCD, hay que utilizar una bandera para indicarlo y en el programa principal desarrollaría lo demás. En el que se capturan las sondas, solo determinaría la lectura de los pines analógicos y las cuentas en el programa principal, y si usas un 18F no es necesario 20us sino menos, que ya lo explique en el otro hilo.

El único que dejaría como está o trataría de hacerlo más eficiente sería el del control del motor PAP.



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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Funciones simultáneas, multitarea?
« Respuesta #7 en: 21 de Diciembre de 2009, 09:28:12 »
Gracias por las aclaraciones, Suky, creo que lo entendí, como se dice por aquí, "el que no sabe es como el que no ve".

Voy a probar a ver que tal con las modificaciones.

Lo que sigue sin quedarme claro es, si el programa principal entra dentro de una función tal que así, hasta que no pase el tiempo de los delay, no habría actualización de la hora en el display, lectura de sondas, etc, aunque las interrupciones levantaran la bandera, como el resto del código estaría fuera, hasta no trascurrir el retardo no funcionaría.

Saludos!

Código: C
  1. if (TempHeatExchanger < 0)
  2.        {
  3.        delay_ms(180000);
  4.        FrostProtect = 1;
  5.        
  6.      
  7.         COMPRESOR = 0;
  8.         delay_ms(15000);
  9.         VENTEXT = 0;
  10.         VintMid
  11.      
  12.        while (FrostProtect == 1)
  13.         {
  14.        
  15.         if (TempHeatExchanger > 10)
  16.         FrostProtect=0;
  17.         }
  18.        
  19.        }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones simultáneas, multitarea?
« Respuesta #8 en: 21 de Diciembre de 2009, 11:38:11 »
Colócalo dentro de un bucle infinito y preguntado con if(tarea1?) por que tareas realizar, de esa manera no quedarías esperando sino se harían cuando se active alguna bandera y será mucho más dinámico.

Código: C
  1. while(1){
  2.     if(...){
  3.          // Es tiempo de actualizar hora...
  4.     }
  5.     if(...){
  6.         // Se realizaron lecturas de sonda, ahora calculamos y ...
  7.     }
  8. }
No contesto mensajes privados, las consultas en el foro

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Funciones simultáneas, multitarea?
« Respuesta #9 en: 21 de Diciembre de 2009, 15:11:46 »
Bueno, pues así lo hice, incluso probé a desactivar la interrupción al salir de ella y activarla antes de cada función, pero de cualquier forma poniendo la simulación en pausa y avanzando paso a paso, se queda haciendo un bucle entre timer 2 y timer 3, incluso con las banderas desactivadas, pruebe de la forma que pruebe... :5]

Sigo pensándome en dividir el programa en 3 pic y hacer que funcionen en paralelo.

Saludos!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones simultáneas, multitarea?
« Respuesta #10 en: 21 de Diciembre de 2009, 15:25:47 »
No entiendo que pasa, se queda en las interrupciones timer2  y 3 y no ejecuta nada del main? Cada cuanto se interrumpen?


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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Funciones simultáneas, multitarea?
« Respuesta #11 en: 21 de Diciembre de 2009, 15:33:46 »
Ejecuta el main al principio,

Código: C
  1. Void main()
  2.    {
  3.     SET_TRIS_a(0B00000111);
  4.     SET_TRIS_B(0B11100001);
  5.     SET_TRIS_C(0X00);
  6.     SET_TRIS_E(0X00);
  7.     SET_TRIS_D(0X00);
  8.    
  9.     output_d(0x00);
  10.     output_c(0x00);
  11.     output_b(0x00);
  12.     output_a(0x00);
  13.    
  14.     SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_128);
  15.     SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);
  16.     SETUP_TIMER_3(T3_INTERNAL|T1_DIV_BY_1);
  17.     SETUP_TIMER_2(T2_DIV_BY_16,250,16);
  18.     SETUP_ADC(ADC_CLOCK_DIV_64);
  19.     SETUP_ADC_PORTS(AN0_TO_AN2);
  20.     set_timer1(250);
  21.     set_timer3(250);  
  22.  
  23.  
  24.     EXT_INT_EDGE(L_TO_H);
  25.    
  26.     ENABLE_INTERRUPTS(INT_TIMER0);
  27.     ENABLE_INTERRUPTS(INT_TIMER1);
  28.     ENABLE_INTERRUPTS(INT_TIMER2);
  29.     ENABLE_INTERRUPTS(INT_TIMER3);
  30.     ENABLE_INTERRUPTS(INT_EXT);
  31.    
  32.  
  33.     lcd_init();
  34.    
  35.    
  36.     ds1307_init(DS1307_ALL_DISABLED);
  37.    
  38.     COMPRESOR = 0;
  39.     VENTEXT = 0;
  40.     VintOFF
  41.     V4 = 0;
  42.     OKStop = 0;
  43.    
  44.     MarchaMenu();

Pasa a MarchaMenu , que está puesto más arriba, recorre la función Frio un par de veces y se acabó, se estanca en los timer antes mencionados, y con las banderas sin levantar, es decir que entra en el timer, ve que la bandera no está on y pasa de largo al siguiente, y así sucesivamente sin volver a MenuMarcha();.


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones simultáneas, multitarea?
« Respuesta #12 en: 21 de Diciembre de 2009, 15:54:33 »
Todavía no tengo la capacidad de adivinar  :mrgreen: a que frecuencia trabajas? Para ver cada cuanto se interrumpen. Además viendo sectorcitos de código veo difícil determinar el inconveniente  :? Cuales son las banderas, que función cumple cada una. Eso hay que ir indicándolo en el código, sino lo vas a dejar una semana por la fiesta y después no vas a entender nada!  :D


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

Desconectado iNoXSteeL

  • PIC12
  • **
  • Mensajes: 75
    • La web de InoX
Re: Funciones simultáneas, multitarea?
« Respuesta #13 en: 21 de Diciembre de 2009, 16:13:10 »
Suky, que pena que no adivines...  :mrgreen:  trabajo a 20MHz, voy a poner el código que estoy simulando, ya que lo tengo dividido en varios archivos y es algo largo.

Código: C
  1. #include <18f4455.h>
  2. #device adc=10
  3. #fuses HS,NOWDT,NOPUT,NOPROTECT,NOLVP,NOMCLR
  4. #use delay(clock=20M)
  5.  
  6. #use fast_io(A)
  7. #use fast_io(B)
  8. #use fast_io(C)
  9. #use fast_io(D)
  10. #use fast_io(E)
  11.  
  12.  
  13. #include <lcd.c>
  14. #include <math.h>
  15. #include <ds1307.c>
  16.  
  17. #include <Variables.c>
  18. #include <PrototiposFunciones.c>
  19. #include <SleepTime.c>
  20. #include <DisplayTime.c>
  21. #include <LecturaSondas.c>
  22. #include <ModoFrio.c>
  23. #include <ModoVent.c>
  24. #include <Marcha.c>
  25.  
  26.  
  27. #int_timer1
  28. Void GetTime()
  29.    {
  30.  int t0=0;
  31.  
  32.  t0++;
  33.  if (t0>=10 && LeeCLOCK==1)     //LEECLOCK es la bandera
  34.    {
  35.    ds1307_get_time(hr,min,sec);
  36.    ds1307_get_date(day,mth,year);
  37.    t0=0;
  38.    LeeCLOCK=0;
  39.  
  40.     set_timer1(250);
  41.     clear_interrupt(INT_TIMER1);
  42.    }
  43.    }
  44.  
  45.  
  46. #int_timer2
  47. Void louver()
  48.    {
  49.  
  50.  
  51. //POSICIONAMIENTO DE PARADA DEL DIFUSOR
  52.  
  53.   if (ON==0)
  54.       {
  55.     if (NPasos > 0)
  56.         {
  57.          output_d(Secuencia[Paso]);
  58.          Paso-=1;
  59.          NPasos-=1;
  60.          if (Paso == -1) Paso = 3;
  61.          if (NPasos==0) OkStop=1;
  62.          }
  63.       }
  64.  
  65.  if (MovPap==1){                     //AQUI LA BANDERA ES MOVPAP
  66. //MODO AUTOMÁTICO
  67.  
  68.    if (swing==1)
  69.       {
  70.  
  71. //HACIA ATRAS
  72.  
  73.        if (Rw == 0){
  74.              output_d(Secuencia[Paso]);
  75.              Paso+=1;
  76.              NPasos+=1;
  77.          if (Paso==4) Paso=0;    
  78.          if (Npasos==Posicion[3]) {Paso=3; rw=1;}
  79.                 }
  80. //HACIA ADELANTE
  81.  
  82.   else if (Rw == 1){
  83.              output_d(Secuencia[Paso]);
  84.              Paso-=1;
  85.              NPasos-=1;
  86.          if (Paso == -1) Paso = 3;    
  87.          if (NPasos==Posicion[0]) {Paso=0; rw=0;}
  88.                }      
  89.  
  90.       }
  91.      
  92. //MODO MANUAL
  93.  
  94. //POSICION 1  
  95.  
  96.   if (swing==2)
  97.       {
  98.         if (Npasos != Posicion[1])
  99.          {
  100.           if (Npasos < Posicion[1])
  101.             {
  102.              output_d(Secuencia[Paso]);
  103.              Paso+=1;
  104.              NPasos+=1;
  105.          if (Paso==4) Paso=0;
  106.  
  107.             }
  108.          
  109.          if (Npasos > Posicion[1])
  110.             {
  111.              output_d(Secuencia[Paso]);
  112.              Paso-=1;
  113.              NPasos-=1;
  114.          if (Paso == -1) Paso=3;
  115.             }
  116.  
  117.          }
  118.      if (Npasos == Posicion[1]) output_d(0x00);
  119.      
  120.      }
  121.  
  122. //POSICION 2
  123.  
  124.   if (swing==3)
  125.       {
  126.         if (Npasos != Posicion[2])
  127.          {
  128.           if (Npasos < Posicion[2])
  129.             {
  130.              output_d(Secuencia[Paso]);
  131.              Paso+=1;
  132.              NPasos+=1;
  133.          if (Paso==4) Paso=0;
  134.             }
  135.          
  136.          if (Npasos > Posicion[2])
  137.             {
  138.              output_d(Secuencia[Paso]);
  139.              Paso-=1;
  140.              NPasos-=1;
  141.          if (Paso == -1) Paso=3;
  142.             }
  143.  
  144.          }
  145.      if (Npasos == Posicion[2]) output_d(0x00);
  146.      }
  147.  
  148. //POSICION 3
  149.  
  150.   if (swing==4)
  151.       {
  152.         if (Npasos < Posicion[3])
  153.          {
  154.              output_d(Secuencia[Paso]);
  155.              Paso+=1;
  156.              NPasos+=1;
  157.          if (Paso==4) Paso=0;
  158.          }
  159.      if (Npasos == Posicion[3]) output_d(0x00);
  160.      }
  161.  
  162. //VUELVE AL MODO AUTO
  163.  
  164.   if (swing==6) {Rw=1; Swing=1;}
  165.  
  166.  set_timer2(250);
  167.  clear_interrupt(INT_TIMER2);
  168.  MovPaP=0;
  169.  
  170.  } }
  171.  
  172.  
  173. #int_timer3
  174. Void GetSondas()
  175.  {  
  176.  
  177.   if (LeeSOND==1)                    
  178.    {
  179.    set_adc_channel(0);
  180.    delay_us(6);
  181.    
  182.    ReadNtc1 = Read_ADC();
  183.    
  184.    set_adc_channel(1);
  185.    delay_us(6);
  186.    
  187.    ReadNtc2 = Read_ADC();
  188.  
  189.    set_adc_channel(2);
  190.    delay_us(6);
  191.    
  192.    ReadNtc3 = Read_ADC();
  193.  
  194.    Leesond=0;
  195.    
  196.  
  197.    set_timer3(250);
  198.    clear_interrupt(INT_TIMER3);
  199.    }
  200.  }
  201.  
  202. Void main()
  203.    {
  204.     SET_TRIS_a(0B00000111);
  205.     SET_TRIS_B(0B11100001);
  206.     SET_TRIS_C(0X00);
  207.     SET_TRIS_E(0X00);
  208.     SET_TRIS_D(0X00);
  209.    
  210.     output_d(0x00);
  211.     output_c(0x00);
  212.     output_b(0x00);
  213.     output_a(0x00);
  214.    
  215.     SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_128);
  216.     SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);
  217.     SETUP_TIMER_3(T3_INTERNAL|T1_DIV_BY_1);
  218.     SETUP_TIMER_2(T2_DIV_BY_16,250,16);
  219.     SETUP_ADC(ADC_CLOCK_DIV_64);
  220.     SETUP_ADC_PORTS(AN0_TO_AN2);
  221.    
  222.     EXT_INT_EDGE(L_TO_H);
  223.    
  224.     ENABLE_INTERRUPTS(INT_TIMER0);
  225.     ENABLE_INTERRUPTS(INT_TIMER1);
  226.     ENABLE_INTERRUPTS(INT_TIMER2);
  227.     ENABLE_INTERRUPTS(INT_TIMER3);
  228.     ENABLE_INTERRUPTS(INT_EXT);
  229.    
  230.  
  231.     lcd_init();
  232.    
  233.    
  234.     ds1307_init(DS1307_ALL_DISABLED);
  235.    
  236.     COMPRESOR = 0;
  237.     VENTEXT = 0;
  238.     VintOFF
  239.     V4 = 0;
  240.     OKStop = 0;
  241.    
  242.     MarchaMenu();
  243.  
  244.    }
  245.  
  246. Void MarchaMenu()
  247.    {
  248.    
  249.          while (ON==1)
  250.             {
  251.                switch (ModeSet)
  252.                   {
  253.                // case 0:  Swing=1; Autom();       Break;
  254.                   case 1:  Swing=1; Frio();        Break;
  255.                   case 2:  Swing=5; Calor();       Break;
  256.                   case 3:  Swing=2; Dry();         Break;
  257.                   case 4:  Swing=1; Vent();        Break;
  258.                   case 5:  TimeAdjust();           Break;
  259.                   default:                         Break;
  260.                   }
  261.      
  262.           }
  263.        
  264.  
  265.   }
  266.  
  267. Void Frio()
  268.    {
  269.    
  270.       short FrostProtect=0;
  271.      
  272.       lcd_gotoxy(1,1); lcd_putc("COOL");
  273.      
  274.       CompMinTimeOFF = MinCont;
  275.      
  276. //EN CASO DE CAMBIO DE MODO
  277.  
  278.    if (FlagCambio==1)                
  279.        {
  280.         COMPRESOR=0;
  281.         VENTEXT=0;
  282.         RetardoV4
  283.         V4=0;
  284.         RetardoOnCompresor;
  285.         FlagCambio=0;
  286.        }
  287.        
  288. //FUNCIONAMIENTO NORMAL
  289.  
  290.        V4=0;
  291.        VintON=1;
  292.        
  293. //SI LA TEMPERATURA DE LA HABITACION ES >=
  294. //QUE LA TEMPERATURA PREFIJADA + 1 GRADO ...
  295. //Y SE CUMPLEN LOS 3 MIN DE SEGURIDAD DE PARO DEL COMPRESOR...
  296.  
  297.     if (TempLimit >= (TempSet+Diferencial) && (MinCont >= (3 + CompMinTimeOFF)) )
  298.        {
  299.         COMPRESOR = 1;
  300.         VENTEXT = 1;
  301.        
  302.         if (FlagTimeCompOFF == 1)
  303.          {
  304.            MinCont=0;
  305.            CompMinTimeON = MinCont;
  306.            FlagTimeCompOFF = 0;
  307.            FlagTimeCompON = 1;
  308.          }
  309.        }
  310.  
  311. //SI LA TEMPERATURA DE LA HABITACION ES <=
  312. //QUE LA TEMPERATURA PREFIJADA - 1 GRADO
  313. //Y SE CUMPLEN LOS 5 MIN DE SEGURIDAD DE MARCHA DEL COMPRESOR...
  314.  
  315.  else if ((TempLimit <= (TempSet - Diferencial)) && (MinCont >= (5 + CompMinTimeON)))
  316.        {
  317.         COMPRESOR = 0;
  318.         delay_ms(15000);
  319.         VENTEXT = 0;
  320.         FlagTimeCompOFF=1;
  321.        
  322.         if (FlagTimeCompON == 1)
  323.          {
  324.            MinCont=0;
  325.            CompMinTimeOFF = MinCont;
  326.            FlagTimeCompON=0;
  327.          }
  328.        }
  329.        
  330.        
  331.  
  332. //PROTECCIÓN DE CONGELACIÓN DEL EVAPORADOR
  333.  
  334.     if (TempHeatExchanger < 0)
  335.        {
  336.        delay_ms(180000);
  337.        FrostProtect = 1;
  338.        
  339.      
  340.         COMPRESOR = 0;
  341.         delay_ms(15000);
  342.         VENTEXT = 0;
  343.         VintMid
  344.      
  345.        while (FrostProtect == 1)
  346.         {
  347.        
  348.         if (TempHeatExchanger > 10)
  349.         FrostProtect=0;
  350.         }
  351.        
  352.        }
  353.  
  354. //CONTROL DE LA VENTILACION
  355.    
  356.    
  357.     Vent();
  358.     SleepTime();
  359.     LeeCLOCK=1;        //AQUI LEVANTO LAS BANDERAS Y ENTRO
  360.     DisplayTime();       //EN LAS FUNCIONES DE LECTURA, DISPLAY DE HORA
  361.     LeeSOND=1;
  362.     LecturaSondas();
  363.     MovPaP=1;
  364.  }

No he incorporado Vent(); ni SleepTime(); ya que no son significativas.

Gracias

Saludos!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funciones simultáneas, multitarea?
« Respuesta #14 en: 21 de Diciembre de 2009, 16:35:08 »
Suky, que pena que no adivines...  :mrgreen: 
Si no es cierto! Los problemas que me hubiera evitado  :D

Así como está configurado el timer1 se interrumpe cada 104ms, es la idea? no creo  :? Además haces int t0=0; con lo cual al ingresar a la interrupción seteas a 0 esa variable, la incrementas y preguntas si es 10, cosa que nunca ocurrirá.

Después no es la forma correcta de trabajar con las banderas, sino de la siguiente manera:

Código: C
  1. while(1){
  2.     //.....
  3.     if(LeeCLOCK==0){
  4.          LeeCLOCK=1; // Asi se sabe cuando tengo que actualizar
  5.          // Si, entonces actualizo display.-
  6.     }
  7.     if(LeeSOND==0){
  8.          LeeSOND=1;  // Asi se sabe cuando tengo que actualizar
  9.          // Si, entonces hago lo que sea con los datos actualizados.-
  10.     }
  11.  
  12. }
No contesto mensajes privados, las consultas en el foro