Stap 17: Schrijven van de kernel van de schets
Zoals we eerder zagen, ik wilde een ononderbroken verwerving en ik schreef het ADC Interrupt Service Routine om op te slaan in de circulaire buffer de gegevens continu. Het stopt wanneer het bereikt de index die gelijk is aan stopIndex. De buffer is geïmplementeerd als circulaire dienst de modulo operator.
//-----------------------------------------------------------------------------
ADC-conversie volledig onderbreken
//-----------------------------------------------------------------------------
ISR(ADC_vect)
{
Bij het lezen van ADCL, wordt het registreren van de gegevens van de ADC niet bijgewerkt tot ADCH
wordt gelezen. Bijgevolg, als het resultaat wordt gelaten aangepast en niet meer
dan 8-bits precisie vereist is, volstaat het om te lezen ADCH.
Anders moet ADCL worden gelezen eerst, dan ADCH.
ADCBuffer [ADCCounter] = ADCH;
ADCCounter = (ADCCounter + 1) % ADCBUFFERSIZE;
Als (wachten)
{
Als (stopIndex == ADCCounter)
{
Bevriezen van de situatie
Uitschakelen van ADC en stoppen gratis uitgevoerd conversiemodus
CBI (ADCSRA, ADEN);
bevriezen = true;
}
}
}
De Analoge Comparator Interrupt Service Routine (die wordt aangeroepen wanneer een signaal wordt ontvangen de drempel) schakelt zichzelf en vertelt de ADC ISR voor de startfase van de wachten en wordt de stopIndex ingesteld.
//-----------------------------------------------------------------------------
Analoge Comparator interrupt
//-----------------------------------------------------------------------------
ISR(ANALOG_COMP_vect)
{
Uitschakelen van de Analoge Comparator interrupt
CBI (ACSR, ACIE);ErrorPin inschakelen
digitalWrite (errorPin, hoge);
SBI (PORTB, PORTB5);wachten = true;
stopIndex = (ADCCounter + waitDuration) % ADCBUFFERSIZE;
}
Dit was heel gemakkelijk na alle dat aarding!