#define pll_ld pinc.3
#define pll_le portc.2
#define pll_clk portc.1
#define pll_db portc.0
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uint pll_keyn, pll_keya, pll_keym = 128, pll_keyr = 5120;
// declare your global variables here
void pll_init()
{
pll_le = 0;
pll_clk = 0;
pll_db = 0;
}
void pll_set_ref()
{
uchar i;
uint t, temp;
t = 0x2000;
temp = pll_keyr;
pll_db = 1;
pll_clk = 1;
pll_clk = 0;
for (i = 0; i < 14; i++)
{
if (temp & t) pll_db = 1;
else pll_db = 0;
pll_clk = 1;
pll_clk = 0;
t = t >> 1;
}
pll_db = 1;
pll_clk = 1;
pll_clk = 0;
pll_le = 1;
pll_le = 0;
}
void pll_set_con()
{
uchar i;
uint t, temp;
t = 0x0400;
temp = pll_keyn;
for (i = 0; i < 11; i++)
{
if (temp & t) pll_db = 1;
else pll_db = 0;
pll_clk = 1;
pll_clk = 0;
t = t >> 1;
}
t = 0x0080;
temp = pll_keya;
for (i = 0; i < 8; i++)
{
if (temp & t) pll_db = 1;
else pll_db = 0;
pll_clk = 1;
pll_clk = 0;
t = t >> 1;
}
pll_db = 0;
pll_clk = 1;
pll_clk = 0;
pll_le = 1;
pll_le = 0;
}
void pll_set_freq(ulong freq)
{
pll_keyn = freq / 256;
pll_keya = (freq / 2) % 128;
pll_set_ref();
pll_set_con();
}
使用10.24mhz晶振,设置80mhz:
pll_set_freq(80000);
比较频率设为2khz,前置分频器设为128/129。
用atmega8l,1mhz内部rc时钟,于codevision环境下编译!!