Wozu dann überhaupt der Interrupt? Warte dann doch einfach in der Funktion, bis der ADC fertig ist, und lese auch dort das Ergebnis aus.Zitat von hacker
Übrigens:
Meintest du hier nicht vielleicht eher:Code:value >>= 8;
Code:value <<= 8;
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:
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.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); }
Grüße,
hacker
Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!
Wozu dann überhaupt der Interrupt? Warte dann doch einfach in der Funktion, bis der ADC fertig ist, und lese auch dort das Ergebnis aus.Zitat von hacker
Übrigens:
Meintest du hier nicht vielleicht eher:Code:value >>= 8;
Code:value <<= 8;
MfG
Stefan
Dann müsste ich aber innerhalb der Funktion die Leitung pollen. Ich dachte mit Interrupt wäre das eleganter.
Das Shiften muss natürlich in die andere Richtung. Da hast du Recht.
/Edit
Ich sehe gerade, das der Impuls, den der ADC aussendet nur ca. 50ns lang ist. Da ist die Gefahr beim Pollen doch recht groß, den nicht mit zu kriegen. Zumal noch jede Menge andere Interrupts eintreten können.
Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!
Sorry, aber ich kann das nicht ganz nachvollziehen. Warum ist das Pollen auf "Interrupt ist fertig" eleganter, als das Pollen auf "Pin hat bestimmten Level"?Zitat von hacker
MfG
Stefan
Das stimmt. Aber vielleicht gibt es noch eine andere Lösung als auf das Ende des Interrupts zu pollen?
Und wie ich grad ergänzt habe oben, ist pollen auf einen 50ns Impuls mir bisschen zu riskant.
Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!
Aber ich dachte, das ist genau das, was du wolltest, auf das Ende des Interrupts zu warten? Statt zu Pollen (auf ein volatile Flag in dem Fall), gäbe es höchstens noch die Möglichkeit, den Controller schlafen zu legen.Zitat von hacker
MfG
Stefan
Hallo
Wenn der ADC fertig ist, wird doch ein entsprechendes Flag gesetzt.
Dieses brauchst Du also nur auszuwerten.
Mit freundlichen Grüßen
Benno
Wo man nicht mit Vernunft handelt, da ist auch Eifer nichts nütze; und wer hastig läuft, der tritt fehl.
Ein König richtet das Land auf durchs Recht; wer aber viel Steuern erhebt, richtet es zugrunde
Da es ein externer ADC ist, muss er sich das entsprechende Flag selber basteln. Dazu steht schon was in sternst letztem Post.
Ob du nun in der ISR nur das Flag setzt, oder auch gleich den Wert holst, hängt davon ab, ob du mit dem Interrupt auch noch andere Dinge machen willst. Um's Pollen kommst du dann aber nicht herum. Außer du verwendest eine Callback-Funktion ;o)
sast
雅思特史特芬
开发及研究
Hallo
..habe ich doch glatt überlesen.Da es ein externer ADC is
Mit freundlichen Grüßen
Benno
Wo man nicht mit Vernunft handelt, da ist auch Eifer nichts nütze; und wer hastig läuft, der tritt fehl.
Ein König richtet das Land auf durchs Recht; wer aber viel Steuern erhebt, richtet es zugrunde
okay mein vorschlag dazu wäre ... eine volatile variable anlegen
diese auf 0 setzen, ext int AUS
strobe für ADC start machen
ext int AN
in der main schleife machst du was du so machst PLUS einmal pro durchluaf die variable kontrollieren
jetzt kommt der strobe vom DAC, deine ISR löst aus ... in der ISR machst den ext int AUS und setzte die variable auf 1
kommt deine main schleife an der variablenabfrage vorbei, startest du den lesevorgang, setzt die variable wieder auf 0 und startest gegebenenfalls wieder die wandlung mit : strobe-> interrupt ein und setzt dein programm fort ...
eventuell soltle man das einschalten des interrupts VOR den strobe setzen, weis ja ncih wie lang eine wandlung bei dir dauert
Lesezeichen