ADC Interrupt mit Atmega8

Gast #1398578
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?
Angehängte Dateien:
Gast #1398588
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.
Gast #1398590
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.
Gast #1398599
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.
Angehängte Dateien:
Gast #1398603
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.
Gast #1398653
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.
Gast #1398775
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.

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