RxTx Interrupt Routine (?)

Gast #16236
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 ?
#16237
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
Gast #16239
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.
Gast #16241
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
Gast #16244
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
#16246
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren