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
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.