Paso 17: El núcleo del bosquejo de la escritura
Como vimos antes, que quería una adquisición continua y escribí el ADC interrumpir el servicio de rutina para almacenar en el búfer circular los datos continuamente. Se detiene cuando alcanza el índice que es igual a stopIndex. El búfer se implementa como circular empleando el modulo operador.
//-----------------------------------------------------------------------------
Interrumpir la conversión ADC completa
//-----------------------------------------------------------------------------
ISR(ADC_vect)
{
Cuando es leído ADCL, el registro de datos del ADC no se actualiza hasta ADCH
es de lectura. En consecuencia, si el resultado quedo ajustado y no más
que se requiere de precisión de 8 bits, es suficiente leer ADCH.
De lo contrario, ADCL debe leerse primero, luego ADCH.
ADCBuffer [ADCCounter] = ADCH;
ADCCounter = (ADCCounter + 1) % ADCBUFFERSIZE;
Si (esperar)
{
Si (stopIndex == ADCCounter)
{
Congelar la situación
Desactivar la ADC y detener el modo de conversión de marcha libre
CBI (ADCSRA, ADEN);
helada = true;
}
}
}
El analógico comparador interrumpir servicio de rutina (que se llama cuando una señal pasa el umbral) deshabilita a sí mismo y le dice a la ISR de ADC para iniciar la fase de espera y establece la stopIndex.
//-----------------------------------------------------------------------------
Interrupción de comparador analógico
//-----------------------------------------------------------------------------
ISR(ANALOG_COMP_vect)
{
Desactivar la interrupción del comparador analógico
CBI (ACSR, ACIE);Encender errorPin
digitalWrite (errorPin, HIGH);
OSE (PORTB, PORTB5);esperar = true;
stopIndex = (ADCCounter + waitDuration) % ADCBUFFERSIZE;
}
Esto fue muy fácil después de toda esa tierra!