Hallo liebe User ich nutze Bascom und einen Atmega8. Ich schließe an den AD0 und AD1 Eingängen jeweils ein Poti an (VCC als Referenzspannung). Mittels ADC Interrupt sollen die Eingänge überwacht werden, und wenn sich durch drehen des Potis die Eingangsspannung ändert, soll der Atmega eine Aktion ausführen (z.B. RS232). Auf einem LCD lasse ich mir anzeigen, ob die ADC-ISR ausgelöst wurde (mit einfacher Nachricht auf dem LCD). Das funktioniert soweit, ABER: Die ADC-ISR löst ständig willkürlich aus, auch wenn man das Poti nicht verstellt.Wie empfindlich ist so ein Eingang, oder ist am Code etwas falsch?
Nachtrag: Dieser Code soll nur die Werte des ADC anzeigen, und falls der Interrupt auslöst, die LCD Anzeige bringen.
Wie kann ein ADC-Interrupt beim ändern eines AD-Wertes auslösen ???? Früher war das so, dass die AD-Wandlung erst gestartet werden musste UND dann nach der Wandlung ein Interrupt (=> Wandlung fertig) ausgelöst hat. Ich denke du willst eine Art Komparator haben, den musst du aber anders realisieren.
Wenn es sich bei der ISR um die die ISR handelt, die der ADC aufruft, wenn er mit einer Wandlung fertig ist, dann ist es klar, warum dauernd eine Änderung angezeigt wird. Du musst einen alten mit dem neuen ADC-Wert vergleichen. Das macht der ADC nicht von alleine.
Hallo STK500 Besitzer, Meinst Du in etwa so wie in dem jetzt anhängenden Code? Beim Controllerstart wird altpoti1 mit dem ADC Wert beschrieben. In der ISR wird der Wert des AD abgefragt, und wenn dieser Ungleich dem altpoti ist, wird die Nachricht ausgelöst.
Das genügt noch nicht. Lass dir doch mal die ADC Werte kontinuierlich ausgeben, dann siehst du dass der selbst bei fester Potieinstellung nicht fest ist sondern immer etwas rauscht. Du musst also ein kleines Fenster einbauen in dem sich der Potiwert ändern darf ohne dass es weiterverarbeitet wird.
hi, du muss noch berücksichtigen, dass der gemessene wert, auch ohne dass du an dem poti drehst, um ein paar LSB schwanken kann. -> hysterese oder ähnliches einbauen.
Tom, Dein Code ist in dieser Form relativ sinnfrei. Das hier:
1 | Wertpoti1 = Getadc(0) |
löst eine Einzelwandlung des ADC aus und weist sie zu, mehr ist eigentlich nicht mehr nötig. Da aber der ADC Interrupt eingeschaltet ist, wird dieser aufgerufen sobald obige Wandlung fertig ist und es wird darin erneut eine Wandlung vorgenommen. Und hier wird's unsinnnig. Die ADC ISR kann man gut verwenden, wenn man nicht auf die erfolgreiche Wandlung in einer Loop warten möchte. Genau das macht Bascom übrigens bei obigem Befehl, da wird in einer Schleife gewartet bis ADSC gelöscht und damit eine erfolgreiche Wandlung sigalisiert wurde. Man verwendet die ADC ISR auch um fortlaufend zu wandeln, im Datenblatt als "free running" bezeichnet. Nur hier in Deinem Code macht's absolut keinen Sinn. Aus Gesagtem geht schon hervor, daß der ADC Interrupt nicht aufgerufen wird wenn sich etwas ändert, sondern wenn eine Wandlung fertig ist. Und LCD Ausgabe und Waits sind in einer ISR völlig fehl am Platz.
Also hab ich nach dem Ende der Wandlung ne neue Wandlung aufgerufen, die wieder eine neue Wandlung aufrief..... So wie der Hund der seinen eigenen Schwanz fängt.
So in etwa :D Quasi der free running mode in einer etwas anderen Variante. Nur recht uneffektiv, da wie gesagt der GetADC Befehl von Bascom in einer Schleife auf ein gültiges Ergebnis wartet. Und da üblicherweise in einer ISR all weiteren Interrupts gesperrt sind, kann der µC auch nix Anderes mehr machen. Das ist auch der Grund, warum ein Wait in einer ISR recht ungünstig ist.
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.