7.3.7. Примеры программирования ICG

(Руководство разработчика по микроконтроллерам семейства HCS08)

Пример 7.4 представляет работу модуля ICG в режиме FEI, т.е. при тактировании от встроенного генератора. Пример ориентирован для отладки на плате DEMO9S08LC60. Светодиоды LED401 и LED405 мигают с частотой, определяемой частотой внутренней шины BUSCLK, которая сначала равна 20МГц.

Модуль ICG настроен на работу от внутреннего генератора 243кГц, при N = 19, P = 64 и R = 1 модуль ICG генерирует выходной сигнал с частотой 40МГц, что соответствует BUSCLK = 20МГц.

При нажатии на кнопку SW304 коэффициент N уменьшается, и светодиоды мигают реже. Наоборот, при нажатии на кнопку SW305 коэффициент N увеличивается, и светодиоды мигают чаще.

Пример 7.4. Инициализация модуля ICG на режим FEI

//ДемонстрационнаяплатаDEMO9S08LC60,режимFEI,частотаBUSCLK=20МГц
//СветодиодLD401соединенсPTB3,LD402сPTB4,LD403сPTB5,
//LD404сPTB6,LD405сPTB7,LD406сPTA5,
//кнопкаSW305подключенакPTC7,SW304кPTC5
//SW303кPTC4,SW302кPTC3
#include/*forEnableInterruptsmacro*/
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"/*Этонашфайлсобъявлениями!*/
#defineLD401BIT_3//PTB3
#defineLD402BIT_4//PTB4
#defineLD403BIT_5//PTB5
#defineLD404BIT_6//PTB6
#defineLD405BIT_7//PTB7
#defineLD406PTAD_PTAD5//PTA5
unsignedcharmy_mfd;
//ПрерыванияотмодуляICG(пофлагамLOLSиLOCS)
voidinterruptVectorNumber_Vicgicg_isr(void)
{
ICGS1_ICGIF=1;//СброситьфлагпрерыванияотICG
//что-тоделается...
LD406=1;//ВключитьсветодиодLD406
}
//ПрерыванияпоKBI(обслуживаетнажатыекнопкиSW305иSW304)
voidinterruptVectorNumber_Vkeyboard2kbi2_isr(void)
{
KBI2SC_KBACK=1;//СброситьфлагзапросаотKBI
if(!PTCD_PTCD7)
{
//ЕслиSW305нажата,тоувеличитьMFD(BUSCLKрастет)
my_mfd++;
if(my_mfd>7)my_mfd=7;//ОграничитьMFD=7(N=18)
}
if(!PTCD_PTCD5)
{
//ЕслиSW304нажата,тоуменьшитьMFD(BUSCLKуменьшается)
if(my_mfd)my_mfd--;//MFDнеменьше0
}
ICGC2=my_mfd<<4;//ИзменитьMFD
}
//Программнаязадержка
voiddelay(unsignedintvalue)
{
for(;value;value--);
}
voidmain(void)
{
SOPT1=bBKGDPE;//РазрешитьработулинииBKGDврежимеотладкиBDM
//КонфигурацияICG:
ICGTRM=NVICGTRM;//Переписатьподстроечноечисло
ICGC2=MFDx18;//MFD=111b(N=18)
ICGC1=ICG_FEI;//ICGврежимеFEI(CLKS=01b)
//Конфигурацияпортовввода/вывода:
PTCPE=BIT_7|BIT_5;//РазрешитьподтягивающиерезисторынаPTC7иPTC5
PTBDD=0xFF;//PTB0...PTB7навывод
PTBD=0;//ВыключитьLD401...LD405
PTADD=BIT_5;//PTA5навывод
//КонфигурацияKBI2:
KBI2SC=bKBIE;//РазрешитьпрерываниепоKBI2
KBI2PE=BIT_7|BIT_6;//РазрешитьKBIнавходахPTC7иPTC5
my_mfd=7;//MFD=18
EnableInterrupts;//Разрешитьпрерывания
while(1)
{
PTBD=LD401;//LD401включить
delay(30000);//Задержка
PTBD=LD402;//LD402включить
delay(30000);//Задержка
PTBD=LD403;//LD403включить
delay(30000);//Задержка
PTBD=LD404;//LD404включить
delay(30000);//Задержка
PTBD=LD405;//LD405включить
delay(30000);//Задержка
}
}

В следующем примере реализуем аналогичную Примеру 7.4 задачу для отладочной платы DEMO9S08AW60E. Поскольку ее схемотехника несколько отличается, то необходимо сменить управление светодиодами. Кроме того, светодиод LED7 будет использован для отображения значения бита LOLS.

