Forum: Mikrocontroller und Digitale Elektronik Comparator zu viele Interrupts


von R. Q. (timebeast)


Lesenswert?

Moin,
ich hab gerade das Problem das ich an dem Comparator Eingang AIN1 und 
AIN0 einen Spannungsunterschied feststellen möchte. Er soll mir bei 
steigender und fallender Flanke EINEN Interrupt werfen.

Grundsätzlich funktioniert das von mir Programmierte schon richtig und 
gut, da die Spannung aber eine Sinuswelle ist, die ich am Eingang anlege 
passiert folgendes:
Er merkt das eine höhere Spannung an AIN0 anliegt als an AIN1 und wirft 
den ersten Interrupt, wunderbar, soweit auch wie geplant. Jetzt steigt 
die Spannung jedoch weiter, und er wirft den nächsten und den nächsten 
und äääh so weiter halt...

Da ich in der ISR eine Variable hochzählen wollte um festzustellen 
wieviele Impulse er schon bekommen hat, ist dieses Verhalten als,... 
sagen wir unglücklich zu bezeichnen. ;-)

Axo, ER ist im übrigen ein ATmega8 und programmiert wird in ASM unter 
AVR-Studio.

Jemand ne Idee, oder muß ich wirklich auf so ein Workaround 
zurückgreifen wie, gucke ob sich ACO geändert hat und zähle nur dann. 
Das fände ich nämlich nicht soooo schön, da er mir dann eigendlich viel 
zu viel Zeit in der ISR verbringt...

Gruß Ralf

von Georg C. (citkid)


Lesenswert?

Hallo,

du hast deinen Interrupt warscheinlich auf positiven Wert eingestellt. 
Da aber der Wert oberhalb der Schaltschwelle auch nach abarbeiten des 
Interrupts noch anliegt bekommst du natürlich weitere Interupts.

Du muß deine Interrupauslösung auf z. B. steigende Flanke einstellen. 
Dann ist dein Problem gelöst.

von R. Q. (timebeast)


Lesenswert?

Also, ja genau, so könnte man das Problem umschreiben, das Problem, wenn 
ich auf Seite 191 im Manual des ATmega8 gucke gibt es halt "nur" 3 
Einstellungen:
 - Interrupt on Output Toggel
 - Interrupt on falling Output Edge
 - Interrupt on rising Output Edge

Ich habe mich für den "Output Toggel" entschieden, also immer wenn ACO 
Toggelt wird ein Interrupt ausgeführt. Die Einstellung "Interrupt auf 
positiven Wert" habe ich nirgends gefunden.

Wo stell ich den denn ein, weil, dann wäre der Umkehrschluß einfacherer 
zu finden, denke ich.

Gruß und Danke

Ralf

P.S.:
Oder bedeutet "Interrupt on Output Toggel" etwa das er mir Interrupts 
schmeißt solange der Wert positiver bzw. so lange der Wert negativer 
ist??

Nachtrag:
So habe gerade mal versucht das ganze mit "Interrupt on rising Output 
Edge" laufen zu lassen. Exakt das gleiche Ergebnis. Sobald ich die 
Schaltschwelle mit dem Analogen Signal überschritten habe, wirft er mir 
mit steigender positiven Spannung immer weitere Interrupts.

von Hannes L. (hannes)


Lesenswert?

Bist Du sicher, dass Dein "Sinus-" Signal so sinusförmig (unverzerrt) 
ist, dass es pro Periode wirklich nur eine Flanke in jeder Richtung hat? 
Der AC hat keine Hysterese, wenn das Signal Überlagerungen hat, dann 
gibt es mehrere Interrupts. Schonmal an Tiefpass in der Messleitung 
gedacht?

...

von David (Gast)


Lesenswert?

Interrupt on Output Toggel
das heisst, dass sowohl bei fallender, als auch bei steigender flanke 
ein interrupt ausglösst wird... sprich du hast deswegen schonmal doppelt 
soviel interrupts wie du haben müsstest...
Ists wirklich ein sinus? störungen daruf? schon mal ne messung mit einem 
vernünftigen ko gemacht? kommen die zusätzlichen interrupts regelmässig?
allenfalls ein rc-gleid mit entsprechender grenzfrequenz von den eingang 
plazieren..

von R. Q. (timebeast)


Lesenswert?

Hallo Hannes,
doch, mein Comparator hat eine Hysterese. Hab ich selbst eingebaut. Ich 
teste in der ISR einfach ob ACO 1 oder 0 ist, dadurch schalte ich einen 
Portpin, der widerrum erhöht oder erniedrigt die "GND" Spannung  am 
Comparator des uC. klappt wunderbar, kein Schwingen mehr im 
Umschaltmoment.

