Schon wieder ne Frage zu Interrupts

Gast #831609
Lesenswert?

Guten Morgen Forum!!

Ich weiss, dass es schon viele Fragen zu diesem Thema gibt. Genau 
deshalb, muss ich auch noch eine stellen, weil ich aus den anderen nicht 
die richtige Antwort gefunden habe.

In einem Projekt verwende ich den AT90CAN32. Der soll eine CAN-Nachricht 
empfangen und, je nach Daten in der Nachricht, einen DC-Motor über PWM 
ansteuern (links/rechts/stopp). Über den Sense-Ausgang des verwendeten 
Motortreibers (L6201) wird am uC am ADC der Motorstrom gemessen. Wird 
der zu hoch, schaltet der Motor ab. Eine blinkende LED zeigt an, dass 
auf dem uC ein Programm ausgeführt wird.

Folgende 3 Interrupts werden verarbeitet:
- Eintreffen einer CAN-Nachricht
- ADC-Messung abgeschlossen, anschliessende Kontrolle des Wertes
- Timer 2 overflow, um die LED zu toggeln

Soweit so gut. Nun zu meiner Frage:
Können sich diese Interrupts in die Quere kommen? Also wenn grad der 
Timer 2 überläuft aber gleichzeitig eine CAN-Nachricht eintrifft. Kann 
das dazu führen, dass er auf die CAN-Nachricht nicht reagiert?

Danke für Eure Antworten

Gruss
Patrick
Gast #831637
Lesenswert?

>Können sich diese Interrupts in die Quere kommen? Also wenn grad der
>Timer 2 überläuft aber gleichzeitig eine CAN-Nachricht eintrifft.

Nein. AVR haben eine ganz einfache Interrupt-Behandlungsmethode:
Immer nur einer zur Zeit. Alle anderen, die zur gleichen Zeit auftreten 
werden erst nach Beenden der ISR abgearbeitet.
Es werden die Interrupt-Flags gespeichert.
Persönliche Seite #831905
Lesenswert?

Hi Patrick,

es ist natuerlich moeglich, dass Interrupt-Ereignisse verloren gehen, 
wenn ein aktiver Interrupt zu lange dauert, denn mehr als ein Ereignis 
kann nicht vorgemerkt werden (1-Bit-Flag, keine Liste). Es ist moeglich, 
geschachtelte Interrupts zu erlauben, aber man sollte dann schon wissen, 
was man tut. Warum postest Du nicht einfach mal Deinen Code und 
beschreibst Deinen Fehler exakt?

lg,
Michael
Gast #831971
Lesenswert?

Hallo Michael

Das Problem war folgendes:
Die CAN-Befehle für den Motor werden von einem Handschalter ausgelöst. 
Die Befehle habe ich mit dem CANalyzer untersucht und sie werden zu 
jeder Zeit korrekt abgesendet.
Nun ist aber sporadisch der Motor stehen geblieben, obwohl eine 
CAN-Nachricht vom Handschalter versendet wurde. Zuerts dachte ich, die 
CAN-Nachrichten kämen nicht korrekt beim Motor an. Aber es hat sich 
herausgestellt, dass die softwaremässige "Strombegrenzung" manchmal beim 
starten des Motors sofort anspricht, und so der Motor gleich wieder 
abstellt.
Gelöst habe ich das über eine kurze Zeitverzögerung (ca. 65ms), die erst 
nach ca. 65ms nach dem Start des Motors den ADC für die Strommessung 
aktiviert.

Der Dauertest mit der neuen Software läuft bereits und bis jetzt sieht 
alles gut aus.

Du hast recht, ich hätte den Code hier veröffentlichen sollen.

Beitrag "Frage zu meinem Code (C)"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren