mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RxTx Interrupt Routine (?)


Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Folgendes:
Ich habe mir in C eine Routine für den AD-Wander Max186 geschreiben, 
dass ganze läuft auf dem AT89C51RD2.
Die digitalen Werte sollen an die RS232 geschickt werden.
Solange ich den AD-Wander Routinenaufruf in der Endlosschlaufe im main 
mache funktioniert das auch einwandfrei. Da ich aber die digitalen Werte 
in bestimmten Abständen möchte dachte ich mir den AD-Routinenaufruf in 
den RxTx-Interrupt zu verschieben. Die Idee dabei ist, dass ich jetzt 
den Digitalen Wert erhalte sobald ich ein gewisses Zeichen über die 
RS232 an den uC schicke.
Ich musste jedoch feststellen dass der Wert dann plötzlich immer 0x00 
ist.

Mit was könnte das zu tun haben ?
Kann ich vom RxTx-Interrupt aus keine Funktionen aufrufen,
hat es irgendwas mit den Registerbankten zu tun oder hab ich sonst 
irgendwelche Restriktionen ?
Generell wird die RxTx-Routine richtig durchlaufen (loopback-test).

Kann mir jemand einen Tip geben ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erlaubt ist fast alles im Interrupt.

Der Fehler muß also mit Deinem Programm zu tun haben.


Ob es aber klug ist, längere Zeit im Interrupt zu verweilen ist eine 
andere Sache.

Ich persöhnlich halte Interrupts immer nur wenige µs kurz, den Rest 
macht dann das Main.


Peter

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

Danke,
Im Interrupt habe ich ja nur den Funktionsaufruf für die AD-Wandlung, 
alles andere wird ausserhalb abgearbeitet.
Oder hab ich das jetzt nicht richtig verstanden ?

Dani

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Durch den Funktionsaufruf für die A/D Wandlung wird natürlich eine 
Routine aufgerufen, die irgendwo im Programmspeicher steht, aber die 
Interrupt-Routine wird natürlich erst nach deren Beendigung verlassen.
Gerade hier werden die meisten Anfängerfehler gemacht, da der Zeitbedarf 
für die aufgerufenen Unterprogramme schlichtweg vergessen wird.

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich dann eine Routine von dem Interrupt her starten ohne das 
der Interrupt durch den ganzen Ablauf "besetzt" bleibt ?`
Stichwort ...

Danke Dani

Autor: Peter Kutsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dani
Vorschlag: setze doch einfach in deiner Interupt Routine eine Variable 
auf z.B. 1, wenn ein Wert an die Serielle ausgegeben werden muß. 
Ansonsten bleibt es bei deiner funktionierenden Main Routine. Nur musst 
Du dann in der Main Routine auf diese Variable abfragen und wenn diese 
auf 1 ist, die Wandlungsroutine aufrufen und den Wert ausgeben.
lg
Peter

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter K.
Gute Idee, werde ich mal probieren

Danke
Dani

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das nennt man auch Polling.

Vorzugsweise nimmt man eine Bit-Variable dafür.


Peter

Autor: Peter Kutsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter
ob Bit-Variable oder Byte, wenn nur eine Bit Variable genutzt wird, dann 
belegt diese ebenfalls ein Byte.
Polling:
und ich habe immer gedacht, polling ist, wenn mehrere Ports einen 
gemeinsamen Interupt nutzen und man dann nachschaut, welches Port den 
Interupt ausgelöst hat. Oder wenn man Ports der reihe nach auf änderung 
abfragt.
nicht ernst gemeint ))):, so kann an sich irren
lg Peter

Autor: Dani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke meine Herren ;)
Da bin ich doch wieder ein Stück schlauer geworden !

Gruss
Dani

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man ein Bit deklariert, reserviert der Kompiler ein ganzes Byte 
dafür, das stimmt.
Aber dann können noch 7 weitere Bits deklariert werden.
Und erst ab dem 9. Bit wird dann wieder ein weiteres Byte reserviert 
usw. bis zu 128 Bits (= 16 Byte).


Polling ist, wenn man einen Pin oder eine Variable zyklisch abfragt 
(pollt) ob sich was geändert hat.

Das Pollen auf ein Bit ist sehr effizient (JNB-Instruktion), ein Byte 
dagegen muß erst in den Akku geladen werden, um es mit JNZ zu testen.


Peter

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.