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)
	{
	}
}

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.

Uz to mam potvrdene aj z inych zdrojov - Keil simulator ma chybu (toto je len jedna z viacerych).