Matthias M. schrieb:
> Mein CPU läuft mit 8 MHz, sprich in der Main wird ADC_Read mit CPU Takt
> aufgerufen was viel zu viel ist.
Was heisst das: 'viel zu viel'
> Nun bin ich bei meinen Recherchen auf
> die ISR(ADC_vect) gestoßen.
>
> Kann ich statt in der Main auch einfach folgendes schreiben?
Können tust du schon. Sinnlos ist es auch.
>
>
1 | > ISR(ADV_vect) {
|
2 | > adcval = ADC_Read(0); // Kanal 0
|
3 | > }
|
4 | >
|
Nö.
Wenn die ISR aufgerufen wird, dann liegt ein ADC Ergebnis vor. Das
WISSEN wir, sonst wäre die ISR ja nicht aufgerufen worden.
Ergo
1 | ISR(ADV_vect) {
|
2 | adcval = ADC;
|
3 | }
|
fertig.
Jetzt musst du nur noch an strategisch günstigen Positionen den
ADC-Wandler anstossen, eine Wandlung vorzunehmen. Ist er damit fertig,
dann wird die ISR aufgerufen.
Aber im Ernst: Ist das wirlich ein großes Problem, dass die
Hauptschleife ein paar Takte verbrutzelt, weil sie aktiv auf den ADC
wartet? Immerhin hat das den Charme, dass du von jedem Ergebnis in der
Hauptschleife auch den Zeitpunkt weißt, wann es während eines Durchgangs
durch die Hauptschleife entstanden ist. Und wenn einem die Wartezeit
dann wirklich stört, dann kann man das ganze auch so umformen, dass die
Wandlung läuft, während der µC in der Hauptschleife gerade was anderes
macht. Nach dem Muster
1 | ...
|
2 |
|
3 | while( 1 )
|
4 | {
|
5 | ADC Ergebnis holen
|
6 | nächste Wandlung starten
|
7 |
|
8 | Ergebnis bearbeiten
|
9 | }
|
Die Wandlungt läuft, während das letzte Eregbnis bearbeitet wird. Geht
die Hauptschleife in den nächsten Durchgang, dann ist der ADC (meistens)
längst mit der Arbeit fertig. Man holt sich das Ergebnis ab und startet
gleich die nächste Wandlung. Während die läuft, bearbeitet man das
zuletzt geholte Ergebnis. usw. usw.