/*прототипы функций*/
void init_adc(void); /*инициализация АЦП */
void read_adc(void); /*считывание значений АЦП */
void decision(void); /*передача решения о повороте, основанного на */
/*данных АЦП* /
void init_pwm(void); /*инициализация ШИМ */
void pwm_motors(const char a); */активация ШИМ для пересылки */
void lcd_init(void); /* инициализация дисплея */
int putchar(char c); /*вывод символа на дисплей */
int putcommand(char с); /*вывод команды на дисплей */
void delay_25(void); /*подпрограмма задержки на 2,5 с */
void lcd_print(char *string); /*вывод строки на ЖК дисплей */
void main() {
asm(".area vectors(abs)\n" /*инициализация вектора сброса МК */
" org 0xFFF8\n"
" .word 0x8000, 0x8000, 0x8000, 0x8000\n"
".text");
lcd_init(); /*инициализация ЖК дисплея */
lcd_print("LCD initialized");
void delay_25(void); /* задержки на 2,5 с */
init_adc(); /*инициализация АЦП */
lcd_print("ADC initialized");
void delay_25(void); /* задержки на 2,5 с */
init_pwm(); /*инициализация ШИМ */
lcd_print("PWM initialized");
void delay_25(void); /* задержки на 2,5 с */
while(1) / *непрерывный цикл */
{
read_adc(); /* считать текущее значение из АЦП */
decision(); /* принять решение о направлении движения */
}
} /*конец программы main*/
********************************************************************/
/*initialize_adc: инициализация АЦП контроллера 68HC12 */
/*******************************************************************/
void init_adc() {
ATDCTL2 = 0x80; /*Установить бит ADPU для подачи питания на АЦП */
ATDCTL3 = 0x00;
ATDCTL4 = 0x7F; /* частоту P_CLK установить на 125 кГц */
/* время преобразования: 32 ATD CLK, */
/*1 считывание каждые 256 мкс /*
for(i=0; i<67; i++) /*задержка 100 мкс при 8 МГц E_CLK */
{
;
}
}
/********************************************************************/
/********************************************************************/
/*read_adc: считывание результатов из АЦП */
/********************************************************************/
void read_adc() {
ATDCTL5 = 0x50; /*Установить АЦП на режим многоканального,*/
/* преобразования 8 каналов */
while((ATDSTAT & 0x8000) == 0)/* проверка бита SCF для окончания */
/*преобразования */
{
;
}
/* сохранения результата в глобальном массиве */
sens[0] = ADR7H; /*дальний левый датчик */
sens[l] = ADR6H; /*средний правый датчик */
sens[2] = ADR5H; /*центральный датчик */
sens[3] = ADR4H; /* средний правый датчик */
sens[4] = ADR3H; /* дальний правый датчик */
sens[5] = ADR2H; /*датчик Холла*/
}
/********************************************************************/
/*decision(): решение о повороте основано на информации, полученной от*/
/* пяти датчиков. Порог датчика Холла (hes_threshold) и порог */
/* оптического датчика (opto_threshold) определяются экспериментально.*/
/********************************************************************/
void decision() {
if (sens[5] < hes_threshold) { /* датчик Холла нашел "мину", */
pwm_motors(back_up); /* робот движется назад и определяются */
/* дальнейшие действия/*
if (sens[0] > opto_threshold) pwm_motors(right_turn);
else pwm_motors(left_turn);
for(i=0; i<0xFFFF; i++){ /*задержка вращения двигателя */
for(j=0; j<15; j++) {
;
}
}
}
/*если обнаруживает три стенки (тупик), то движется назад */
else if((sens[2]>opto_threshold) && (sens[0]>opto_threshold)
&& (sens[4]>opto_threshold)) {
pwm_motors(back_up);
}
/*если стенки спереди и слева, поворачивает направо */
else if((sens[0]>opto_threshold)&&(sens[2]>opto_threshold)) {
pwm_motors(right_turn);
}
/*если стенки спереди и справа, поворачивает налево */
else if((sens[2]>opto_threshold)&&(sens[4]>opto_threshold)) {
pwm_motors(left_turn);
}
/*если стенка спереди справа, делает полуповорот направо*/
else if(sens[1]>opto_threshold) {
pwm_motors(half_right);
}
/*если стенка спереди слева, делает полуповорот налево */
else if(sens[3] > opto_threshold) {
pwm_motors (half_left) ;
}
/*если стенки вблизи нет, продолжает движение вперед */
else {
pwm_motors(forward);
}
}
/********************************************************************/
/*init_pwm(): инициализация ШИМ контроллера 68HС12 */
/********************************************************************/
void init_pwm() {
PWTST= 0x00;
PWCTL= 0x00; /*Режим фронтовой ШИМ */
WCLK= 0x3F; /*Каналы без каскадного соединения, E_CLK/128 */
PWPOL= 0x0F; /*set pins high then low transition */
Читать дальше