C8051F350 rychlost interneho oscilatora ???

Zdravím vás,
ak sa tu nájde niekto, kto má skúsenosť so Silabmi, tak riešim nasledovnú nezrovnalosť:

C8051F350 datasheet deklaruje nasledovné:

avšak podľa mojich reálnych meraní to je 12 MHz.

Spravil som dva pokusy:

  1.   Test 1 – zmena stavu portu každých 12 strojových cyklov. Ak je f oscilátora 12 MHz, tak každý stav bude trvať 1μs. Ak je f oscilátora 24,5 MHz, tak každý stav bude trvať 0,49μs
    

Výsledok testu 1 = 1μs. Overené v simulátore aj osciloskopom na reálnom zariadení.

  1.   Test 2 – Timer 2 použitý na overenie testu 1. Zmena stavu portu vždy po pretečení timera.
    

Celkovo 65553 strojových cyklov. Pri f = 12 MHz každý stav bude trvať 5,46ms, ak f = 24,5 MHz tak 2,68ms
Výsledok testu 2 = 5,46ms.

Tak ako je to s tým oscilátorom? Niečo som zle pochopil, alebo mám niečo zle nastavené?

Ďakujem za odpoveď, každá rada dobrá

#include <c8051F350.h>

/*Internal Oscillator: 24.5 MHz with ± 2% accuracy*/

sbit LED = P0^0;

void main(void)
{
	int i;
	PCA0MD  &= ~0x40;   
	
/*------ O S C ------ */
	OSCICN	=	0x83;    		//10000011 Internal Oscillator Enabled / SYSCLK derived from Internal Oscillator divided by 1
	CLKSEL	=	0x00;       		// Internal Oscillator 

/*----- P O R T -----*/
	P0MDIN	=	0xFF;				//P0.0 - P0.7 = digital
	P0MDOUT	=	0xFF;				//P0.0 - P0.7 = output
	XBR1	|=	0x40;				//crossbar on, pull-up on

/*-- T I M E R  2 --*/
 	CKCON	|=	0x30;				//Timer 2 high byte uses the system clock / Timer 2 low byte uses the system clock
	TMR2CN	=	0x00;				//Timer 2 operates in 16-bit auto-reload mode / Timer 2 disabled
  TMR2RLL	=	0x00;
	TMR2RLH	=	0x00;				//L-H reload value = 0
	TMR2L	=	TMR2RLL;
	TMR2H	=	TMR2RLH;			//L-H start value = 0
	


/*----------- Test 01 ----------------
			celkovo 12 strojovych cyklov
				medzi impulzami
------------------------------------*/
	for(i=0; i<20; i++)
	{
		LED = ~LED;
	}

	
/*----------- Test 02 ----------------
			celkovo 65553 strojovych cyklov
				medzi impulzami
------------------------------------*/
	for(i=0; i<20; i++)
	{
		TR2	=	1;				//Start Timer 2
		while(!TF2H);			//cakaj 65536 inkrementacii timera
		TR2 = 0; 				//Stop Timer 2
		LED = ~LED;				//P0.0 = ~P0.0
		TF2H = 0;
	}

	while(1)
	{
	}
}

C8051F350.png

Dělal jsem nějakou dobu na C8051F500 a to je nemlich to samé, akorát umí chodit vejš. Jeho interní osc jsem ovšem nikdy nepoužil, vždy jen s krystalem. Rychlá kontrola mi nic neprozradila. Zkus použít ten jejich konfigurační wizzard jestli něco nenastaví jinak. V jakém prostředí to píšeš/překládáš/simuluješ ?

Jo tak koukam, ze chodi taky do 50MHz… akorat ta 500 ma interni osc 24.0MHz a 350 ma 24.5MHz - takovy divny.

Pouzivam KeiluVision 5 a momentalne som sa dostal (s inym programom) do stavu ze na realnom zariadeni to uz bezi podla ocakavania na 24,5 Mhz, hoci v Keil simulatore je stale vsetko pocitane s frekvenciou 12Mhz (dokonca aj UART baudrate).
Rozdiel v nastaveniach v novom programe velmi nevidim takze moznosti su momentalne dve:

  1. od zaciatku to slo zle iba v simulatore a pokaslal som to pocas merania osciloskopom
  2. alebo problem ostava nadalej zahadou

Budem to este detailnejsie investigovat ked urobim poriadok v novom kode, aby som sa v nom ja sam vyznal a vysledok vysetrovania budem zdielat tu.

Taky dělám v keilu a někdy je trochu těžší ho donutit aby to právě počítal podle správné frekvence. CPU core simuluje co se týče trvání instrukcí dobře. Takže typuju variantu 1.