-         

Ergebnis 1 bis 7 von 7

Thema: ISR wird nach enable INT2 ausgeführt, obwohl Pin auf high

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    30
    Beiträge
    270

    ISR wird nach enable INT2 ausgeführt, obwohl Pin auf high

    Anzeige

    Hallo Leute,

    ich hock hier seit inigen Stunden an einem Problem und komm nicht mehr weiter.
    Leider ist mein Programm schon äußerst umfangreich (Über 1000 Zeilen in Bascom). Desshalb hänge ich das Programm als anhang mal mit dran, falls sich jemand die Mühe machen möchte da mal drüber zu schaun.

    Mein Problem ist recht schnell beschrieben: Immer wenn ich in meinem Code den Befehl "Enable INT2" verwende, springt mein Programm in die ISR Routine.
    In der ISR wird der INT2 disabled. Dann werden Daten verarbeitet und der INT2 wieder Enabled und mit diesem Enable springt er wieder direkt in die ISR und so weiter....

    Problem ist: Der INT2 Pin ist die ganze Zeit auf glatten 5V
    Habe den INT2 als Falling configuriert.
    Aber dennoch: Die ISR wird beim enablen aufgerufen, trotz das der Pin auf High ist.

    Ich nutze einen Mega32. Die Frames sind wie folgt eingestellt:
    $hwstack = 128
    $swstack = 64
    $framesize = 80

    Hat irgendjemand vielleicht eine Idee was zu diesem, mir unerklärlichen, Verhalten führen kann?
    Angehängte Dateien Angehängte Dateien
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    30
    Beiträge
    270
    Hallo Leute,

    also mir ist jetzt noch eine Idee gekommen woher das eventuell kommen könnte:
    Ich habe mal gehört, das sich der AVR einen Interrupt "merkt" wenn er während der disable-Zeit kommt.
    Kann das sein?

    Weil bei mir ist es so, das der Interrupt unzählig oft kommt. Aber halt während er disabeld ist (desshalb disable ich ihn ja).
    Wenn er sich das irgendwie merkt, dann würde das erklären warum er mit der aktivierung in die ISR springt.

    Dann wäre aber meine Frage: Wie kann man das wieder raus löschen, wenn er sich das gemerkt hat?
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112

    Re: ISR wird nach enable INT2 ausgeführt, obwohl Pin auf hig

    Zitat Zitat von robodriver
    Problem ist: Der INT2 Pin ist die ganze Zeit auf glatten 5V
    Habe den INT2 als Falling configuriert.
    Aber dennoch: Die ISR wird beim enablen aufgerufen, trotz das der Pin auf High ist.
    Zitat Zitat von robodriver
    Weil bei mir ist es so, das der Interrupt unzählig oft kommt. Aber halt während er disabeld ist (desshalb disable ich ihn ja).
    Was stimmt denn nun?
    Bleibst du so lange in der INT2 ISR, bis keine impulse mehr kommen? Woher weißt du das?
    Die aufgelaufenen Interrupts kannst du über EIFR Register (zumindestens bei meinem Mega12 löschen. Unmittelbar vor dem Enable musst du das entsprechende Bit auf 1 setzen, dann sind die mittlerweile aufgelaufenen Interrupts für diesen Typ gelöscht. Schau mal unter INTF2 in deinem Manual.

    Gruß

    Rolf

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    30
    Beiträge
    270
    Okay, ist etwas unglücklich ausgedrückt.

    Sagen wir es mal so: An dem Interrupt hängt die Datenleitung eines anderen Moduls. Das Modul zieht diesen Pin zunächst auf Low, wenn es Daten hat. Dann kann ich die Daten vom Modul auslesen (mit einem weiteren Befehl) Und während die Daten kommen geht der INT dann mehrfach auf high und low. Logisch, sind ja Daten.
    So, wenn ich dann alle Daten ausgelesen habe, ist der Pin wieder auf high, ich aktiviere den INT wieder und der springt sofort wieder in die ISR.

    So ist es halt auch bein Einschalten des Moduls: Bei der initialisierung des Moduls wechselt der INT2 Pin mehrfach zwischen high und low. Wenn die Initialisierung durch ist, ist der Pin auf high.
    (hab da auch mal wait 4 rein geschrieben und mit dem Multimeter nachgemessen) und wenn dann der Befehle "Enable INT2" ausgeführt wird, springt er direkt in die ISR.

    Das meine ich damit, das der PIN die ganze Zeit auf high ist, wenn er in die ISR springt.

    Und das passiert halt echt immer. Mit dem Enabeln springt er immer gleich wieder zur ISR obwohl der pin auf 5V ist.

    Hab mal im Datenblatt nachgesehen ein External Interrupt Flag Register (EIFR) hat der Mega32 nicht.
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    30
    Beiträge
    270
    Ah, jetzt hab ich was gefunden:
    Das GIFR scheint das beim Mega32 zu sein.

    Hab jetzt mal das Bit5 im GIFR (INT2) vor dem enabeln gesetzt und dann wird die ISR nicht mehr aufgeführt beim enabeln.

    Und wenn ein Interrupt kommt, dann wird die ISR ausgeführt.
    Also alles genau so wie es sein soll

    Vielen Dank für deinen Hinweis.

    Ich verstehe zwar nicht so ganz warum dieses Bit nicht vom Compiler bei dem Befehl Enable automatisch gesetzt wird.

    Weil wenn ich einen INT disable, dann ja wohl aus gem Grund, weil ich ankommende INTs ignorieren möchte. Also ists doch sinnlos, wenn das dann beim enabeln ausgeführt wird.
    Oder hab ich da jetzt einen Denkfehler?
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    das mit dem automatischen INT-Flag löschen ist evtl. jetzt in Deinem Fall praktikabel, aber was ist, wenn das der INT von TWI, SPI oder UART ist, dann gehen Dir die Daten verloren wenn der INT einfach so verschluckt wird !

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    28.05.2007
    Ort
    Mannheim
    Alter
    30
    Beiträge
    270
    Naja, wenn man will das die Daten nicht verloren gehen, dann disabled man den Interrupt einfach nicht.

    Dann wird er ausgeführt wenn die ISR beendet ist.
    Wer aufhört besser zu werden, hat aufgehört gut zu sein

    Jeder I/O Port kennt drei Zustände: Input, Output, Kaputt

Berechtigungen

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