Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ВстраиваСмыС систСмы. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… сСмСйства 68HC12/HCS12 с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ языка Π‘Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 137

Автор Π‘Ρ‚ΠΈΠ²Π΅Π½ Π‘Π°Ρ€Ρ€Π΅Ρ‚Ρ‚

//

// ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ "MUTE":

//1. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ "LED-MUTE-RELAY" (PP7)

//2. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ "SCAN"

//

//ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ "PREAMP OFF":

//1. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ "LED-MUTE-RELAY" (PP7)

//2. DE-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ "LED-PWR-RELAY" (PP0)

//3. DE-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ всСх свСтодиодов (PP1-Π Π 6)

//4. Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ PT7(1) ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠΌ 10 мс

//5. DE-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ "LED-MUTE-RELAY" (PP7) ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· 3 с.

//6. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ "PREAMP ON"

//

//Π°Π²Ρ‚ΠΎΡ€Ρ‹: Steven Barrett ΠΈ Daniel Pack

//Π”Π°Ρ‚Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: 19 июня 2004

//ПослСдняя рСдакция: 20 июня 2004

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


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

//Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

#include <912b32.h> //B32 EVB header file

#include "func_def.h" //Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹, Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅


//main program*******************************************************

// Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

int which_input; //Π²Ρ…ΠΎΠ΄ усилитСля

int keep_going; //Π²Π²ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

int mute; //Ρ„Π»Π°Π³ управлСния Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π·Π²ΡƒΠΊΠ°

unsigned char old_PORTB = 0xff; //Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния PORTB

unsigned char old_PORTA = 0x00; //Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния PORTA

unsigned char new_PORTB, new_PORTA; //Π½ΠΎΠ²Ρ‹Π΅ значСния PORTA, PORTB


void main(void) {

 asm(" .area vectors(abs)\n"

  " .org 0xFFF8\n" //инициализация Π²Π΅ΠΊΡ‚ΠΎΡ€Π° сброса для 68HC12 B32

  " .word 0x8000, 0x8000, 0x8000, 0x8000\n"

  " .text");

 initialize_task();

 //Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ»

 while(1) { //оТидаСтся сигнал Π½Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ питания

  if ((PORTB==0xFE)||(PORTA==0X01))

  //PORTB ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π½ΠΈΠ·ΠΊΠΎΠ΅, PORTA - Π²

  // высокоС состояниС

  { //Π²Ρ‹ Π·Π°Π±Ρ‹Π»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅! Запрос Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

   keep_going = 1; //Ρ†ΠΈΠΊΠ» считывания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

   PORTP=0x7E; //Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ LED-MUTE-RELAY PP7(0)

               //LED-PWR-RELAY PP0(0) (0111_1110)

   which_input_task();

   activate_power_relay_task();

   delay_3s(); //Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° 3 с.

   PORTP = 0x80; // DE-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ PD7(1) - Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π²ΡƒΠΊΠ°

   while(keep_going) //ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ мСню - Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» опроса

   {

    process_PORTB_input_task();

    process_PORTA_input_task();

   }

  }//end if - ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ питания - ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π°Π½ΠΎ!

 }//end while(1)

}//ΠΊΠΎΠ½Π΅Ρ† Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°


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

// ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

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


initialize_task: Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ установки усилитСля

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

void initialize_task(void) {

 mute = on; //turn mute on

 initialize_timer(); // инициализация Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

 initialize_ports(); // инициализация ΠΏΠΎΡ€Ρ‚ΠΎΠ²

 initialize_pins(); // инициализация состояния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ²

 which_input = 2 ; //ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²Ρ…ΠΎΠ΄ CD(2)

                   //Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ свСтодиодов Π½Π° Π»ΠΈΡ†Π΅Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ

 PORTP = 0x81; //Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ всСх свСтодиодов PD1-PD6 Π½ΠΈΠ·ΠΊΠΈΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ

               // ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ (1000_0001)

 delay_3s(); //Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° 3 с

 PORTP = 0xff; //Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ свСтодиодов

}


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

//which_input_task: опрос Π²Ρ…ΠΎΠ΄ΠΎΠ², установка Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния

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

void which_input_task(void) {

 switch(which_input) { // подсвСчиваСтся свСтодиод для ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ

                       // Π²Ρ…ΠΎΠ΄Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Ρ…ΠΎΠ΄ 2 - CD)

 case 1: //Пианино

  phono_task();

  break;

 case 2: //CD

  CD_task();

  break;

 case 3: //Π’ΡŽΠ½Π΅Ρ€

  tuner_task();

  break;

 case 4: //ΠœΠ°Π³Π½ΠΈΡ‚ΠΎΡ„ΠΎΠ½ 1

  tape1_task();

  break;

 case 5: //ΠœΠ°Π³Π½ΠΈΡ‚ΠΎΡ„ΠΎΠ½ 2

  tape2_task();

  break;

 case 6: //Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» (Π”Πš)

  aux_task();

  break;

 default:;

 }//ΠΊΠΎΠ½Π΅Ρ† switch

}


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

//phono_task: конфигурируСтся Π²Ρ…ΠΎΠ΄ ΠΎΡ‚ Π Π°Π΄ΠΈΠΎ

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

