Analogeingang auf pin change interrupt wechseln bei AVR

Gast #7132463
Lesenswert?

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.
(Firma: matzetronics) #7132469
Lesenswert?

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.
Gast #7132486
Lesenswert?

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.
Gast #7132585
Lesenswert?

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.
Gast #7132636
Lesenswert?

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.
Gast #7132669
Lesenswert?

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.
Gast #7132724
Lesenswert?

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).

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