volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;
int Sensor = A0; // Declaramos la variable del potenciómetro pin 7 attiny13
int MOSFET = 11; // Declaramos la variable del led pin6
int datoSensor = 0; // Variable para el valor del sensor
int suma=0;
float freq =1 ;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// here on rising edge
void isr ()
{
unsigned int counter = TCNT1; // quickly save it // guardalo rapidamente
// wait until we noticed last one
if (triggered) // si es true sale de la funcion - si es false sigue
return;
if (first)// si es true toma la lectura actual y lo pone a falso para que no vuelva a entrar y sale de la funcion / si es false sigue
{
startTime = (overflowCount << 16) + counter; //guarda el primer valor
first = false;
return;
}
finishTime = (overflowCount << 16) + counter; // guarda el ultimo valor
triggered = true; // lo pone a true para garantizar que (triguered)no vuelva a entrar a la interrupcion y que entre al loop
detachInterrupt(0); //detiene las interrupciones
} // end of isr
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// timer overflows (every 65536 counts)
ISR (TIMER1_OVF_vect)
{
overflowCount++; //cada que TIMER1 llegue a 65535 overflowCount++ aumenta 1
} // end of TIMER1_OVF_vect
void prepareForInterrupts ()
{
// get ready for next time // prepárate para la próxima vez
EIFR = _BV (INTF0); // clear flag for interrupt 0
first = true; // habilita la primera lectura
triggered = false; // re-arm for next time //permite que entre a la interrupcion
attachInterrupt(0, isr, FALLING); // habilita la interrupcion - de 0 a 1
} // end of prepareForInterrupts
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void setup () {
Serial.begin(115200);
Serial.println("Frequency Counter");
pinMode(MOSFET, OUTPUT); // Asigna el pin del led como salida
// reset Timer 1
TCCR1A = 0;
TCCR1B = 0; // timer1 sin preescaler 0 - 65536
// Timer 1 - interrupt on overflow
TIMSK1 = _BV (TOIE1); // enable Timer1 Interrupt // habilita interrupcion
// zero it
TCNT1 = 0;
// start Timer 1
TCCR1B = _BV (CS10); // coloca a 1 CS10
// set up for interrupts
prepareForInterrupts ();
} // end of setup
void loop ()
{
//start impulsar motor
if (datoSensor<=1)//
{
datoSensor=12;
Serial.print ("datoSensor in");
Serial.println (datoSensor);
analogWrite(MOSFET, datoSensor);
delay(500);
}
if (!triggered) // no pasa hasta que no sea true, y sigue preguntando hasta que haga la segunda lectura
return;
unsigned long elapsedTime = finishTime - startTime;
float freq = 1.0 / ((float (elapsedTime) * 62.5e-9)); // each tick is 62.5 nS
datoSensor = analogRead(Sensor); //Leemos el dato del sensor y lo guardamos en la variable
datoSensor=map(datoSensor,0,1023,15,70);
analogWrite(MOSFET, datoSensor); //Valor analogico para la salida
delay(10); //Detenemos el programa 25 milisegundos
if (dato sensor <=18&& freq<20)
{
datosensor++;
}
analogWrite(MOSFET, datoSensor); //Valor analogico para la salida
Serial.print ("Took: "); //tics
Serial.print (elapsedTime); // tiempor transcurrido: finishTime - startTime;
Serial.print (" counts. ");
Serial.print ("Frequency: ");
Serial.print (freq);
Serial.println (" Hz. ");
// so we can read it //para que podamos leerlo
// Serial.print ("datoSensor");
//Serial.println (datoSensor);
delay (100);
prepareForInterrupts (); //prepararse para las interrupciones
} // end of loop