Forum: Mikrocontroller und Digitale Elektronik ATxMega: Port Event Both Edges zur Frequenzmessung


von Curby23523 N. (Gast)


Lesenswert?

Hallo,

ich versuche gerade eine Frequenz an einem Eingangspin zu messen und 
dessen gemessene Frequenz auf einem Display anzuzeigen. Funktioniert 
soweit, aber:

Die kurze Frage ist, ich kann nur mit der Bitmaske "PORT_ISC_RISING_gc" 
ein Event zum Messen generieren, also die steigende Flanke.

Bei "PORT_ISC_FALLING_gc" wird kein Event ausgelöst (Frequenz steht 
still, Display und mit Debugger überprüft) und bei 
"PORT_ISC_BOTHEDGES_gc" wird scheinbar auch nur die steigende Flanke 
ausgewertet, da mir diese Funktion nicht wie gehofft die doppelte 
Frequenz anzeigt, sondern die selbe wie bei "PORT_ISC_RISING_gc".

Im Datenblatt finde ich dazu nichts was mir das verbieten würde - was 
könnte ich falsch machen? Ich möchte halt, dass die steigende und 
fallende Flanke jeweils ein Event auslösen. Interrupts möchte ich 
vermeiden. Muss ich noch irgendwo ein Register setzen oder ähnliches?

Vielleicht hat da ja jemand Erfahrungen gemacht. Im Internet finde ich 
widersprüchliches bzgl. der Fähigkeit zum EVent auslösen bei fallender 
Flanke. Es gibt Foreneinträge die bestätigen die Funktion, andere 
verweisen auf ein Zitat aus einem Datenblatt, welches ich nicht finden 
kann.

PS: Ich benutze einen ATxMega128A4U

Danke euch!

von Stefan F. (Gast)


Lesenswert?

Im Datenblatt von Xmega D Kapitel 11 IO-Ports Unterkapitel 1 Features:
1
Input with synchronous and/or asynchronous sensing with interrupts and events
2
- Sense both edges
3
- Sense rising edges
4
- Sense falling edges
5
- Sense low level
Damit ist deine Frage schon beantwortet. Ja, die I/O Pins können beide 
Flankenwechsel mit Interrupts erkennen.

Weiter benennt Kapitel 11.6 Port Interrupt Einschränkungen, bezüglich 
des Aufwachens aus dem Sleep:
1
For edge detection, the changed 
2
pin value must be sampled once by the peripheral clock for an interrupt request to be generated.
3
For asynchronous sensing, only port pin 2 on each port has full asynchronous sense support. This means that for edge 
4
detection, pin 2 will detect and latch any edge and it will alwa
5
ys trigger an interrupt request. The other port pins have 
6
limited asynchronous sense support. This means that for edge detection, the changed value must be held until the device 
7
wakes up and a clock is present. If the pin value returns to its initial value before the end of the device wake-up time, the 
8
device will still wake up, but no interrupt request will be generated.

Jetzt ist also die Frage der Fragen, ob dein I/O Port asynchron (ohne 
Takt, im Sleep) oder synchron arbeitet.

von Stefan F. (Gast)


Lesenswert?

Ich sehe gerade, dass du einen Xmega A verwendest. Die verhalten sich 
aber genau so, habe ich gerade kontroolliert. Im Datenblatt wären dass 
die Kapitel 13.5 und 13.6.

von Curby23523 N. (Gast)


Lesenswert?

Ich möchte aber Events und keine Interrupts auslösen :). Interrupts 
verwende ich keine, sondern ein Events, welches dann ein input Capture 
in einem Timer auslöst.

Und das Event reagiert halt auf fallende Flanke scheinbar nicht.

von Stefan F. (Gast)


Lesenswert?

Oh, da habe ich dich missverstanden. Also Events...müsste aber auch 
gehen.

Wenn du die Kapitel angeschaut hättest, dann hättest du gesehen, dass 
für Events und Interrupts die gleichen Regel gelten. Sie werden 
schließlich von einem gemeinsam genutzten Schaltkreis erzeugt.

Schau wirklich mal in das Datenblatt rein, Kapitel 13.5 und 13.7. Da 
steht klipp und klar, dass beide Flanken erkannt werden. Darauf kannst 
du dich schon zu 99,99% verlassen. Wenn das bei Dir nicht geht, hast du 
sicher irgendwo anders einen Fehler.

Schreibe mal ein minimales Programm, welches nicht sweiter tut als 
dieses Event zu testen. Das wird dich sicher weiter bringen.

von Bastian W. (jackfrost)


Lesenswert?

Hi,

Wie hast du den Timer eingestellt Frequenz oder Pulslänge ?

