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:
-
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í.
-
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)
{
}
}