Forum: Mikrocontroller und Digitale Elektronik Freescale HCS12X CPU-Takt einstellen?!


von J. R. (cia_man)


Lesenswert?

Hallo!

Kann mir bitte jemand sagen, wie ich den CPU-Takt von obigem Prozessor 
nach oben/unten korrigieren kann? Benutze CodeWarrior.

Ich habe schon herausgefunden, dass ich im Handbuch auf Seite 488 
nachschauen muss.... aber mir fehlt einfach ein konkretes Beispiel....

Also vielleicht kann mir jemand von euch behilflich sein!


Handbuch ist hier der Link:

http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S12XEP100RMV1.pdf


Danke euch schon einmal!

von Joerg W. (joergwolfram)


Lesenswert?

Etwas nach oben/unten korrigieren ist nicht so einfach, da kann man nur 
nach der Formel gehen und die Werte aus Oszillatorclock und gewünschtem 
Busclock ermitteln. Ab Zeile 475 sind die dazu notwendigen Register 
beschrieben.

Beispiel: 12MHz Quarz, 50MHz Bustakt:

-> CKSEL.7 muss gesetzt sein (F_bus=F_pll/2)

Wir brauchen 100MHz PLL-Clock, da der VCO von 32...120MHz geht, muss 
PLLCLK = VCOCLK sein.

-> POSTDIV = $00

Referenzfrequenz auf z.B. 2 MHZ festlegen ergibt einen Wert von 5 für 
REFDIV und 00 für REFFRQ.

-> REFDIV = $05

Multiplikation mit 50, (100 MHz / 2 MHz), 11 für VCOFRQ

-> SYNR = 49 + 192 = 241 = $F1

Mit SYNR kann man jetzt die Frequenz in 2MHz Schritten ändern.

Gruß Jörg

von J. R. (cia_man)


Lesenswert?

Das heißt also, ich muss auch einen neuen Quarz erst einmal auf mein 
Evaluation Board machen?

Oder wie ist das damit? Board: DEMOS12XEP100

von Joerg W. (joergwolfram)


Lesenswert?

Das mit den 12MHz war nur ein Beispiel von einem eigenen Projekt. Du 
kannst auch schauen, was für ein Quarz drauf ist und hier posten. Dann 
lässt sich das auch äquivalent mit der anderen Frequenz machen. Bei 8MHz 
braucht man nur REFDIV von $05 auf $03 ändern.

Gruß Jörg

von J. R. (cia_man)


Lesenswert?

Ich habe einen 4 MHz Quarz! 4.000C06.

Kannst du mir dafür die Settings sagen und es auch noch etwas erklären? 
Wäre echt nett ;-)

Will maximale CPU-Frequenz!

von Joerg W. (joergwolfram)


Lesenswert?

-> POSTDIV = $00 (wie gehabt)
-> REFDIV = $01 ([4/2]-1)
-> SYNR = 49 + 192 = 241 = $F1

damit sollte der Bustakt 50MHz sein. Mit

-> SYNR = 63 + 192 = 255 = $FF

(die 192 kommen von VCOFRQ=11)

sollte der Baustein auch mit 64 MHz Bustakt ohne Probleme laufen, was 
allerdings ausserhalb der Spezifikation ist.

Gruß Jörg

von J. R. (cia_man)


Lesenswert?

Okay super!!! Das hilft mir erst einmal sehr viel!!! Danke dir....

von J. R. (cia_man)


Angehängte Dateien:

Lesenswert?

Habe nun einmal am Anfang meines main-Programms folgende Zeilen 
eingebaut:
1
  CKSEL.7 = 1;
2
  POSTDIV = 0;
3
  REFDIV = 1;
4
  SYNR = 241;

Bekomme aber nun aufgrund falscher Befehle mehrere Fehler 
gemeldet....???

Könnt ihr mir da nochmal helfen?

Fehler als Screenshot angehängt....

Danke!

von Kai B. (kaib) Benutzerseite


Lesenswert?

Habe hier mal einen Auszug von der Initialisierung die wir hier mit 
einem 4MHz Resonator nutzen. PLL Takt ist 100MHz und Bustakt somit 50MHz
1
CLKSEL =0;          /* Select clock source from XTAL and set bits in CLKSEL reg. */ 
2
PLLCTL = 129;       /* Disable the PLL */ 
3
SYNR = 88;          /* Set the multiplier register */ 
4
5
REFDV = 1;
6
POSTDIV = 0;            /* Set the post divider register */ 
7
PLLCTL = 193;
8
while(!CRGFLG_LOCK) {   /* Wait until the PLL is within the desired tolerance of the target frequency */
9
}
10
CLKSEL = 128;           /* Select clock source from PLL */

Wenn du mit dem Codewarrior arbeitest such am besten mal nach einer 
mc9s12xeq384.h oder in deinem Fall xep100 da dort die ganzen Register 
defines drin stehen.

MfG Kai

von J. R. (cia_man)


Lesenswert?

Ich bekomme bei folgenden Zeilen immer noch eine komische Fehlermeldung 
mit der ich nichts anfangen kann...?!

1
int main(void) {
2
  /* put your own code here */
3
  
4
  
5
  CLKSEL =0;          /* Select clock source from XTAL and set bits in CLKSEL reg. */ 
6
  PLLCTL = 129;       /* Disable the PLL */ 
7
  SYNR = 88;          /* Set the multiplier register */ 
8
9
  REFDV = 1;
10
  POSTDIV = 0;            /* Set the post divider register */ 
11
  PLLCTL = 193;
12
  while(!CRGFLG_LOCK);    /* Wait until the PLL is within the desired tolerance of the target frequency */
13
   
14
  CLKSEL = 128;           /* Select clock source from PLL */ 
15
16
17
 
18
  int i = 1; /* for while loop */
19
  int GradZaehler = 0;

Und zwar sagt er, dass bei int i = 1;

diese Klammer fehlt '}'

Keine Ahnung warum??? :(


Bei den Zeilen oben handelt es sich "nur" um einen Programmausschnitt!!!

von Kai B. (kaib) Benutzerseite


Lesenswert?

Das liegt daran weil der Code oberhalb des int i Zeug steht was der 
Codewarrior nicht mag.
Das Variablen Graffel muss immer am Anfang der Funktion stehen.

von J. R. (cia_man)


Lesenswert?

Kai B. schrieb:
> Das liegt daran weil der Code oberhalb des int i Zeug steht was der
> Codewarrior nicht mag.
> Das Variablen Graffel muss immer am Anfang der Funktion stehen.

Richtig!!!! Danke!!! Gelöst!!! ;-)

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.