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!
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.
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.
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.
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.
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
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.
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.