Go Down

Topic: Dudas librería TimerOne (Read 75 times) previous topic - next topic

njco

Buenas,

Es mi segunda o tercer consulta en el foro. Esta vez relevante al uso de los timers de un arduino nano usando la librería TimerOne. Realice la estructura de lo que quiero tener en el loop(). Sin embargo no tengo los resultados esperados. Es decir, el timer no funciona de la manera que tengo pensado.
Aclaro que leí y busque información sobre el uso de la librería. Pero siempre se encuentra el code sobre LedBlink con el timer. El mismo funciona, pero usando el mismo concepto y usándolo en mi programa me encuentro con un funcionamiento distinto.

Paso a comentarles que es lo que quiero hacer:
  • Tomar medidas de voltaje
  • Tomar medidas de corriente
  • Tomar decisión de control cuando tenga consumo excesivo de corriente
  • Temporizar la anterior decisión 10segundos; luego levantar dicha protección


Estoy monitoreando con arduino valores de voltaje DC y corriente DC de una placa. Lo único que me interesa proteger es el consumo de corriente excesivo, usando un relay e inhabilitando la carga. Nada complicado. Hasta que quiero temporizar esos 10 segundos.
Pienso temporizar esos 10 segundos para verificar si ese sobre-consumo sigue presente o no, para habilitar la salida o seguir en ese chequeo.

El Código:

Es breve y sencillo.

Cuerpo principal
Code: [Select]
#include <TimerOne.h>
   
 volatile int terminedecontar = 0; // Variable ficticia usada para disparar timer
 
 void programab ();
 void timerIsr();
 void timecounter ();

void setup()
{
  Serial.begin(4800);
  Serial.println("INICIO PROGRAMA");
  Serial.println();
}

 
void loop()
{
  Serial.println("Mido Voltaje");
  Serial.println("Mido Corriente");
  programab();
  Serial.println("Imprimo en LCD");
 
  if (terminedecontar == 0){
   timecounter ();
   terminedecontar = 1;
   }
}



Programab
Code: [Select]
void programab (){
 
  Serial.println("Llamada programa 2");
 
}


Timecounter
Code: [Select]
void timecounter (){ 
 
  Serial.println("EMPIEZO A CONTAR");
  Timer1.initialize(10000000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
  Timer1.attachInterrupt( timerIsr ); // attach the service routine here
 
 }


Timer ISR
Code: [Select]
void timerIsr()
{
    Timer1.restart();
    Serial.println();
    Serial.println("INTERRUPCION 10 SEGUNDOS");
    Serial.println();
    terminedecontar = 0; 
   
}
   

Creo que se entiende como hago el trigger y luego trato de limpiar la variable "volatile int terminedecontar".

Si alguno puede señalarme donde tengo mi error en el programa o indicando realmente si está bien el uso de la librería.

Saludos. Desde ya muchas gracias.


surbyte

Tu problema esta en no haber leído lo suficiente (como en general nos pasa a todos). Creemos que las cosas no tienen límites pero si los tienen.
Tu librería esta debidamente indicada en el Playground Timer1 porque depende de este timer.

Cuando lees el timer dice para las dos instrucciones mas comunes

Quote
initialize(period)
You must call this method first to use any of the other methods. You can optionally specify the timer's period here (in microseconds), by default it is set at 1 second. Note that this breaks analogWrite() for digital pins 9 and 10 on Arduino.

setPeriod(period)
Sets the period in microseconds. The minimum period or highest frequency this library supports is 1 microsecond or 1 MHz. The maximum period is 8388480 microseconds or about 8.3 seconds. Note that setting the period will change the attached interrupt and both pwm outputs' frequencies and duty cycles simultaneously.
El máximo período es de 8.3 segundos de modo que tus 10 segundos no son posibles.
configúralo en 1 segundo y cuenta 10 veces, o las variantes que gustes.

Go Up