-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Beenden einer ISR erkennen

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    28
    Beiträge
    967

    Beenden einer ISR erkennen

    Anzeige

    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
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672

    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:
    Code:
    value >>= 8;
    Meintest du hier nicht vielleicht eher:
    Code:
    value <<= 8;
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    28
    Beiträge
    967
    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!

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von hacker
    Dann müsste ich aber innerhalb der Funktion die Leitung pollen. Ich dachte mit Interrupt wäre das eleganter.
    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"?
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    28
    Beiträge
    967
    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!

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von hacker
    Aber vielleicht gibt es noch eine andere Lösung als auf das Ende des Interrupts zu pollen?
    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.
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    06.11.2006
    Beiträge
    1.078
    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

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    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

    雅思特史特芬
    开发及研究

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    06.11.2006
    Beiträge
    1.078
    Hallo
    Da es ein externer ADC is
    ..habe ich doch glatt überlesen.

    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

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •