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


von Dani (Gast)


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 ?

von Peter D. (peda)


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

von Dani (Gast)


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

von mikki merten (Gast)


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.

von Dani (Gast)


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

von Peter Kutsch (Gast)


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

von Dani (Gast)


Lesenswert?

@Peter K.
Gute Idee, werde ich mal probieren

Danke
Dani

von Peter D. (peda)


Lesenswert?

Das nennt man auch Polling.

Vorzugsweise nimmt man eine Bit-Variable dafür.


Peter

von Peter Kutsch (Gast)


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

von Dani (Gast)


Lesenswert?

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

Gruss
Dani

von Peter D. (peda)


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

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.