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