Schau dir das Datebblatt an , da kommt der Capture Interrupt bei 
Frequenz bei jeder steigenden Flanke und im CCx Register steht der 
Timerwert.
Du musst hier also die ganze Periode.

Bei Pulslänge startet der Timer mit der steigende Flanke und CCx wird 
mit der fallenden Flanke ausgelöst. Hier misst du die Länge des High 
Pulses.

Was willst du denn messen die Pulslänge oder die Periode ?

Gruß JackFrost

von Curby23523 N. (Gast)


Lesenswert?

Ich messe eine Rechteckfrequenz und möchte jeweils die Zeit bis zum 
Flankenwechsel messen. Also nicht so ganz Periode aber auch keinen Puls.

Ich mache ein Frequenz Input Capture - aber sollte es dem Timer nicht 
egal sein, wo das Event herkommt? Wenn ein Event ankommt, wird CCA 
gesetzt - dann eben bei steigender un fallender Flanke.

von Wolfgang (Gast)


Lesenswert?

Nils H. schrieb:
> ich versuche gerade eine Frequenz an einem Eingangspin zu messen und
> dessen gemessene Frequenz auf einem Display anzuzeigen.

Wenn du die Frequenz messen willst, kann es sehr ungünstig sein, beide 
Flanken auszuwerten. Damit machst du die abhängig von absolut sauberem 
1:1 Tastverhältnis zwischen den Schaltschwellen incl. ggf. vorhandener 
Hysterese.

von Bastian W. (jackfrost)


Lesenswert?

Nein , den der Timer wertet bei Frequnzmessung nur die Zeit zwischen den 
steigenden Flanke aus.

Schaust dir im DB an dann wird es dir klarer.

Gruß JackFrost

von Bastian W. (jackfrost)


Lesenswert?

Mit einem Atxmega E kannst du beides in einem auswerten musst aber 
rechnen. Bei dem Xmega E ist in CCB die Zeit für High und in CCA ist die 
Periodenlänge. Sinnvoll ist das aber nicht wenn du keine 1:1 hast 
welcher Wert ist dann der richtige ?
Der Mittelwert ist die halbe Periodenlänge. Also CCx >>1.

Gruß JackFrost

von Curby23523 N. (Gast)


Lesenswert?

Also erkennt der Timer, was das Event für eine Quelle hatte? Kann ich 
mir nicht so recht vorstellen, dass das so implementiert ist? Ist es 
nicht so, dass der Timer nur sieht "da kommt ein Event", reagiert und 
mehr nicht?

Das Event selber sieht eine fallende Flanke und beschließt nichts zu 
machen, weil ein Timer auf ihn hört, welcher eine Frequenz misst? Das 
wäre sehr schade.

Ich möchte beide Flanken messen und dann aus z.B. vier Messungen den 
Mittelwert bilden. Da die Frequenz auch zwischen zwei Takten nicht 
identisch ist und sich auch während eines Taktes ändern kann(alles 
technologisch bedingt), möchte ich so mehr oder die selbe Anzahl von 
Messwerten in weniger Zeit ermitteln.

von Bastian W. (jackfrost)


Lesenswert?

Nils H. schrieb:
> Also erkennt der Timer, was das Event für eine Quelle hatte? Kann
> ich
> mir nicht so recht vorstellen, dass das so implementiert ist? Ist es
> nicht so, dass der Timer nur sieht "da kommt ein Event", reagiert und
> mehr nicht?
>

Der Timer bekommt vom Eventsystem die Meldung das was ist und Jannasch 
Timer Config achtet er nur auf die Szeugenden Flanken oder auf beide unt 
misst die High Zeit.

> Das Event selber sieht eine fallende Flanke und beschließt nichts zu
> machen, weil ein Timer auf ihn hört, welcher eine Frequenz misst? Das
> wäre sehr schade.
>

Das macht der Timer. Schau dir die Bilder im DB an da ist das gut 
beschrieben. Würde der Timer nur reagieren ohne das er weiß wie der 
Pinstand ist, dann weißt du ja nie ob du low oder high misst.


> Ich möchte beide Flanken messen und dann aus z.B. vier Messungen den
> Mittelwert bilden. Da die Frequenz auch zwischen zwei Takten nicht
> identisch ist und sich auch während eines Taktes ändern kann(alles
> technologisch bedingt), möchte ich so mehr oder die selbe Anzahl von
> Messwerten in weniger Zeit ermitteln.

Mach doch einfach einen Tiefpass über 2 Messungen der Periode. Ob du nun 
die Zeiten von zweimal high und zweimal low misst und die Zeit durch 
vier teilst oder zwei Perioden durch zwei teilst ist doch egal. Die 
Periode ist ja genau high + low. Du kannst auch den gleitenden 
Durchschnitt über zwei bis x Perioden machen.

Oder halt in Software machen.

Gruß JackFrost

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.