Beenden einer ISR erkennen
Hallo,
folgendes Problem. Ich starte über eine Funktion eine ADC Messung mit einem externen ADC (parallele Anbindung). Dieser teilt mir das Ende seiner Wandlung über einen Interrupt mit. In dessen ISR kann ich nun die Daten mir einlesen.
Nun gut. Jetzt will ich aber, dass die gleiche Funktion, welche die Messung gestartet hat, den gemessen Wert zurückgibt. Jetzt stellt sich die Frage, wie weiß die Funktion, wann die ISR fertig ist (und der Wert somit eingelesen wurde)?
Code sieht ungefähr so aus:
Code:
unsigned short adc_read(void)
{
// externe ADC Messung starten
PORTD &= ~(1 << PD4);
PORTD |= (1 << PD4);
}
ISR(INT1_vect)
{
// CS auf low
PORTD &= ~(1 << PD5);
// RD auf low
PORTD &= ~(1 << PD6);
// Daten einlesen
value = (PINB & 0x0F);
value >>= 8;
value += PINC;
// RD wieder auf high
PORTD |= (1 << PD6);
// CS wieder auf high
PORTD |= (1 << PD5);
}
Wie mach ich das elegant? Oder ist das ein ganz falsches Herangehen. Mir fallen noch viele "dumme" Lösungen ein, die aber alles andere als elegant sind.
Grüße,
hacker
Re: Beenden einer ISR erkennen
Zitat:
Zitat von hacker
Nun gut. Jetzt will ich aber, dass die gleiche Funktion, welche die Messung gestartet hat, den gemessen Wert zurückgibt.
Wozu dann überhaupt der Interrupt? Warte dann doch einfach in der Funktion, bis der ADC fertig ist, und lese auch dort das Ergebnis aus.
Übrigens:
Meintest du hier nicht vielleicht eher: