Forum: Mikrocontroller und Digitale Elektronik PIC configuration words zur Laufzeit ändern


von A. S. (rava)


Lesenswert?

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?

von k.w.T. (Gast)


Lesenswert?

nimm 1 NCO.

von Teo (Gast)


Lesenswert?

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!

von A. S. (rava)


Angehängte Dateien:

Lesenswert?

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
von Teo D. (teoderix)


Lesenswert?

A. S. schrieb:
> ah okay. Denke das ist dann eher ein "nein"

Jo, schade. Pic is halt nich Pic...

von Mucky F. (Gast)


Lesenswert?

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.

von Mucky F. (Gast)


Lesenswert?

Die Frequenz am ClkOut ist dann Osc / 4

von Mucky F. (Gast)


Lesenswert?

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.

von M. Th. (Gast)


Lesenswert?

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.

von A. S. (rava)


Lesenswert?

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.

von Trixi (Gast)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Trixi (Gast)


Lesenswert?

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.

von M. Th. (Gast)


Lesenswert?

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.

von Truxi (Gast)


Lesenswert?

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.

von Mucky F. (Gast)


Lesenswert?

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?

von A. S. (rava)


Lesenswert?

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

von A. S. (rava)


Lesenswert?

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
von Mucky F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.