void phono_task(void) {

 PORTT |= 0x02; //устанавливаСтся PT1(1) (0000_0010)

 delay_5ms();

 PORTT &= ~0x02; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ PT1(0)

 PORTP = 0x7E; //гасятся всС свСтодиоды

 PORTP &= ~0x02; //Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ свСтодиод 1 (0)

}


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

//CD_task: конфигурируСтся Π²Ρ…ΠΎΠ΄ ΠΎΡ‚ CD

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

void CD_task(void) {

 //CD

 PORTT |= 0x04; // устанавливаСтся PT2(1) (0000_0100)

 delay_5ms();

 PORTT &= ~0x04; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ PT2(0)

 PORTP |= 0x7E; //гасятся всС свСтодиоды

 PORTP &= ~0x04; // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ свСтодиод 2 (0)

}


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

//tuner_task: конфигурируСтся Π²Ρ…ΠΎΠ΄ ΠΎΡ‚ Ρ‚ΡŽΠ½Π΅Ρ€Π°

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

void tuner_task(void) {

 //TUNER PORTT |= 0x08; // устанавливаСтся PT3(1) (0000_1000)

 delay_5ms();

 PORTT & = 0x08; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ PT3(0

 PORTP |= 0x7E; //гасятся всС свСтодиоды

 PORTP &= ~0x08; // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ свСтодиод 3 (0)

}


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

//tape1_task: конфигурируСтся Π²Ρ…ΠΎΠ΄ ΠΎΡ‚ ΠΌΠ°Π³Π½ΠΈΡ‚ΠΎΡ„ΠΎΠ½Π° 1

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

void tape1_task(void) {

 //TAPE#1

 PORTT |= 0x10; //assert PT4(1) (0001_0000)

 delay_5ms();

 PORTT &= ~0x10; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ PT4(0)

 PORTP |= 0x7E; //гасятся всС свСтодиоды

 PORTP &= ~0x10; // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ свСтодиод 4 (0)

}


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

//tape2_task: конфигурируСтся Π²Ρ…ΠΎΠ΄ ΠΎΡ‚ ΠΌΠ°Π³Π½ΠΈΡ‚ΠΎΡ„ΠΎΠ½Π° 2

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

void tape2_task(void) {

 //TAPE#2

 PORTT |= 0x20; // устанавливаСтся PT5(1) (0010_0000)

 delay_5ms();

 PORTT &= ~0x20; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ PT5(0)

 PORTP |= 0x7E; //гасятся всС свСтодиоды

 PORTP & = ~0x20; // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ свСтодиод 5 (0)

}


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

//aux_task: конфигурируСтся Π²Ρ…ΠΎΠ΄ ΠΎΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°

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

void aux_task(void) {

 //Π”Πš

 PORTT |= 0x40; // устанавливаСтся PT6(1) (0100_0000)

 delay_5ms();

 PORTT &= ~0x40; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ PT6(0)

 PORTP |= 0x7E; //гасятся всС свСтодиоды

 PORTP &= ~0x40; // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ свСтодиод 6(0)

}


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

//activate_power_relay_task(): Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ€Π΅Π»Π΅ силового питания

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

void activate_power_relay_task(void) {

 PORTT |= 0x80; // устанавливаСтся PT7(1) ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠΌ 10 мс

 delay_5ms();

 delay_5ms();

 PORTT &= ~0x80; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ PT7

}


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

//process_PORTB_input_task(): опрСдСляСтся Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ ΠΎΡ‚ PORTB

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

void process_PORTB_input_task(void) {

 new_PORTB = PORTB; //read PORTB

 if (new_PORTB != old_PORTB) { //считываниС состояния ΠΏΠΎΡ€Ρ‚Π° PORTB

  switch(new_PORTB) { //PORTB устанавливаСтся Π½Π° Π½ΠΈΠ·ΠΊΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ

  case 0xFE: //PB0 "S-PREAMP-PWR" (1111_1110)

   if (process_valid_input_PORTB(new_PORTB)) {

    preamp_off();

    keep_going=0;

   }

   break;

  case 0xFD: //PB1 "S-PHONO" (1111_1101)

   if (which_input !=1) {

    if (process_valid_input_PORTB(new_PORTB) {

     which_input = 1;

     change_input();

    }

   }

   break;

  case 0xFB: //PB2 "S-CD" (1111_1011)

   if (which_input!=2) {

    if (process_valid_input_PORTB(new_PORTB)) {

     which_input = 2;

     change_input();

    }

   }

   break;

  case 0xF7: //PB3 "S-TUNER" (1111_0111)

   if (which_input != 3) {

    if (process_valid_input_PORTB(new_PORTB)) {

     which_input = 3;

     change_input();

    }

   }

   break;

  case 0xEF: //PB4 "S-TAPE#1" (1110_1111)

   if (which_input != 4) {

    if (process_valid_input_PORTB(new_PORTB)) {

     which_input = 4;

     change_input();

    }

   }

   break;

  case 0xDF: //PB5 "S-TAPE#2" (1101_1111)

   if (which_input != 5) {

    if (process_valid_input_PORTB(new_PORTB)) {