MC9S08QE128 internal clock

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

MC9S08QE128 internal clock

2,187件の閲覧回数
MicMoba
Contributor V
Hello,
last week I got the new chip (MC9S08WE128). The datasheet says that the internal clock can be configured up to 20MHz.

So I set up the ICS and toggle a port but I can only measure 2MHz. Why?

Has anybody a explanation?


#include <hidef.h>                        /* for EnableInterrupts macro */
#include "derivative.h"                   /* include peripheral declarations */
#include "DEMOQE128_Quick_Start.h"        /* include variable declarations */

#define clrSetReg8Bits(RegName, ClrMask, SetMask)  (RegName = (RegName & (~(byte)(ClrMask))) | (byte)(SetMask))
#define setReg8(RegName, val)                      (RegName = (byte)(val))


void InitSystems() {
 
  SOPT1  = 0x23;                          // Disable COP,RSTO, enable STOP,BKGD,RESET
  SOPT2  = 0x00;                          // SPI1 on PTB2/3/4/5, IIC1 on PTA2/3
  SPMSC1 = 0x00;                          // Disable LVD
  SPMSC2 = 0x00;                          // Disable power-down modes
  SPMSC3 = 0x00;                          // Disable LVWIE, low trip points
  SCGC1  = 0xFF;                          // Enable bus clock to peripherals
  SCGC2  = 0xFF;                          // Enable bus clock to peripherals
  
  /*  System clock initialization */
  /* ICSC1: CLKS=0,RDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
  setReg8(ICSC1, 0x06);                /* Initialization of the ICS control register 1 */
  /* ICSC2: BDIV=0,RANGE=0,HGO=0,LP=0,EREFS=0,ERCLKEN=0,EREFSTEN=0 */
  setReg8(ICSC2, 0x00);                /* Initialization of the ICS control register 2 */
  while(!ICSSC_IREFST) {               /* Wait until the source of reference clock is internal clock */
  }
  /* ICSSC: DRST_DRS=2,DMX32=1 */
  ICSSC = 0xA1;
} // end InitSystems


/************************
   Main Program Loop
************************/
void main(void) {

 
  InitSystems();

  PTCD_PTCD0   = 0;
  PTCDD_PTCDD0 = 1;                  // Turn ON PTC0 LED

  while(1)
  {
        PTCTOG_PTCTOG0   = 1;
  }
}


Best regards

Michael
ラベル(1)
0 件の賞賛
返信
3 返答(返信)

921件の閲覧回数
bigmac
Specialist III
Hello Michael,
 
It would appear that each pass through the while loop takes 5 bus cycles to complete, and for each output cycle there needs to be two passes through the loop.  To verify this, you will need to examine the assembly code generated during compile, and then consider the number of cycles required by each assembly instruction.
 
Regards,
Mac
 
 
 
0 件の賞賛
返信

921件の閲覧回数
Ake
Contributor III
Hi,
If you measure the speed of something, it is convienent to use 
for (;:smileywink:
  {
        PTCD_PTCD0 = 1;//5 cycles
        PTCD_PTCD0 = 0; //5 cycles
  } //3 cycles
 
The  PTCD_PTCD0 instruction is translated to
bset         PTCD_PTCD0,PTCD //5 clocks

That makes 13 cycles. If your code runs at 2 MHz, * 13 = 26 MHz.
Thats not bad!
(I tried it on your software.)
 
Regards,
Ake
0 件の賞賛
返信

921件の閲覧回数
MicMoba
Contributor V
Hello Marc,
thank you for answer. I calculate the cycles and then I get the result of 2MHz.

Is there a way to measure the internal clock frequenzy?

Submit Post
0 件の賞賛
返信