Stap 4: Instellen van de Interrupt voor de hardware geactiveerd versie
Deze methode is zeer vergelijkbaar met de versie van de software.
Triggering wordt anders behandeld.
Digital Port twee moet verbonden zijn met analoge ingang 1, hiervoor voor werkzaamheden.
In wezen als geen triggering is geselecteerd, de adc-interrupt is ingeschakeld en de gegevens direct vastgelegd. Als triggering is geselecteerd een interrupt op digitale poort 2 wordt gebruikt om de interrupt op de adc poort 1.
Digitale poort 2 kan worden geconfigureerd om te lezen van analoge signalen en genereert een interrupt op stijgt of daalt gegevens randen. Het is erg snel.
Mijn interrupt routine heet gotinterrupt en als ik ben met behulp van digitale poort 2 de interrupt-id is 0.
Const byte ExtInterrupt = 2;
pinMode(ExtInterrupt,INPUT);
attachInterrupt (0, gotinterrupt, stijgt);
attachInterrupt (0, gotinterrupt, vallen);
.
De vlag geactiveerd besturingselementen of de digitale poort 2 interrupt de analoge poort 1-interrupt begint. Wanneer geactiveerd is ingesteld op false de interrupt begint de adc-interrupt wanneer het detecteert een rand in de analoge ingang.
.
hetzelfde als de software onderbreken code tot hier...
SBI(ADCSRA,ADEN); inschakelen van ADC
dan...
Als (trigger == 0) {}
SBI(ADCSRA,ADSC); metingen van de ADC start op onderbreken
StartTime=Micros();
} else {}
pw2 onderbreken om te beginnen met adc interrupt toestaan
geactiveerd = false;
}
Sei(); inschakelen interrupts
.
De Interrupt-code
1) de poort 2-interrupt wordt onderhouden door gotinterrupt
Deze interrupt wordt geactiveerd door een positieve of negatieve rand op poort 2.
Het doet niets totdat is ingesteld op false.
ongeldig gotinterrupt() {}
Als (! geactiveerd) {}
geactiveerd = true;
SBI(ADCSRA,ADSC); metingen van de ADC start op onderbreken
StartTime=Micros(); record starttime voor interval berekening
}
}
2) de adc onderbreken wordt onderhouden door ISR(ADC_vect)
Variabele bufcount slaat de positie in de buffer, waarvan de grootte BUF_SIZE is (= 1000)
Gegevens worden opgeslagen in locaties bufa(0) te bufa(999)
Wanneer de buffer vol is vlag writeit true is ingesteld en de adc is uitgeschakeld. (cbi(ADCSRA,ADEN);)
.
ADC Interrupt routine
Dit is de sleutel tot het programma!!
ISR(ADC_vect) {}
bufa [bufcount] = ADCH;
bufcount ++; Increment buffer teller
Als (bufcount == BUF_SIZE) {}
CBI(ADCSRA,ADEN); uitschakelen van ADC
EndTime=Micros(); record eindtijd voor het interval berekening
writeit = true; vlag dat een schrijven nodig is
}
}