Hi, ich benutze bei einem AVR einen ADC Pin um ein analoges Signal zu lesen, möchte aber in einem bestimmten Modus über diesen Pin einen Trigger empfangen, wofür ich normalerweise einen Pin-Change-Interrupt verwenden würde. Ich könnte jetzt versuchen, programmatisch das Analogsignal auf Flankenverhalten zu untersuchen, aber das fühlt sich irgendwie falsch, umständlich an. Alternativ dachte ich, ob ich einfach bei Modusänderung den Pin auf PCIR umstelle. Allerdings frag ich mich, ob ich Interrupts innerhalb eines Interrupt-Handlers überhaupt einstellen kann (die Modusänderung findet durch ein anderes Pin Change Event statt). Habt ihr Tipps, wie man sowas elegant lösen kann? Hintergrund: Es geht um ein Synthesizer-Modul in dem ein Eingang in einem Modus die Kontrollspannung für einen LFO, in einem anderen einen Trigger für einen Envelope Generator bekommen soll.
Einfach machen! Ich kann die Geister nicht erkennen, welche du da siehst.
Aus meinen alten Versuchen mit einem resistiven Touchpanel weiss ich, das Umschalten von Analogeingang zu Digitaleingang oder -ausgang problemlos funktioniert. Es spricht nichts dagegen, das man nach dem Umschalten auch gleich einen PinChange Interrupt aktiviert. Es kann allerdings sein, das ein IRQ ausgelöst wird, wenn der Pin noch am Ändern des Pegels ist. Also sicherheitshalber nochmal das IRQ Flag löschen. Aktivieren und Scharfschalten eines Interrupts in einem anderen Interrupt funktioniert jedenfalls - habe ich schon oft gemacht.
Matthias S. schrieb: > Also sicherheitshalber nochmal das IRQ Flag löschen. Genau DAS stimnmt! Sonst kannn der PC-Int ev. direkt nach der Modusumschaltung bereits feuern. Also ERST das PCINT-Flag löschen und DANN den PCINT aktivieren. Klappt natürlich alles nur, wenn der AVR PCINTS auf dem ADC-PORT unterstützt, tun nicht alle und der AVR-TYP wurde ja nicht genannt.
Komparator (AIN0 - AIN1) könnte klappen. https://www-user.tu-chemnitz.de/~heha/hsn/chm/ATmegaX8.chm/ Suche unter Analogvergleicher
Ein Moduswechel solte fehlervermeidend durchgeführt werden und kostet dann halt einige µC-Takte: Vor dem Aktivieren einer geänderten Interrupt-Quelle im laufenden Programm wird das zugehörige Interrupt-Request-Flag gelöscht. Im einfachsten Fall heißt das: Flag-Register lesen und (evtl. über eine AND-Maskierung) wieder schreiben! - Kostet 2, oder 3 zusätzliche µC-Takte. Oder mehr, wenn für den Vorgang Register "gerettet" werden müssen. Die andere Richtung Digital-In nach ADC-In ist zeitaufwändiger: Hier empfiehlt es sich meist, den ersten ADC-Sample zu verwerfen, was gern mal 20 µC-Takte, oder auch eine Sample-Periode kosten kann... Wenn das zeitlich nicht reicht, braucht man mehr I/O-Pins, oder einen µC mit mehr I/O-Pins.
mir scheint, dass ich durch die Beschaltung des Analogeingangs jetzt da irgendwie keinen Interrupt mehr ausgelöst bekomme (Levelanpassung von Eurorack Gatespannung und Schutz gegen Negativspannung). Vielleicht bin ich auch nur zu doof das richtig zu programmieren. Hab mir jetzt damit geholfen, dass ich Gate on und off analog messe und auf den Wechsel reagiere, also keine Interrupts dafür nutze. Timing-kritisch ist das ganze eh nicht, da ich irgendwo im Subaudio-Bereich unterwegs bin.
Wenn dein Signal nicht unter 1/3 bzw. über 2/3 der Betriebsspannung geht, lässt es sich digital nicht sicher auswerten. 40% zu 60% reichen manchmal, aber nicht IMMER. Schön, dass du einen Behelf gefunden hast.
Kurt schrieb: > Ein Moduswechel solte fehlervermeidend durchgeführt werden und kostet > dann halt einige µC-Takte: Nein, das ist Unsinn. Es muss nämlich überhaupt keinen Moduswechsel geben. Es ist problemlos möglich, PCINT und Analog an einem Eingang gleichzeitig zu betreiben, sprich: der ADC kann schlicht durchlaufen und der PCINT nach Bedarf maskiert oder nicht maskiert werden. Die Demaskierung (also Aktivierung) ist dabei der längste Vorgang und kostet schlimmstenfalls 6 Takte (wenn beide beteiligten Register im MMIO-Bereich liegen).
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.