Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung, Counter auslesen, Interrupts


von Rainer (Gast)


Lesenswert?

Hallo Zusammen,

ich weiss, Frequenzmessung ist ein alter Schuh, aber konkrete Hilfe habe 
ich in den anderen Beiträgen nicht finden können.

Ich arbeite mit einem MCU der HCS08 Familie. Es gibt zwei Timer Module 
und ein ICG (integrated clock generator). Letztere hat einen externen 
Quartz (mit 8MHz) angeschlossen, der gebraucht wird, um die 3MHz 
Frequenz besser zu messen.

Die Idee der Messung ist auch nicht neu, Torzeit vom Quartz vorgeben 
lassen und mit dem Counter des Timer Moduls, die Anzahl der Pulse 
auslesen/ausgeben.
1. Problem: Es gibt ein High und ein Low Register aus welchem man die 
Counts liest (beide 8Bit). Angenommen er zählt bis 1, steht die dann im 
High oder Low Register? Anders gefragt: In welchem fängt er an zu 
zählen? Und wenn ich den gesamten Wert auslesen möchte, muss ich beide 
Register erst einmal in einem Array zusammenfügen, um auf die Zahl als 
ein ganzes zugreifen zu können?

2. Problem: Momentan habe ich es so eingestellt, dass der ext. 
Oszillator die Busfreq. vorgibt. Mein Plan war damit Interrupts zu 
umgehen, sodass ich bei der Frequenzmessung mittels C (timer.h) einfach 
in regelmäßigen Abständen den Counter abfrage und resette. Eine 
ausgelastete CPU soll später aber nicht die Messung verfälschen. Wie 
kann ich einstellen, dass die externe 8MHz Clock mir im Takt von 2-10 
Sekunden einen Interrupt gibt, der wiederum dem Counter sagt, dass er 
mit zählen beginnen und aufhören soll?

Ich weiss, dass ist jetzt schon eine ganze Stange an Fragen, aber ich 
bin für eure Hilfe sehr dankbar. Anbei noch gefragt: bei der 
Initalisierung der Register gibt es neben den Werten "1" und "0" auch 
noch ein "X" über dessen Bedeutung ich mir nicht im Klaren bin 
(egal?unbelegt?).

von Karl H. (kbuchegg)


Lesenswert?

Rainer schrieb:

> Ich arbeite mit einem MCU der HCS08 Familie.

Ich kenne die CPU nicht, daher fallen die Antworten sehr allgemein aus.

> 1. Problem: Es gibt ein High und ein Low Register aus welchem man die
> Counts liest (beide 8Bit). Angenommen er zählt bis 1, steht die dann im
> High oder Low Register?

Warum wohl heißt das eine High und das andere Low?
Warum probierst du es nicht einfach aus? Gib händisch ein Signal an den 
Eingang und sieh nach, welches Register gezählt hat

(im Low. Low wie Low-byte also das niederwertige Byte)

> zählen? Und wenn ich den gesamten Wert auslesen möchte, muss ich beide
> Register erst einmal in einem Array zusammenfügen,

Wozu ein Array?

> um auf die Zahl als
> ein ganzes zugreifen zu können?

   Zahl = 256 * High + Low;

> Oszillator die Busfreq. vorgibt. Mein Plan war damit Interrupts zu
> umgehen, sodass ich bei der Frequenzmessung mittels C (timer.h) einfach
> in regelmäßigen Abständen

Wo nimmst du die regelmässigen Abstände her und wie stellst du sicher, 
dass die auch wirklich regelmässig sind?
Am einfachsten macht man das, wenn es die Hardware machen kann. Also 
regelmässig einen Interrupt auslösen lassen. Das geht dann normalerweise 
fast auf den Prozessortakt genau.

> Wie
> kann ich einstellen, dass die externe 8MHz Clock mir im Takt von 2-10
> Sekunden einen Interrupt gibt, der wiederum dem Counter sagt, dass er
> mit zählen beginnen und aufhören soll?

Dazu kann ich nichts sagen.
Aber das Datenblatt deiner CPU weiß da mehr.

> bin für eure Hilfe sehr dankbar. Anbei noch gefragt: bei der
> Initalisierung der Register gibt es neben den Werten "1" und "0" auch
> noch ein "X" über dessen Bedeutung ich mir nicht im Klaren bin
> (egal?unbelegt?).

X steht normalerweise für "egal, spiel keine Rolle".
Am besten einfach in Ruhe lassen.

von Rainer (Gast)


