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 ?
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
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
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.
Wie kann ich dann eine Routine von dem Interrupt her starten ohne das der Interrupt durch den ganzen Ablauf "besetzt" bleibt ?` Stichwort ... Danke Dani
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
Das nennt man auch Polling. Vorzugsweise nimmt man eine Bit-Variable dafür. Peter
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
Danke meine Herren ;) Da bin ich doch wieder ein Stück schlauer geworden ! Gruss Dani
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.