Forum: Mikrocontroller und Digitale Elektronik ADC Interrupt mit Atmega8


von Tom (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Tom (Gast)


Lesenswert?

Nachtrag: Dieser Code soll nur die Werte des ADC anzeigen, und falls der 
Interrupt auslöst, die LCD Anzeige bringen.

von gast (Gast)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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.

von Andreas R. (rebirama)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.