Und, ja, ich bin mir ganz sicher das das Signal keine überlagerungen 
hat. Reinster Sinus, kommt allerdings drauf an wie schnell ich schiebe. 
Zur Erklärung:
Druckerkopf der mit einer Lichtschranke ein Strichband abtestet. Also 
wenn ich den Druckerkopf nun schnell am Linienband vorbei ziehe kommt 
hinten nen Astreiner Sinus raus. wenn ich ihn langsam dran vorbei ziehe, 
sehe ich auf dem Ozi halt die Spannung langsam auf 5V steigen und dann 
wieder runter auf 0V. Sobald ich allerdings die Schaltschwelle 
überschritten habe, fängt er an wie doof Interrupts zu schmeißen bis ich 
bei 5V angekommen bin...

@David:
Was ist ein "ko"??
Mit dem RC Glied meinst Du schätzungsweise auch einen Tiefpaß der mir 
etweilige Störungen wegfiltern würde, aber, sorry, das ist es mit 
Sicherheit nicht, siehe Text den ich an Hannes geschrieben hab hier 
oben.
Ach nochwas, nichts für ungut aber:"sprich du hast deswegen schonmal 
doppelt soviel interrupts wie du haben müsstest..." nö, ich habe genau 
die Anzahl Interrupts die ich brauche, bis auf die 127 anderen die er 
mir mit steigernder Spannung auch noch wirft ;-)

von R. Q. (timebeast)


Lesenswert?

ich meine, Georg C. hat doch schon im Prinzip genau das geschrieben was 
ich suche: "du hast deinen Interrupt warscheinlich auf positiven Wert 
eingestellt".

Gibt es denn irgendwo ein Flag ein Fuse oder Bit mit dem ich von 
"Interrupt bei positiven Wert" auf "Interrupt nur einmal ausführen bei 
Flankenwechsel" umschalten kann?

von R. Q. (timebeast)


Lesenswert?

Falls mal jemand das gleiche Problem haben sollte ich hab es halt jetzt 
erstmal so gelöst:
In der ISR:
1
sbic ACSR, ACO      //wenn ACO null ist,
2
  ldi ACO_neu, 0    //wird Register ACO_neu auch null
3
sbis ACSR, ACO      //wenn ACO eins ist,
4
  ldi ACO_neu, 1    //wird Register ACO_neu, eins
5
6
cpse ACO_alt, ACO_neu          //Vergleich, wenn gleich
7
  inc temp_GRENZE    //temp_Grenze nicht hochzählen  
8
9
mov ACO_alt, ACO_neu          //ACO_neu in _alt speichern für nächsten Interrupt

Aber wie oben schon geschrieben, schön finde ich diese Lösung nicht, und 
von Elegant kann keine Rede sein... nunja, vielleicht hat ja doch noch 
jemand ne Idee  :-(

von Georg C. (citkid)


Lesenswert?

Hallo,

bin im Moment in Eile. Nur kurz zu diesem Text:

R. Quentin wrote:
> Also, ja genau, so könnte man das Problem umschreiben, das Problem, wenn
> ich auf Seite 191 im Manual des ATmega8 gucke gibt es halt "nur" 3
> Einstellungen:
>  - Interrupt on Output Toggel
>  - Interrupt on falling Output Edge
>  - Interrupt on rising Output Edge
>
Genau das ist es doch:
 - Interrupt on falling Output Edge = Interrupt bei fallender Flanke
 - Interrupt on rising Output Edge = Interrupt bei steigender Flanke

> Nachtrag:
> So habe gerade mal versucht das ganze mit "Interrupt on rising Output
> Edge" laufen zu lassen. Exakt das gleiche Ergebnis. Sobald ich die
> Schaltschwelle mit dem Analogen Signal überschritten habe, wirft er mir
> mit steigender positiven Spannung immer weitere Interrupts.

Hast du noch irgend etwas übersehen?
Ist dein Signal auf der INT-Leitung sauber?
Schau morgen abend wieder rein - bis dann.....

von Georg C. (citkid)


Lesenswert?

Hallo,

hab leider erst heute wieder Zeit gefunden und bin die Register noch 
einmal durchgegangen.
Wie stehts bei dir mit dem "ACBG" (Analog Comparator Bandgap Select)? 
Dieses Register sollte bei dir nicht gesetzt sein.
Und wie ist das mit "ACME" (Analog Comparator Multiplexer Enable)? Auch 
dieses Register sollte bei dir nicht gesetzt sein.

Sollte das alles nicht helfen, versuche doch mal folgendes:
Anstelle des original Eingangsignals nimmst du einen Elko von z. B. 
100µF zwischen Eingangspin und 0V. Den Elko lädst du dann mit einem 
10K-Ohm Widerstand an 5V auf. Wenn der Elko aufgeladen ist. solltest du 
nur einen Interrupt gehabt haben.
Das hilft vielleicht den Fehler einzukreisen.

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.