mikrocontroller.net

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


Autor: Marel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sssssss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein normales

sei();

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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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?).

Autor: Marel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine While Schleife wird garantiert keine Interrupts ausschalten !

Das muß schon wo anders passieren.

Gruß, Marcus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.