In meinem PIC wird die Ausgabe des Systemtakts auf den CLKOUT-pin nicht mit einem Register aktiviert, sondern über ein #pragma config bit. Kann ich diese Taktausgabe zur Laufzeit umschalten? Ich nehme an, nein. Warum ist das der Fall? Am Ende des Tages steuert man ja nur einen Analogschalter vor dem pin an, also könnte man die Taktausgabe auch über ein normales Register gesteuert werden, oder nicht? Hintergrund: da meine diskreten RC-Schmitt-Trigger-Oszillatoren nicht sehr gut einstellbar sind und für kleine R-Werte auch mal gerne stehen bleiben, wollte ich einen µC-gesteuerten Oszillator bauen, der über weite Frequenzbereiche schmerzfrei läuft. Anwendungsbereiche sind: Lastsprünge generieren, Piezos testen, Taktsignale generieren, ... Ich hatte den PIC12F1840 da und mittels Timer bin ich auf eine Frequenz von etwa 100kHz gekommen. Höhere Frequenzen habe ich mir vom CLKOUT-Mechanismus bei einstellbarerm FOSC-prescaler erhofft. Aber so wie es aussieht, muss ich zwei pins vorsehen. Einen schnellen und einer software-gesteuerten, oder?
A. S. schrieb: > Kann ich diese Taktausgabe zur Laufzeit umschalten? Ich nehme an, nein. Ja, ist aber dem Schreiben ins Flash ähnlich. Einfach im Dabla unter ConfigBits nachsehen!
Teo schrieb: > Ja, ist aber dem Schreiben ins Flash ähnlich. > Einfach im Dabla unter ConfigBits nachsehen! ah okay. Denke das ist dann eher ein "nein" der clock output wird über config word 1 gesteuert.
:
Bearbeitet durch User
A. S. schrieb: > µC-gesteuerten Oszillator bauen, > Ich hatte den PIC12F1840 da Lässt sich nicht per SW an und abschalten, aber die Freqeunz kannst du ändern. 5.6 Oscillator Control Registers IRCF<3:0>: Internal Oscillator Frequency Select bits 000x = 31 kHz LF 0010 = 31.25 kHz MF 0011 = 31.25 kHz HF(1) 0100 = 62.5 kHz MF 0101 = 125 kHz MF 0110 = 250 kHz MF 0111 = 500 kHz MF (default upon Reset) 1000 = 125 kHz HF(1) 1001 = 250 kHz HF(1) 1010 = 500 kHz HF(1) 1011 = 1 MHz HF 1100 = 2 MHz HF 1101 = 4 MHz HF 1110 = 8 MHz or 32 MHz HF(see Section 5.2.2.1 “HFINTOSC”) 1111 = 16 MHz HF Tunen geht auch REGISTER 5-3: OSCTUNE: OSCILLATOR TUNING REGISTER bit 7-6 Unimplemented: Read as ‘0’ bit 5-0 TUN<5:0>: Frequency Tuning bits 011111 = Maximum frequency 011110 = • • • 000001 = 000000 = Oscillator module is running at the factory-calibrated frequency. 111111 = • • • 100000 = Minimum frequency Gibt auch irgendwo ne Appnote um mittels externem Takt abzugleichen.
Einzelimpulse lassen sich dann über den internen analogen Comparator erzeugen. Clkout auf einen Eingang vom Comparator brücken und der andere über Software und oder Timer steuern.
Ich würde das Capture/Compare Modul im Compare Mode nehmen (DaBla Seite 192 Fig.24-2) mit Tmr1 (16Bit) als Zeitbasis. Dazu würde ich die höchste, mir passende Frequenz (FOSC) im Configuration Word einstellen. Man kann dann im Tmr1 FOSC, FOSC/4 oder den 31khz Osc als Takt wählen sowie auch den Prescaler (1/1, 1/2, 1/4,1/8) nutzen. Man kann anschliessend in den Registern CCPR1H u. CCPR1L den ZählWert vorgeben u. wenn Tmr1 (zählt von 0 an aufwärts) den Wert erreicht erzeugt das Modul einen Match-Pulse. Wenn man zusätzlich den Compare Mode im Toggle Mode betreibt erhält man die 1/2 Frequenz am Pin CCP1 mit 50% Duty Cycle. Und wenn nötig kann man immer noch mit dem OSCTUN Register ein Finetuning der Frequenz vornehmen. Übrigens, mit dem OSCTUN Register kann man die FOSC Frequenz um +/- 12% verstellen. Aber Vorsicht, alle programmierten Zeitschleifen ändern sich dann auch.
Mucky F. schrieb: > Lässt sich nicht per SW an und abschalten, aber die Freqeunz kannst du > ändern. jupp, das ist mir bekannt. Leider geht das nicht runter bis unter 8kHz, wie man deiner Tabelle entnehmen kann. Ich denke, ich werde einen zweiten Pin verwenden und langsamere Signale da per software ausgeben. Mucky F. schrieb: > internen analogen Comparator Im MCC sieht das nicht so aus als könnte man die Eingänge auf ein digitales Signal oder ein Register klemmen. M. Th. schrieb: > Capture/Compare Modul im Compare Mode nehmen (DaBla Seite > 192 Fig.24-2) mit Tmr1 (16Bit) als Zeitbasis. hab ich zuerst auch versucht. Das Problem ist, dass man die Periode von TMR1 nicht über ein Register steuern kann (das geht nur bei TMR2, hier gibt es ein PR2 register). Also hat man wieder nur die CPU-Frequenz um die periode einzustellen. Oder man verwendet den timer interrupt in jedem Zyklus um den Timer zu resetten. Das ist übrigens der code, den MCC automatisch generiert - es legt eine timer1ReloadVal an und lädt das nach jedem interrupt in TMR1H/L. Aber das braucht Zeit und bei 32MHz bin ich wie gesagt nicht signifikant über 100kHz am Ausgangspin gekommen.
A. S. schrieb: > Ich hatte den PIC12F1840 da und mittels Timer bin ich auf eine Frequenz > von etwa 100kHz gekommen. Höhere Frequenzen habe ich mir vom > CLKOUT-Mechanismus bei einstellbarerm FOSC-prescaler erhofft. nimm einen schnelleren PIC ...
A. S. schrieb: > Kann ich diese Taktausgabe zur Laufzeit umschalten? Ich nehme an, nein. > > Warum ist das der Fall? Weil dieses Konfigurationsregister außerhalb des adressierbaren Bereiches existiert. Es gibt nur eine Konvention, es an eine bestimmte Adresse eines theoretischen größeren Code- (Flash-) Bereiches zu setzen. Tatsächlich ist es jedoch programtechnisch unerreichbar. Man könnte es mit dem flapsigen Spruch "im Himmel ist Jahrmarkt" vergleichen. Die Frage nach der Adresse ist da auch sinnlos. W.S.
Trixi schrieb: > nimm einen schnelleren PIC ... Komische Einstellung. Ich hätte da eher "schreib es in Assembler" erwartet. Immerhin ist die Befehlsfrequenz 8 MHz bei 32 MHz Quarztakt und das bedeutet so etwa 80 Befehle/Periode eines 100 kHz Signals. W.S.
W.S. schrieb: > Ich hätte da eher "schreib es in Assembler" erwartet Das hatte ich schon mal vorausgesetzt, habe deswegen auch nicht nachgerechnet. PWM bzw EUSART wäre auch noch eine schnelle Option. Habe mal gerade nachgeschaut, 8-Pinner gibt nur bis 32 MHz.
Hallo A. S. (Rava), wenn ich Deine Eingangsfrage richtig verstanden habe dann waren einstellbare Frequenzen mit einem PIC gefordert die mit Deinen RC Oscillatoren nicht stabil liefen. Deshalb bezog sich meine Lösung auch nur auf einstellbare Frequenzen. Von einstellbaren Pulsbreiten habe ich nichts gelesen. Vielleicht findest Du doch noch eine Lösung mit dem freien SR Latch und einem zweiten Timer (z. B. Tmr0) für die Pulsbreite. Ich bin ab hier raus. Gruss M. Th.
M. Th. schrieb: > Von einstellbaren Pulsbreiten habe ich nichts gelesen. Du gibst einen Puls mit 50 % DC aus dem PWM-Modul aus und variierst den OSC bzw. den Teiler.
A. S. schrieb: > jupp, das ist mir bekannt. Leider geht das nicht runter bis unter 8kHz, > wie man deiner Tabelle entnehmen kann Warum geht bei den Frequenzen kein umschalten auf einen Timer?
Mucky F. schrieb: > Warum geht bei den Frequenzen kein umschalten auf einen Timer? das geht. Und daher meine ursprüngliche Frage: Kann ich das Ergebnis auf demselben pin ausgeben. Antwort: leider nicht. M. Th. schrieb: > Von einstellbaren Pulsbreiten habe ich nichts gelesen. tja, das muss ein recht frisches Missverständnis sein. Ein duty cycle von 50% ist super. Aber je freier man die Frequenz wählen kann, umso besser. Und dafür wäre ein Timer mit Period register super. Aber der einzige Timer, der das hat (TMR2) lässt sich nicht als Quelle für ECCP wählen. Vermutlich weil niemand daran gedacht hätte, dass ECCP für etwas anderes benutzt wird als eine klassische PWM mit fixer oder vergleichsweise niedriger Frequenz
okay, kleines update. Ich habe es tatsächlich mit einer einer PWM hinbekommen. Mein Ursprünglicher Ansatz war, den compare-mode zu verwenden, um einen pin zu triggern. Das geht nur mit timer 1, der keine variablen perioden in hardware zulässt. Allerdings funktioniert der EPWM Modus hervorragend. Der greift netterweise auf timer2 zu und so kann ich das PR2 register zum Einstellen der Periode verwenden. Der Grund warum ich das nicht gleich versucht habe: habe ich, aber das Microchip tool in MPLAB zur Konfiguration verrechnet sich, soweit ich das beurteilen kann, und man muss einige Einstellungen per Hand vornehmen.
:
Bearbeitet durch User
A. S. schrieb: > Kann ich das Ergebnis auf demselben pin ausgeben über den Comparator könnte das funzen, must du dann extern brücken. Ist aber nur ne Idee.
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.