PIC24F Clock setzten

Gast #1743234
Lesenswert?

Hallo habe folgendes Problem:

...schreibe gerade ein ganz einfaches BSP Programm um mich am PIC 
einzuarbeiten, leider schaffe ich es nicht den Clock wie gewuenscht auf 
4MHz einzustellen...Laut Stoppwatch habe ich 120MHz...

hier mal der Code:

#include <p24fj128ga010.h>

_CONFIG1(FWDTEN_OFF & JTAGEN_OFF & WDTPS_PS1)
_CONFIG2(FNOSC_FRCDIV & POSCMOD_NONE & FCKSM_CSDCMD & OSCIOFNC_OFF & 
IESO_OFF)

void InitT1(void)
{
  T1CONbits.TCS  =  0;   // set clocksource to Fosc/2
  T1CONbits.TCKPS  =  1;  //Prescaler to 1:8
}

void pause (void)
{
  TMR1  = 0x0000;
  T1CONbits.TON=1;   //start Timer
  while(TMR1<126);
}

int main (void)
{
  CLKDIVbits.RCDIV=2;        //set clockdivider to 2-->fosc=4MHz

   TRISA  =  0x0000;    //set Pins of PORT A as outputs
  char i;

  InitT1();

  Sprungmarke:

    i=250;
    while(i)
    {
      PORTA=0x0001;
      pause();
      PORTA=0x0000;
      pause();
      i--;
    }

    i=250;
    while(i)
    {
      pause();
      pause();
      pause();
      pause();
      i--;
    }
goto Sprungmarke;

return 0;
}
Gast #1743292
Lesenswert?

...nein die Stopwatch zeigt immer 120MHz an, wie kann ich den sonst 
ueberpruefen auf welchen Wert mein Clock arbeitet?

@goto...is ne einfache methode fuer ne endlosschleife, die den Code sehr 
einfach macht
#1744087
Lesenswert?

ich kenn mich mit C18 und ein bischen mit C30 aus. wenn ich mir deine 
frage und "goto" ansehe, ich würde dir wärmstens(!) empfehlen erstmal 
mit den PIC18 zu beginnen!!!
auf die schnelle: schau dir den befehl OpenTimer1() an und nebenbei: 
ersetze dein "goto" durch ein "while(1){ }".

ps: ich würde T1CONbits.TON = 1 eher in die InitT1() befördern
Gast #1744174
Lesenswert?

@Master Showman

...warum sollte ich die T1CONbits.TON = 1  besser in die Init setzen? Da 
wird doch der Timer gestartet oder nicht?

...was is da Problem an goto? Ich weiss natuerlich wie ich es durch eine 
while(1) ersetze, finde aber den Code so um einiges uebersichtlicher...

...danke fuer den Link, werd ich gleich mal durcharbeiten...

...weiss trotzdem niemand wie ich nachsehen kann ob der Clock richtig 
gesetzt wurde?....
Gast #1744368
Lesenswert?

schau mal in mein Programm ,hab da auch ein Thema mit pic24. Meiner 
läuft aber mit intern 7,37 oder so und raus kommen 80 MHz.
Vlieleicht kapierst Du es an dem Beispiel?

(Thema vom 8.)


viel Glück ;)
#1744420
Lesenswert?

@Mr. Mister: da du den timer nie ausschaltest, genügt es, wenn du ihn 1x 
einschaltest und nicht jedesmal in deiner pause-funktion (der timer 
schaltet sich nämlich nicht von alleine aus). und wenn du ihn nur 1x 
einschalten tust, machste das besser in der init() oder zu beginn der 
main()
edit: wenn du deine conigs im MPLAB-menu definierst (nicht empfohlen), 
dann werden die configs im program-code igrnoriert. vielleicht mal da 
nachsehen ;-)
Gast #1744544
Lesenswert?

hab am anfang mal etwas versucht ueber das Menue configure-configuration 
Bits einzustellen, hab das aber wieder sein lassen und den haken bei 
Configurationbits set in code gesetzt...also sollte da alles 
ueberschrieben sein oder?

...wenn ich die stopwatch verwende zeigt er mir immer noch 120MHz an, 
und die Timerzeiten (der ja mit Fosc/2 laeuft) stimmen auch zu den 
120MHz...

hier mal der neue Code:

#include <p24fj128ga010.h>
#include "usart.h"

_CONFIG2(IESO_OFF & FNOSC_FRC & OSCIOFNC_OFF & POSCMOD_NONE)    //select 
the Fast RC Oscillator, disable primary oscillator
_CONFIG1(JTAGEN_OFF & GCP_OFF & ICS_PGx2 & FWDTEN_OFF)        //disable 
JTAG and WatchDog, no protection, EMUC/EMUD share PGC2/PGD2


void InitT1(void)
{
  T1CONbits.TCS  =  0;   //set clocksource to Fosc/2
  T1CONbits.TCKPS  =  0;  //Prescaler to 1:8
  T1CONbits.TON  =  1;   //start Timer
}

void pause (void)
{
  TMR1  = 0x0000;
  while(TMR1<0x1F4);
}

int main (void)
{  OSCCON  =  0x0000;    //set clock on FRC 8MHz

   TRISA  =  0x0000;    //set Pins of PORT A as outputs
  TRISD  =  0xFFFF;    //set Pins of PORT D as inputs

  char counter;
  counter=0;

  InitT1();
  InitUSART2();

  while(1)
  {
    PORTA=0x00;
    pause();
    PORTA=0xFF;
    pause();
    WriteIntUSART2(0xFF,255);
  }

return 0;
}

interessanterweise funktioniert meine USART Uebertragung 
tadellos...obwohl ich dort meine Baudrate mit 8MHz kalkuliert habe...
Gast #1744781
Lesenswert?

ich hab mir mal das d.-sheet angekugt.
im config wählst du frcdiv ohne pll, dann im Programm machst du 
clkdiv10-8
so das durch 2 geteilt wird und clkdic14-12 ein 1:1.

dann hast du clk 4 MHz bei 2 mips glaube ich



120 Mhz wo die herkommen weis wohl keiner auf jeden fall wenn vom Pic, 
dann schnellstens Abhilfe schafen .So nen corecap haste dran und auch an 
der spannung, dann sollte das Ding so eigentlich funzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren