Forum: Mikrocontroller und Digitale Elektronik Frequenz messen und bei halbe Periodenlänge Ereignis


von Sven Konstanz (Gast)


Lesenswert?

Hallo,

ich messe im Moment mit ICP eine Frequenz ein.
Nun möchte ich, dass bei der letzen Flanke (Endwert der Messung) einen 
Port Zustand wechseln.
Der Port soll nach der halben Periodendauer (halbe Frequenz) wieder in 
seinen Ursprungszustand zurückgesetzt werden.
Also den Port toggeln eine halbe Frequenz lang. Das erste toggeln kann 
ich direkt nach der letzten Flanke machen, das ist kein Problem. Aber 
das Rückversetzen (zurück toggeln).
Soweit noch nichts dramatisch. Ich verwende für die Frequenz aufgrund 
der Auflösung einen 16-bit Timer.
Da ich einen Attiny24 verwende, bleibt mir noch noch ein 8-bit Timer.
Ich habe gedacht, das einfachste wäre, wenn ich den aus der Frequenz 
vorliegendenen Timerwert (Differenz Start-Ende) nehme, halbiere und in 
CTC einstelle.
Nur kann ich das ja nicht beim 16-bit Timer machen, weil das mir meine 
Frequenzmessung durcheinander haut oder?
Also bliebe doch nur noch die Möglichkeit, den 16-bit auf 8-bit 
umzurchenen, nämlich durch 256 zu teilen und den 16-bit Wert Modulo 
nehmen. Damit hätte ich dann die Anzahl overflows und den Wert 
(256-Modulo Wert) zum einmaligen Vorladen des 8-bit Timers.
Gibt es noch eine bessere Lösung? Oder gar eine Lösung das mit dem 
16-bit Timer zu bewerkstelligen?
Was mir noch einfällt, den 16-bit Timer in sehr geringen Abständen 
(halbe max. Frequenz) Überlaufen zu lassen. Die Zeit für den Überlauf 
kann man ja vorab berechen. Und dann zähle ich im Überlauf eine Variable 
hoch. Wenn der Wert dann gleich der halben gewünschten Frequenz ist, 
wird der Port zurückgetoggelt (natürlich unter Berücksichtung des 
eingesetellen Overflow Zeitwerts).
Für weitere Ideen bin ich offen oder Tipps bin ich offen. Es geht hier 
nicht um Code, sondern lediglich um Ideen und Möglichkeiten :-)

von Karl H. (kbuchegg)


Lesenswert?

Den 16 Bit Timer durchlaufen lassen. Aus dem Messwert einen Compare 
Match Wert ausrechnen lassen (bezogen auf den Capture Wert des Timers) 
und einen Compare Match darauf ansetzen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Also den Port toggeln eine halbe Frequenz lang.
Eine Frequenz ist nicht lang oder kurz,
sie ist bestenfalls niedrig oder hoch.
Was du meinst heißt: Periodendauer.

> Für weitere Ideen bin ich offen oder Tipps bin ich offen.
Da fehlen noch ein paar Eckdaten:
CPU-Takt?
> ich messe im Moment mit ICP eine Frequenz ein.
Welche Frequenz denn? 1 Hz oder 1MHz? Von ... bis ... Hz?
Wie genau mußt du mit deinem Flankenwechsel die Mitte treffen?

von Sven Konstanz (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Den 16 Bit Timer durchlaufen lassen. Aus dem Messwert einen Compare
>
> Match Wert ausrechnen lassen (bezogen auf den Capture Wert des Timers)
>
> und einen Compare Match darauf ansetzen.

Das verstehe ich nicht ganz, aus folgendem Grund.
Wenn ein Compare Match auftritt, wird doch der Timer "genullt". Dann ist 
doch meine Frequenzmessung futsch.

Lothar Miller schrieb:
> Da fehlen noch ein paar Eckdaten:
>
> CPU-Takt?
interner Takt 8Mhz

Lothar Miller schrieb:
> Wie genau mußt du mit deinem Flankenwechsel die Mitte treffen?
Das Signal ist nicht durchgehend. Es besteht aus negativen und positiven 
Spannungspeaks und sieht wie folgt aus:

  ____--_________    _____--_________   0V
--                  --                  --

Der Abstand von negativem zu positivem Peak ist kürzer als vom positiven 
zum negativen Peak.
Der Messbereich ist recht gering von ca. 5Hz bis 250Hz. Da das Signal 
wie gesagt nicht durchgehend ist, muss es auch nicht exakt getroffen 
werden. Ich möchte nur die Peaks im positiven Spannungsbereich 
wegfiltern. Darum geht es mir. Und diese treten in jedemfall innerhalb 
einer halben Periodendauer auf (da der Abstand kürzer ist).

von Karl H. (kbuchegg)


Lesenswert?

Sven Konstanz schrieb:

> Das verstehe ich nicht ganz, aus folgendem Grund.
> Wenn ein Compare Match auftritt, wird doch der Timer "genullt". Dann ist
> doch meine Frequenzmessung futsch.

Äh. Nein

Compare Match heisst einfach nur, dass der Timer Wert in TCNT1 mit dem 
Wert in einem anderen Register übereinstimmt. Darauf kann man sich einen 
Interrupt auslösen lassen. Aber der Timer zählt weiter wie gehabt.

Was du meinst, ist der CTC Mode
"Compare Match and Timer Clear"
Das ist etwas ganz anderes. Ein eigener Modus und bei diesem Modus wird 
der Timer dann tatsächlich auf 0 gesetzt. Aber von einem anderen Timer 
Modus war ja nicht die Rede.

von Sven Konstanz (Gast)


Lesenswert?

Hallo,

ok, danke, jetzt hats geklingelt. Klar, hätte ich auch selbst drauf 
kommen können...
Muss ich nur noch berücksichtigen, wenn der Timer überlaufen würde, aber 
das lässt sich durch einen einfachen Algorithmus ja berücksichtigen...

Danke.

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.