www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Interrupt mit Atmega8


Autor: Tom (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Tom (Gast)
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas R. (rebirama)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom,

Dein Code ist in dieser Form relativ sinnfrei.

Das hier:
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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.