Forum: Mikrocontroller und Digitale Elektronik Schon wieder ne Frage zu Interrupts


von Patrick (Gast)


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

von STK500-Besitzer (Gast)


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.

von Patrick (Gast)


Lesenswert?

Danke für die Antwort. Dann liegt der Fehler wo anders :-(

von Michael G. (linuxgeek) Benutzerseite


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

von Patrick (Gast)


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)"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.