Lesenswert?

Okay, danke schonmal. Wahrscheinlich verstehe ich prinzipiell nicht wie 
der Counter seine Daten ablegt. Leider habe ich das Gerät auch nur 
selten in der Hand, deshalb diese theoretische Fragerei.

Bitte korrigiert mich:
Ich dachte, dass Gerät soll bis 2^16 zählen können und weil dazu eine 
8bit Struktur nicht ausreicht, müssen halt zwei Register verwendet 
werden. Dann würden für Zahlen, die sich mit 8bits darstellen lassen, 
dass Low-Register reichen und im High stünden nur Nullen.
Dann wiederum müsste ich aber für sehr große Zahlen die Register 
zusammenfügen, um die komplette Zahl auszulesen oder nicht?

Ausserdem, was das "in Ruhe lassen" der Bits angeht die mit "X" für 
meine Einstellung vermerkt sind: ich bin mir nicht sicher wie man nur 
bestimmte Bits schreibt und andere gar nicht anrührt. Bisher habe ich 
einfach meine 8bit Konfiguration als Hexadezimalzahl übergeben, da kann 
man schlecht nen Bit auslassen.

Ihr merkt vielleicht schon, dass es noch an einfachen Dingen hackt, 
umsomehr würde ich mich über eure Hilfe freuen, denn so etwas steht 
nicht im Manual...

Danke!

von Karl H. (kbuchegg)


Lesenswert?

Rainer schrieb:

> Bitte korrigiert mich:
> Ich dachte, dass Gerät soll bis 2^16 zählen können und weil dazu eine
> 8bit Struktur nicht ausreicht, müssen halt zwei Register verwendet
> werden.

Yep

> Dann würden für Zahlen, die sich mit 8bits darstellen lassen,
> dass Low-Register reichen und im High stünden nur Nullen.

Auch richtig

> Dann wiederum müsste ich aber für sehr große Zahlen die Register
> zusammenfügen, um die komplette Zahl auszulesen oder nicht?

Auch das ist richtig.

Aber dazu brauchst du kein Array.

Ein Beispiel.
Dein Kumpel Herbert kann von 0 bis 9 zählen. (Er ist das 'Low Byte')
Dein Kumpel Andreas kann ebenfalls von 0 bis 9 zählen. (Er ist das 'High 
Byte')

Das ganze ist so angeordnet, dass Herbert grundsätzlich Impulse zählt. 
Und jedesmal wenn er bei 9 angelangt ist und wieder bei 0 anfängt, sagt 
er Andreas, dass er um 1 weiter zählen soll.

Soweit so gut.
Du möchtest jetzt wissen, wie weit die beiden im Verbund gezählt haben.
Also fragst du Herbert wie weit er gekommen ist. Herbert sagt 5. Du 
fragst Andreas wie weit er gekommen ist und der sagt 3.
Und dann rechnest du:  3 * 10 + 5 = 35
Gemeinsam haben Herbert und Andreas also 35 Impulse gezählt, obwohl 
jeder nur von 0 bis 9 zählen kann. Herbert hat die Einer gezählt und 
Andreas die Zehner (aber das wussten die beiden nicht).

Dein Low bzw. High Byte im Prozessor kann nicht von 0 bis 9 zählen 
sondern von 0 bis 255. Aber das Prinzip ist dasselbe. Und stör dich 
nicht an der Multiplikation. Dein Compiler ist schlauer als du denkst. 
Für Multiplikationen mit 2-er Potenzen hat der ein paar Tricks auf Lager 
um das schnell abzuwickeln.

>
> Ausserdem, was das "in Ruhe lassen" der Bits angeht die mit "X" für
> meine Einstellung vermerkt sind: ich bin mir nicht sicher wie man nur
> bestimmte Bits schreibt und andere gar nicht anrührt. Bisher habe ich
> einfach meine 8bit Konfiguration als Hexadezimalzahl übergeben, da kann
> man schlecht nen Bit auslassen.

Man kann aber vorher das Register abfragen, mittels Bitoperationen (UND 
und ODER) die Bits beeinflussen die man haben möchte und dann das 
Ergebnis wieder in das Register zurückschreiben. Voila: Nur die Bits die 
einen interessieren haben den Wert geändert, alle anderen bleiben so wie 
sie vorher waren.

http://www.mikrocontroller.net/articles/Bitmanipulation

von Rainer (Gast)


Lesenswert?

Vielen Dank für die ausführlicher Erklärung!

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.