Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Название:Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Автор:
- Жанр:
- Издательство:Издательский дом «ДМК-пресс»
- Год:2007
- Город:Москва
- ISBN:5-9706-0034-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С краткое содержание
В книге последовательно рассматриваются все этапы создания встраиваемых систем на микроконтроллерах с применением современных технологий проектирования. Задумав эту книгу, авторы поставили перед собой задачу научить читателя искусству создания реальных устройств управления на однокристальных микроконтроллерах.
Издание содержит материал, охватывающий все вопросы проектирования, включает множество заданий для самостоятельной работы, примеры программирования, примеры аппаратных решений и эксперименты по исследованию работы различных подсистем микроконтроллеров.
Данная книга является прекрасным учебным пособием для студентов старших курсов технических университетов, которые предполагают связать свою профессиональную деятельность с проектированием и внедрением встраиваемых микропроцессорных систем. Книга также будет полезна разработчикам радиоэлектронной аппаратуры на микроконтроллерах.
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
{
;
}
/* сохранения результата в глобальном массиве */
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 */
DDRP = 0xFF; /*Порт PORT T на вывод */
PWEN = 0x0F; /*Активизировать выход ШИМ */
PWPER0 = 250; /*Установить частоту ШИМ 250 Гц */
PWPER1 = 250;
PWPER2 = 250;
PWPER3 = 250;
PWDTY0 = 0; /*начальная установка ШИМ на отсутствие движения*/
PWDTY1 = 0;
PWDTY2 = 0;
PWDTY3 = 0;
}
/********************************************************************/
/*pwm_motors: /*выполнение определенного поворота */
/********************************************************************/
void pwm_motors(const char a) {
for (i = 0;i<2000;i++) /*задержка на 3 мс чтобы позволить двигателю*/
{ /* отреагировать*/
}
switch(a) { /*определение вида поворота */
case 0: /* движение вперед */
PWDTY0 = 200; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 200;
lcd_print("Forward\n");
break;
case 1: /*полуповорот налево */
PWDTY0 = 0; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 125;
lcd_print("Half Left\n");
break;
case 2: /*полуповорот направо*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 0;
lcd_print("Half Right\n");
break;
case 3: /*поворот налево*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 0;
PWDTY3 = 125;
lcd_print("Left Turn\n");
break;
case 4: /*поворот направо*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 0;
PWDTY2 = 250;
PWDTY3 = 125;
lcd_print("Right Turn\n");
break;
case 5: /*задний ход*/
PWDTY0 = 125; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 0;
PWDTY2 = 0;
PWDTY3 = 125;
for(i=0; i<0xFFFF; i++) { /* Задержка в 1,25 с перед движением назад*/
for(j=0; j<15; j++) {
;
}
}
lcd_print("Back Up\n");
break;
default: /*по умолчанию движение вперед, малая скорость */
PWDTY0 = 63; /*регистры коэффициента заполнения ШИМ */
PWDTY1 = 250;
PWDTY2 = 250;
PWDTY3 = 63;
lcd_print("Error\n");
break;
}
}
/********************************************************************/
/*lcd_init(): инициализация режима работы ЖК дисплея */
/*Последовательность команд инициализации определяется изготовителем*/
/*PORTA: магистраль данных, PORTB[2:1]: линия R/S, линия разрешения E*/
/********************************************************************/
void lcd_init() {
DDRA=0xff; /*порт PORTA на вывод */
DDRB=0x06; /* порт PORTB [2:1] на вывод */
/*последовательности команд для инициализации ЖК дисплея */
putcommand(0x38);
putcommand(0x38);
putcommand(0x38);
putcommand(0x38);
putcommand(0x0f);
putcommand(0x01);
putcommand(0x06);
putcommand(0x00);
/*очистка дисплея, возврат курсора */
putcommand(0x00);
}
/********************************************************************/
/*putchar(char c): вывод символа на дисплей */
/********************************************************************/
int putchar(char c) {
PORTA=C;
PORTB= PORTB |0x04;
PORTB= PORTB |0x02;
PORTB= PORTB&0xfd;
for (i=0; i<100; i++); /*задержка на *150 мкс до того, как ЖКД */
/* сможет принять информацию */
return с;
}
/********************************************************************/
/********************************************************************/
/*putcommand(char c): выдача команды управления для ЖК дисплея */
/********************************************************************/
int putcommand(char с) {
PORTA= с;
PORTB= PORTB&0xfb;
PORTB= PORTB|0x02;
PORTB= PORTB&0xfd;
for (i=0; i<100; i++) /* задержка на *150 мкс до того, как ЖКД сможет*/
/*принять информацию */
{
;
}
return c;
}
/********************************************************************/
/*delay_25(): задержка на 2.5 с */
/********************************************************************/
void delay_25() {
for (i=0; i<0xFFFF; i++) {
for (j=0; j<30; j++) {
;
}
}
}
/********************************************************************/
/*lcd_print(): вывод строки символов на дисплей. */
/********************************************************************/
void lcd_print(char *string) {
putcommand(0x02); /*возврат курсора ЖКД */
while (*(string) != '\0') {
putchar(*string);
string++;
}
}
/********************************************************************/
7.2. Лазерный проектор
Интервал:
Закладка: