Forum: Mikrocontroller und Digitale Elektronik while schleife ?????


von Marel (Gast)


Lesenswert?

Hallo zusammen,
ich habe ein Problem!!!

Ich habe ein Display an dem ich die RTS-Leitung abfrage. D.h. ich frage
erst die RTS-Leitung ab, bevor ich neue Daten an das Display sende.

//------------------------

while (PIND.3==1) {}

//------------------------

(programmiert mit CodeVision)

Das heißt das der µC so lange nichts tun kann, bis das Display das O.K.
gibt. Was ja nicht schlecht ist. Jetzt soll aber auf dem Display auch
eine Uhr laufen die über einen Timer-Interrupt gesteuert wird. Wenn ich
die Uhr ganz normal anzeigen lasse,(keine Daten sende) gibt es keine
Probleme. Wenn ich aber Daten an das Display sende, (Menü auf dem
Display) dann hält das natürlich alles auf und nach einigen, gesendeten
Daten geht die Uhr natürlich nach. Heißt das, dass eine
"while-Schleife" keine Interrupt's zulässt??
Hättet ihr eine andere Möglichkeit??

:o(

Grüße Marcel

von Malte _. (malte) Benutzerseite


Lesenswert?

> Heißt das, dass eine "while-Schleife" keine Interrupt's zulässt??
Nein. Interrupts werden normalerweise nicht einfach so deaktiviert.
Ausnahme sind jedoch andere Interrupts oder eventuell der EEPROM
Zugriff. Ansonsten ist es sinnvoll das Bit zu setzen welches den Timer
automatisch wieder auf Null setzt, da es mal den ein oder anderen Takt
mehr oder weniger dauert (der aktuelle Befehl muss meines wissens erst
beendet werden) bis der Interrupt angesprungen wird.

von Marel (Gast)


Lesenswert?

Falls es jemanden interessiert...

ich habe es hin bekommen.
Den Code habe ich wie folgt geändert:

while (PINB.1==1)
    {
      // Global enable interrupts
      #asm("sei")
    }
Gruß Marcel

von Sssssss (Gast)


Lesenswert?

ein normales

sei();

vor der Schleife sollte es auch tun.. Oder nicht ?

von Christoph _. (chris)


Lesenswert?

Die Zeile mit dem #asm kannst du auch über die while-schleife setzen,
dann dürfte der Code einfacher zu verstehen sein (wieso aktivierst du
immer und immer wieder die Interrupts?).

von Marel (Gast)


Lesenswert?

Ich aktiviere die Interrupts nicht immer und immer wieder!! Ich habe nur
bemerkt das meine Uhr zu langsam läuft. (siehe erklärung oben) Wenn ich
keine Daten an das Display schicke, dann läuft es ohne Probleme. Werden
aber viele Daten gesendet, dann wird die ungenauigkeit immer größer.
Daraus schließe ich, dass in der while-Schleife keine Interrupts
zugelassen werden. (Uhr wird über Timer-Interrupt gesteuert) Ich kenne
die genaue Funktion von der while-Schleife nicht aber das würde es
erklären. Deshalb habe ich einfach mal die Interrupts in der
while-Schleife wieder gesetzt. Und es schein zu funktionieren. Der
Interrupt wird bei mir generell nur einmal in der "main"-Schleife
aktiviert und nie mehr ausgeschaltet.

Grüße und schönes WE...

Marcel

von Malte _. (malte) Benutzerseite


Lesenswert?

Schau dir doch mal die Assembler Ausgabe (einmal mit und ohne sei() in
der Schleife) an. Dann gibt es Klarheit über die Interrupts und wir
müssen nicht mehr spekulieren. :-)

von Marcus (Gast)


Lesenswert?

Eine While Schleife wird garantiert keine Interrupts ausschalten !

Das muß schon wo anders passieren.

Gruß, Marcus

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.