Frage zum Interrupt

Postby mr. teflon » Sat Mar 12, 2011 12:00 am

Hallo,

man liest ja das man die Aufgabe innerhalb einer Interruptfunktion möglichst kurz halten soll. Das habe ich jetzt probiert indem ich den Inhalt der Interruptfunktion in die main/while Schleife kopiert habe und nur noch die benötigten Zählvariablen in der Timer C Interruptfunktion hochzählen lasse. Eigentlich sollte sich das Programm wie vorher verhalten. Tut es aber nicht ganz zu 100%.

Meine Vermutung ist folgende. Ein Interrupt unterbricht doch die laufende Programmabarbeitung. Kann es jetzt sein, dass der Interrupt das auslesen der Temp.sensoren und/oder die LCD Ausgabe mittendrin stört?
Oder ist vielleicht der Compiler oder Interrupt so schlau und macht die gerade begonne Funktion noch zu Ende? Nur dann wäre es kein echter Interrupt mehr.

Was mich zu dem Schluss bringt, dass man zeitkritsche Aufgaben unbedingt in die Interruptfunktion schreiben muß, egal wie groß diese sind.
Nur muß diese wie in meinen Fall innerhalb von 100ms abgearbeitet sein. Sonst stolpert der Interrupt über seine eigenen Füsse. Bei mir kein Problem, aber bei großen Projekten sehe ich da schon ein Problem. Was macht man dann?

Tschau
Mr. Teflon
mr. teflon
 
Posts: 146
Joined: Fri Jan 03, 2014 1:48 pm

Postby herch » Sun Mar 13, 2011 12:00 am

Hallo,
in der Interrupt Prozedur setzt du z.B. "Temperatur1_auslesen = 1". In main() unterteilst Du "Temperatur auslesen", "Temperatur berechnen" und "Temperatur ausgeben" in Blöcke. Am Anfang jeden Blocks "Interrupt disable" am Ende jeden Blocks "Interrupt enable".

main() {...if (Temperatur1_auslesen == 1) {  // Block: Temperatur1 auslesen:  // ... interrupt disable  ...  // ... interrupt enable  // Block: Temperatur1 berechnen:  // ... interrupt disable  ...  // ... interrupt enable  // Block: Temperatur1 auf dem Display ausgeben  // ... interrupt disable  ...  // ... interrupt enable  Temperatur_auslesen = 0;}...} // end main


... zumindest bei anderen Prozessoren funktioniert das. Einfach mal ausprobieren.
herch
 
Posts: 52
Joined: Fri Jan 03, 2014 1:48 pm

Postby mr. teflon » Mon Mar 14, 2011 12:00 am

Hallo herch,

oh, das ist eine gute Idee. Eine Frage dazu noch, weil ich das bestimmt schlecht testen kann, mal vom Extremfall aus gesehen, für mein Verständnis. Falls eine Abarbeitung mit Interrupt disabled länger wie 104ms dauert im Fall von Timer C Overflow Interrupt, zählt dann der Timer intern trotzdem seine Overflows weiter? Nur ohne seine Interruptfunktion abzuarbeiten?
Würde in meinen Fall bedeuteten, die Variablen würden manchmal nicht hochgezählt?
Oder wenn man ihn als Takt betrachtet ist es manchmal kein gleichmäßiger Takt? Weil er manchmal ausgesetzt wird.

EDIT:
hat sich geklärt, konnte es mittels Oszi und viel Geduld selbst herausfinden.

Tschau
Mr. Teflon
mr. teflon
 
Posts: 146
Joined: Fri Jan 03, 2014 1:48 pm


Return to Das R8C-Projekt

Who is online

Users browsing this forum: No registered users and 1 guest