-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Interrupt geht vergessen?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143

    Interrupt geht vergessen?

    Anzeige

    Hallo Zusammen!

    Ich habe ein kleines Projekt, es geht um einen Motortreiber, der 2 Motoren steuert mit einem Atmega88.

    Für die Positionierung benütze ich Hallsensoren, die an den Motoren angebracht sind.
    Ein Hall implus kommt ca. alle 6ms (von jedem Motor), und zwei zähler zähen die Impulse von der ISR aus mit.
    Nun ist die Positioniergenauigkeit sehr ungenau, nach einigen 180Grad bewegungen hält der Motor nicht mehr dort an wo er gestartet ist.
    Das kann eigentlich nur passieren wenn er einen oder mehrere Hallsignale verpasst.
    Die Hallsignale sehen sehr gut aus, die Flanken sind stark. Der Atmega ist konfiguriert auf die Fallende Flanke zu achten.

    Der Atmega88 läuft auf 20.00 MHZ

    nun die Frage:
    gibt es im Atmega88 einen Interrupt speicher? oder gehen die Interrupts verloren für die es keine Zeit gibt?

    Kann ich den verschiedenen Interrupts ein Gewicht oder eine Dringlichkeit zuweisen? Ich benutze int0, int1 und alle 3 HW timer, die intern auch ISR aufrufen, wobei die internen Timer nicht sooo wichtig sind.

    Vielen Dank für eure Hilfe!!

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    33
    Beiträge
    165
    normalerweise gehen die Interrupts nicht verloren, zumindest wenn nur ein einziger kommt waehrrend du in ner ISR bist, wenn du da drin natuerlich unnoetig Zeit vertroedelst dann koennen auch mal 2 Interrupts auftreten und dann wird nur auf einen getriggert.

    Ich hoffe also das deine ISRs moeglichst kurz sind.
    (Extrembeispiel: In der ISR Sachen per UART oder ans LCD ausgeben).
    In die IRSs sollte nur das kommen was wirklich notwendig ist, Ausgaben bspw. kann man ueber Flags regeln. Also im Interrupt Flag aktivieren, im normalen Code dann Flag auslesen und reagieren.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143
    hmm, die interrupts sind für die Regelung von 2 Motoren. Die ISR werden bei Fallenden Flanken der Hallsensoren (jeweils Hall1) der Motoren ausgelöst.
    In den ISR wird legedlich in einer IF schlaufe ein PIN des Controllers abgefragt (ein zweites Hallsignal, für die Richtungserkennung).
    in der IF wird dan entschieden ob der Winkel (int) increment oder decrementiert wird.

    Wenn sich der Atmega nun in einer ISR befindet und ein zweiter Interrupt kommt?
    Ich betreibe den Atmega mit 20MHZ mit einem externen Quarz (darf man dass? im datasheet ist diese Gescheindigkeit glaube ich nur für ext. Taktgeneratoren an OSC1..??) die Motoren drehen max. 10'000 U/min und haben jeweils 3 Hallsensooren..

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    In den ISR wird legedlich in einer IF schlaufe ein PIN des Controllers abgefragt (ein zweites Hallsignal, für die Richtungserkennung).
    in der IF wird dan entschieden ob der Winkel (int) increment oder decrementiert wird.
    Würd ich so nicht machen.
    Setz ein Flag in der Interruptroutine und frag im Hauptprogramm den zweiten Hallsensor (PIN) ab und entscheide dann die Richtung.

    Wenn sich der Atmega nun in einer ISR befindet und ein zweiter Interrupt kommt?
    ...Dann wird dieses zweite Interrupt Flag gesetzt. Die dazugehörige Routine wird aber erst nach Beendigung der laufenden Interruptroutine eingeleitet.
    Treten in dieser Zeit mehrere Interrupts auf werden diese nach der Reihenfolge der Interruptvektortabelle abgearbeitet.
    Alternativ kannst Du auch die Interruptabarbeitung mit "SEI" am Anfang einer Interruptroutine freigeben, das ist allerdings nicht ohne Fallstricke und sollte nur in absoluten Ausnahmefällen eingesetzt werden.
    Ich hab das bis jetzt nur ein einziges mal bei der Abarbeitung einer 1wire Schnittstelle mit Drehzahlmesser gemacht.
    Die Interruptroutinen sollten auf jeden Fall sehr schnell abgearbeitet werden können und keinesfalls sollte auf irgendwelche Portpins gewartet werden müssen (die vielleicht nie den geforderten Zustand annehmen).

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.01.2005
    Ort
    Tokyo
    Alter
    59
    Beiträge
    242
    Hallo,
    Wenn der Hallsensor normale Inkrementalgebersignale liefert, dann guck mal hier:
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=33628
    Da habe ich mal ein Codebeispiel für die Auswertung eines Impulsgebers mittels IRQ hineingestellt. Der IRQ dauert hier < 20uS.
    Niemals in einem IRQ auf irgend etwas warten!!
    Ports abfragen, kurze Berechnung mit PortAlt für Richtung, PortNeu in PortAlt speichern und dann nichts wie raus.

    Gruß
    pctoaster

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    33
    Beiträge
    165
    Zitat Zitat von wkrug
    ...Dann wird dieses zweite Interrupt Flag gesetzt. Die dazugehörige Routine wird aber erst nach Beendigung der laufenden Interruptroutine eingeleitet.
    wann wird eigentlich das Interrupt Flag fuer die aktuell zu bearbeitende ISR geloescht? Beim Betreten der ISR oder erst beim Verlassen?

    Treten in dieser Zeit mehrere Interrupts auf werden diese nach der Reihenfolge der Interruptvektortabelle abgearbeitet.
    mehrere verschiedene sollte man hier wohl noch einmal betonen. Wenn man in einer ISR ist und dabei 10mal INT0 kommt, bekommt man nur einen davon mit.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.01.2005
    Ort
    Tokyo
    Alter
    59
    Beiträge
    242
    Bereits beim Auslösen eines IRQ wird das Global Interrupt Enable Flag gelöscht und beim RTI wieder zurückgesetzt. Zumindest ist das beim AVR so.

    Gruß
    pctoaster

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    33
    Beiträge
    165
    das meinte ich nicht, ich meinte die einzelnen Interrupt Flag Register (TIFR, GIFR) usw. Aber beim Suchen nach den Registernamen bin ich selbst auf die Antwort gestossen.
    OCF0 is cleared by hardware when executing the
    corresponding interrupt handling vector.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Es kommt natürlich nicht nur auf die Länge der Ausführung in den Hall-ISRs an, sondern auch auf die restlichen. Wenn zb während des T0 IRQs INT0 und INT1 kommen, dann geht einer verloren. Deine Hall-ISR mit 3Halls x 167Umdr/s x 2Motoren = 1000 IRQs pro sekunde + restliche IRQs sind nicht so wenig, weshalb es nicht unwahrscheinlich ist, wenn es alle paar tausend IRQs zu einer Uberlagerung kommt.
    Deswegen schließe ich mich allen an --> nur Flags setzen, wenn möglich!
    Gruß

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    03.07.2006
    Beiträge
    143
    Vielen Dank für euere Antworten!
    Ich werde die If bedingung nun aus der ISR nehmen.

    zum verständniss, ich warte nicht auf einen PIN, sodern frage nur den status 1x ab.

    was meint ihr mit Flag setzten? einen Port Toggeln? oder eine Variable verändern?


    viele Grüsse
    Chris

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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