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
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.
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.
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? ...
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..
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 ;-)
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?
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 :-(
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.....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.