`
Читать книги » Книги » Компьютеры и Интернет » Программирование » Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С

Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С

Перейти на страницу:

    if (process_valid_input_PORTB(new_PORTB)) {

     which_input = 5;

     change_input();

    }

   }

   break;

  case 0xBF: //PB6 "S-AUX" (1011_1111)

   if (which_input != 6) {

    if (process_valid_input_PORTB(new_PORTB)) {

     which_input = 6;

     change_input();

    }

   }

   break;

  case 0x7F: //PB7 "S-MUTE" (0111_1111)

   if (process_valid_input_PORTB(new_PORTB)) {

    mute_toggle();

   }

   break;

  default:; //all other cases

  } //конец switch(new_PORTB)

 } //конец if new_PORTB

 old_PORTB=new_PORTB; //update PORTB

}

//******************************************************************

//process_PORTA_input_task():определяется выбранный вход от PORTA

//******************************************************************

void process_PORTA_input_task(void) {

 new_PORTA = PORTA; //Читать PORTA

 if (new_PORTA != old_PORTA) { //выбор входа по состоянию порта PORTA

  switch (new_PORTA) { //PORTA переводится в высокое состояние

  case 0x01: //РАО "R-PREAMP-PWR" (0000_0001)

   if (process_valid_input_PORTA(new_PORTA)) {

    preamp_off();

    keep_going=0;

   }

   break;

  case 0x02: //PA1 R-PHONO" (0000_0010)

   if (which_input != 1) {

    if (process_valid_input_PORTA(new_PORTA)) {

     which_input = 1;

     change_input();

    }

   }

   break;

  case 0x04: //PA2 "R-CD" (0000_0100)

   if (which_input != 2) {

    if (process_valid_input_PORTA(new_PORTA)) {

     which_input = 2;

     change_input();

    }

   }

   break;

  case 0x08: //РАЗ "R-TUNER" (0000_1000)

   if (which_input != 3) {

    if (process_valid_input_PORTA(new_PORTA)) {

     which_input = 3;

     change_input();

    }

   }

   break;

  case 0x10: //PA4 "R-TAPE#1" (0001_0000)

   if (which_input != 4) {

    if (process_valid_input_PORTA(new_PORTA)) {

     which_input = 4;

     change_input();

    }

   }

   break;

  case 0x20: //PA5 "R-TAPE#2M (0010_0000)

   if (which_input != 5) {

    if (process_valid_input_PORTA(new_PORTA)) {

     which_input = 5;

     change_input();

    }

   }

   break;

  case 0x40: //PA6 "R-ДОПОЛНИТЕЛЬНЫЙ КАНАЛ" (0100_0000)

   if (which_input != 6) {

    if (process_valid_input_PORTA(new_PORTA)) {

     which_input = 6;

     change_input();

    }

   }

   break;

  case 0x80: //PA7 "R-MUTE" (1000_0000)

   if (process_valid_input_PORTA(new_PORTA)) {

    mute_toggle();

   }

   break;

   default:; //all other cases

  } //конец switch(new_PORTA)

 }//конец if new_PORTA

 old_PORTA = new_PORTA; //изменяется состояние PORTA

}

//******************************************************************

//initialize_timer:установка частоты таймера обслуживающего счетчик

//******************************************************************

void initialize_timer(void) {

 TMSK2 = 0x05; //установка на 250 КГц

 TSCR = 0x80; //разрешение работы таймера

}

//******************************************************************

//initialize_ports: начальная конфигурация портов

//******************************************************************

void initialize_ports(void) {

 DDRA=0x00; //конфигурация PORTA в качестве входного

 PORTA=0x00; //запрет на подключение подтягивающих резисторов в PORTA

 DDRB=0x00; //конфигурация PORTB в качестве входного

 PORTB=0xff; //разрешение подключения подтягивающих резисторов в PORTB

 DDRT=0xff; // конфигурация PORTT в качестве выходного

 PORTT=0x00; // установка на низкий уровень

 DDRP=0xff; // конфигурация PORTD в качестве выходного

 PORTP=0xff // установка на высокий уровень

}

//******************************************************************

//******************************************************************

//initialize_pins: установка отдельных выводов

//******************************************************************

void initialize_pins(void) {

 PORTT=0x01; //сброс реле PT0(1) 5 мс импульс с

 // активным уровнем (0000_0001)

 //delay_5ms():

 PORTT=0x00;

}

//******************************************************************

//delay_5ms: Задержка на 5 мс сформированная из базе частоты таймера

//в 250 кГц

//******************************************************************

void delay_5ms(void) {

 int i;

 for(i=0; i<1250; i++)

  asm("nop"); //требуется только один импульс таймера

}

//******************************************************************

//delay_3s: Задержка на 3 с

//******************************************************************

void delay_3s(void) {

 int i;

 for(i=0;i<600;i++) delay_5ms();

}

//******************************************************************

//change_input: изменение активного входа

//******************************************************************

void change_input(void) {

 PORTP &= ~0x80; //установка LED-MUTE-RELAY PP7(0) 1000_0000

 PORTT |= 0x01; //установка сброса реле PT0(l) 5 мс

 delay_5ms();

 PORTT &= ~0x01; //turn off PT0

 switch(which_input) {

 case 1: //PHONO

  phono_task();

  break;

 case 2: //CD

  CD_task();

  break;

 case 3: //TUNER

  tuner_task();

  break;

 case 4: //TAPE#1

  tape1_task();

  break;

 case 5: //TAPE#2

  tape2_task();

  break;

 case 6: //AUX

  aux_task();

  break;

  default:;//все другие входы

 }//конец switch

 delay _3s();

 PORTP |= 0x80; //сброс LED-MUTE-RELAY PP7(1)

}

//******************************************************************

//mute_toggle: включение и выключение звука

//******************************************************************

void mute_toggle(void) {

 if (mute == off) {

  PORTP &= ~0x80; //установка LED-MUTE-RELAY PP7(0)

  mute = on;

 } else {

  PORTP |= 0x80; // сброс LED-MUTE-RELAY PP7(1)

  mute = off;

 }

}//end mute_toggle

//******************************************************************

//preamp_off: turn amplifier off

//******************************************************************

void preamp_off(void) {

 PORTP &= ~0x80; //установка LED-MUTE-RELAY PP7(0)

 PORTP |= 0x01; //сброс LED-PWR-RELAY PP0(1)

 PORTP |= 0x7e; //сброс светодиодов PP1-PP6(1)(0111_1110)

 //установка PT7 импульсом 10 мс

 PORTT |= 0x80; //установка PT7(1) импульсом 10 мс

 delay_5ms();

 delay_5ms();

 PORTT &= ~0x80; //сброс PT7

 delay_3s();

 PORTP = 0x80; //сброс PP7(1) LED-MUTE-RELAY

 keep_going=0;

}

//******************************************************************

//process_valid_input_PORTA: проверка состояния пульта дистанционного

//управления, длительностью не менее 50 мс

//******************************************************************

int process_valid_input_PORTA(unsigned char portx) {

 int valid_input; //установить флаг ошибочного входа

 unsigned int current_count;

 valid_input = TRUE;

 current_count = TCNT; // задать текущее состояние

 while (TCNT < (current_count+12500)) { //отследить активный вход за 50 мс

  if (portx==PORTA) valid_input = TRUE;

  else valid_input = FALSE;

  if (!valid_input) break; //цикл while

 }//end while

 return valid_input;

}

//******************************************************************

//process_valid_input_PORTB: проверка состояния переключателей на

//лицевой панели,длительностью не менее 50 мс

//******************************************************************

int process_valid_input_PORTB(unsigned char portx) {

 int valid_input; //установить флаг ошибочного входа

 unsigned int current_count;

 valid_input = TRUE;

 current_count = TCNT; // задать текущее состояние

 while (TCNT < (current_count+12500)){ //отследить активный вход за 50 мс

  if (portx==PORTB) valid_input = TRUE;

  else valid_input = FALSE;

  if (!valid_input) break; //цикл while

 }//конец while

 return valid_input;

}

//******************************************************************

//******************************************************************

8.8.3. Испытание контроллера усилителя

Проверять программное обеспечение целесообразно при работе с имитатором усилителя, как мы уже упоминали в главе 2. Воспроизведем снова схему имитатора усилителя для удобства на рис. 8.20. На дешевом имитаторе можно провести полное испытание алгоритма управления, проверив его работу при мыслимых сценариях.

Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С, относящееся к жанру Программирование. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)