-         

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

Thema: verursachen 2 Interrupts probleme?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2004
    Beiträge
    206

    verursachen 2 Interrupts probleme?

    Anzeige

    hallo.

    ich hab eine anwendung, in der ich bei einem ATmega32 int0 und int1 verwende.
    wenn int0 ausgelöst wird, bleibt er in der schleife hängen, und macht bis zum auslösen von int1 nichts.
    wenn ich int1 auslöse, spricht die anwendung an (nur ein mal sehr kurz) und dann nicht mehr, obwohl der interrupt noch gegeben wäre.

    sind int1 und int0 unterschiedliche interrupts? und stören sich die gegenseitig?
    kann das sein?
    hab jetzt schon absolut alles ausprobiert, und es wird einfach nicht besser. immer der selbe effekt.
    einzeln getestet geht das ganze. ich kann sie auslösen, dann druchläuft das ganze die ISR, und geht zurück ins programm.
    zusammen wird auf gut deutsch nur scheiß draus.
    an was kanns liegen, jemand eine idee??

    danke schon mal im vorraus.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    29
    Beiträge
    1.614
    interrupts machen folgendes:

    wenn ein INT0 z.b. angesprochen wird also von außen her als pin, dann wird im controller auf eine bestimmte adresse verwiesen, ich glaub 0004 iss das bei int0, in dieser adresszeile im codespeicher steht dann ein goto line sowieso (der sprung in die ISR) und da springter dann hin, und führt die entsprechenden befehle nacheinander aus, danach geht er zurück ins hauptprogramm, oder dahin, wo er unterbrochen wurde.

    beim int1 isses genauso, nur dass der z.b. 0008 belegt (die adressen dazwischen werden von anderen interrupts belegt) und dann eben das ausführt was im goto dieser zeile steht und zurückspringt.

    wenn du also nen interrupt hast und er springt in die ISR, dann springter danach wieder raus, auch wenn der interrupt noch anliegt, das müsstest du dann in einer schleife überprüfen, ob der noch anliegt oder nicht.

    wenn du dafür ne endlosschleife in die ISR legst, dann bleibter dadrin auf jeden fall hängen, weiler dann niemals ins hauptprogramm zurückkehrt

    ich hoff das hat geholfen ^^

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Diesei Interrupts arbeiten unabhängig voneinander.

    Das Problem liegt ziemlich wahrscheinlich in deiner Software. Daß die Routinen einzeln funktionieren heisst ja nicht, daß sie korrekt sind!

    -- Dürfen die IRQs kaskadieren (rekursive IRQs)? Das kann Probleme machen
    -- Sind die IRQs flankengetriggert? Pulsgetriggert ist hier nicht angesagt!!!
    -- Sind die ISRs frei von Warteschleifen, etc?
    -- Sind Zugriffe auf Objekte, die in den ISRs verändert werden, atomar? Falls nicht, bekommst du sporadisch unsinnige Daten.
    -- STellst du alle GPRs und das SREG wieder her (falls du Asm proggst)?
    Disclaimer: none. Sue me.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2004
    Beiträge
    206
    also, in der ISR wird nur einmal eine anweisung durchlaufen. und ich hab die irq´s "falling", weil da eben am pin high ist, und wenn der irq kommt, fällt es ab auf low. denk, das sollte passen.

    was anderes, wie geht das mit dem kaskadieren?
    im übrigen verwende ich Bascom-AVR zum proggen.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    Das ist ganz schlechter Code in ner ISR hängen bleiben.
    Man durchläuft eine ISR, setzt ein Flag und geht raus bis zum nächsten
    Event. Der AVR kennt keine Prioritäten bei Int.

    AVR denkt: "Int ist ausgelöst, OK, dann mach ich jetzt das und nur dieses,
    der Restliche Code interessiert mich nicht mehr, bis ich mit dem hier fertig
    binn. Danach schau ich mal was sonst noch so anliegt, aber jetzt nur das hier"
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2004
    Beiträge
    206
    würds was bringen, wenn ich den interrupt disable?


    was heißt, bleibt hängen. er springt nicht zurück.
    er macht schon da, was er soll, nur hört er nicht mehr damit auf.
    er bleibt einfach stehen. sozusagen eingefrohren.
    und der andere, macht was er soll, und geht sofort raus. auch wenn die interruptbedingug immer noch erfüllt wird.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Vielleicht solltest du einfach mal die fehlerhafte ISR hier posten, dann braucht man auch keine Kristallkugel um den Fehler zu finden
    So viele Treppen und so wenig Zeit!

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2004
    Beiträge
    206
    da is nix falsch.
    ich setzt da einfach einzelne pins auf 1 oder 0.
    dann ist schon return angesagt.
    aber werd ich machen, wenn ich zuhause bin.
    gibts da eine bestimmte größe, die die ISR haben darf?

    hatte auch schon goto und gosub drin. immer das geleiche ergebnis.

    liegt es evtl. an soft/hw-stacks?
    hab die schon vergrößtert und verkleinert.

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Also Sprünge in andere Programmteile sind in einer ISR absolut tabu, denn man weiss ja nicht ob der Compiler schlau genug ist sowas korrekt zu erkennen. (Ich bezweifle es mal, und vermute daß der Programmteil in den man per goto springt noch zur ISR gezählt wird)

    Funktionsaufrufe sind noch akzeptabel, aber man sollte sich da wirklich auf ganz kurze einfache Funktionen beschränken. (denn jede innerhalb einer ISR aufgerufene Funktion wird nunmal vollständig innerhalb der ISR ausgeführt und führt zu entsprechenden Verzögerungen)

    einen konkreten Wert für die maximal zulässige ISR-Länge gibt es nicht. Wenn man nur einen Interrupt verwendet muss sie jedenfalls kurz genug sein daß sie auf jeden Fall fertig ist bevor der Interrupt erneut ausgelöst werden kann. Bei mehreren Interrupts gilt einfach nur: so kurz wie möglich.
    So viele Treppen und so wenig Zeit!

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2004
    Beiträge
    206
    was ist kurz? ich mein, wieviele zeilen?

    ich hätte da 6-8 zeilen, in denen er einzelne pins auf 0/1 setzen soll.
    meinst du, das ist ok?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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