Problema en ejercicio con libreria Protothreads (concurrent programming)

/*Saludos, estoy ensayando la ejecución multitarea con la libreria Protothreads, estoy realizando tres tareas.

  1. Leer la señal analogica de un fotoresistor y verka el monitor de puerto serial.
  2. Leer un pulsador y apagar el LED del puerto de salida 13 cuando lo presiono.
  3. Encender tres LEDs conectados a pines de salida de forma intermitente.
    Mi problema es que cuando ejecuto la tarea 1 y 3 todo funciona bien, pero cuando ejecuto con la tarea 3, solo funciona ella, la 1 y 3 deja de funcionar. Les pregunto. Que puede estar pasando? Es un problema de la libreria? o estoy manejando interrupciones de programa sin saber?. Gracias! */
/*Este ejercicio tiene como objetivo realizar tres tareas en Arduino, Tarea 1 es leer la señal analogica de un fotoresistor |
  Tarea 2 leer la pulsacion de un switch y apagar el LED de placa de Arduino | Tarea 3 activar tres LED que hagan parpadeo */



#include <pt.h> //suma la biblioteca Protothreads
struct pt hilo1; //indica que un proceso llamado hilo1 se procese de forma paralela
struct pt hilo2; //indica que un proceso llamado hilo4 se procese de forma paralela
struct pt hilo3; //indica que un proceso llamado hilo4 se procese de forma paralela


long value;


void setup()
{
  PT_INIT(&hilo1); //PT_INIT es un macro para inicializar hilo1, al compilar el preprocesador arduino, toma los codigos necesarios de la biblioteca pt.h
  //& es un puntero que indica el lugar donde esta guardado el valor de la estructura hilo1
  PT_INIT(&hilo2);
  PT_INIT(&hilo3);

  Serial.begin(9600);          //  setup serial
}
void loop() {
  tarea1(&hilo1);
  tarea2(&hilo2);
  tarea3(&hilo3);
}
//Tarea 1

void tarea1(struct pt *pt) {
  PT_BEGIN(pt); //inicio
  static long t = 0;

  do {
    t = millis();
    PT_WAIT_WHILE(pt, (millis() - t) < 250); //Protothreads espera mientras la condicion no sea cierta
    ADMUX |= B11000000; //canal ADC0
    ADCSRA |= B11000111;
    while (bit_is_set(ADCSRA, ADSC));
    value = ADCL | (ADCH << 8);
    Serial.println(value);
    //delay(1000); //es un funcion que en esta multitarea no se debe usar porque pone en pausa todo el procesador mientras espera el conteo, entonces se
    //reemplaza por otra estructura como por ejemplo un acumulador de tiempo
  } while (true);
  PT_END(pt); //fin de ejecucion

}
//Tarea 2
void tarea2(struct pt *pt) {
  PT_BEGIN(pt); //inicio
pinMode(8,INPUT);
pinMode(13, OUTPUT);
do{
digitalWrite(13, digitalRead(8));
  } while (true);
  PT_END(pt); //fin de ejecucion

}
//Tearea 3

void tarea3(struct pt *pt) {
  PT_BEGIN(pt); //inicio
  static long z = 0;
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  do {
    z = millis();
    PT_WAIT_WHILE(pt, (millis() - z) < 900); //el tiempo de este primer wait debe ser inferior al segundo, esto porque si no hay conflicto con los LED
    digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);


    PT_WAIT_WHILE(pt, (millis() - z) < 1000);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);

  } while (true);
  PT_END(pt); //fin de ejecucion

}

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


https://roboticsbackend.com/arduino-protothreads-tutorial/

No me convence esta librería. Generas un struct por cada "tarea" Es un godzilla come memoria.
Para eso genero flags con los timers y listo.
Estás rizando el rizo para algo tan simple cómo tres pulsadores.

1 Like

Saludos Cuantron, gracias por la sugerencia, voy a investigar lo que dices sobre los flags con los timers.

Todo lo que debes hacer con una máquina de estados, millis() puedes hacerlo sin problemas.
En documentación hallarás como usarlos.

1 Like