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
> 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.
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
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?).
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
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. :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.