Приложение Примера 7.5 начинает работу в режиме FEE при тактировании от внешнего кварцевого резонатора с частотой 4МГц. Устанавливаем N = 10, R = 1, получаем BUSCLK = 20МГц (ICGOUT = 4МГц*10/1 = 40МГц).

Каждое нажатие кнопки SW уменьшает коэффициент MFD с 3 до 0. В результате, минимальная частота BUSCLK = 8МГц (ICGOUT = 4МГц*4/1 = 16МГц).

Пример 7.5. Инициализация модуля ICG на режим FEE

//ДемонстрационнаяплатаDEMO9S08AW60E,режимFEE,частотакварцевогорезонатора
//4МГц,частотаBUSCLK=20МГц
//КнопкаSW1соединенасPTC2,SW2сPTC6,SW3сPTD3,SW4сPTD2,
//светодиодыподключеныкPTF
#include/*forEnableInterruptsmacro*/
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"/*Этонашфайлсобъявлениями!*/
#defineLED7PTFD_PTFD7
#defineNVICGTRM(*(constchar*__far)0x0000FFBE)

Данная строка необходима, если ваш компилятор не содержит определения адреса для регистра NVICGTRM. Если компилятор выдаст ошибку на этом месте, то комментируйте выделенную строку.

unsignedcharmy_mfd,icg_lols;
//ПрерыванияотмодуляICG(пофлагамLOLSиLOCS)
voidinterruptVectorNumber_Vicgicg_isr(void)
{
//Еслибылапотерявнешнегогенератора,тонеобходимовосстановитьрежимFEE
if(ICGS1_LOCS)
{
//ICGврежимеFEE(CLKS=11),внешнеетактирование
ICGC1=ICG_FEE|bREFS|bICG_RANGE;
ICGC2=MFDx10;//MFD=111(N=10),RFD=000(R=1)
while(!ICGS2_DCOS);//ЖдатьстабилизацииDCO
my_mfd=3;//MFD=3
}
//Еслибылапотерявыходнойчастотымодуля
if(ICGS1_LOLS)icg_lols=1;
ICGS1_ICGIF=1;//СброситьфлагпрерыванияотICG
}
//ПрерыванияотмодуляKBI(обслуживаетнажатыекнопкиSW3иSW4)
voidinterruptVectorNumber_Vkeyboard1kbi1_isr(void)
{
KBI1SC_KBACK=1;//СброситьфлагKBI
if(!PTDD_PTDD3)//ЕслиSW3нажата,тоувеличитьMFD(BUSCLKрастет)
{
my_mfd++;
if(my_mfd>3)my_mfd=3;//ОграничитьMFD=3(N=10)
}
if(!PTDD_PTDD2)//ЕслиSW4нажата,тоуменьшитьMFD(BUSCLKпадает)
{
if(my_mfd)my_mfd--;//ОграничитьMFD=0
}
ICGC2=(my_mfd<<4);//ИзменитьMFD
}
//Программнаязадержка
voiddelay(unsignedintvalue)
{
for(;value;value--);
}
voidmain(void)
{
unsignedcharshift_register=1;
SOPT=0;//КонфигурироватьрегистрSOPT1,командаSTOPиCOPзапрещены
//ИнициализацияICG:
//МодульICGврежимеFEE(CLKS=11),внешнеетактирование
ICGC1=ICG_FEE|bREFS|bICG_RANGE;
ICGC2=MFDx10;//MFD=111(N=10),RFD=000(R=1)
ICGTRM=NVICGTRM;//ЗаписатьподстроечноечислоIRG
while(!ICGS2_DCOS);//ЖдатьстабилизацииDCO
//Конфигурацияпортовввода/вывода:
PTDPE=BIT_3|BIT_2;//РазрешитьподтягивающиерезисторыдляPTC7иPTC5
PTFDD=0xFF;//PTB0...PTB7—навывод
PTFD=0;//ВыключитьLD401...LD405
PTADD=BIT_5;//PTA5—навывод
KBI1SC=bKBIE;//РазрешитьпрерыванияотKBI2
KBI1PE=BIT_6|BIT_5;//РазрешитьфункциюKBIдляPTD3иPTD2
my_mfd=3;
icg_lols=0;
EnableInterrupts;
while(1)
{
PTFD=shift_register;//Изменитьсостояниесветодиодов
if(icg_lols)PTFD_PTFD7=1;//Еслиicg_lols=1,включитьLED7
delay(30000);//Задержка
shift_register<≤1;//Сдвигна1бит
//Последнийсветодиод?
if(shift_register==32)shift_register=1;//Начатьспервогосветодиода
}
}


Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>