//=Усилитель на TDA7314S=, журнал РадиоХобби №6-2005 г. =1 //Makefile: Name=rh3, MCU=atmega8, Level=2, Debug=VMLab =2 //Фьюзы: BODEN=BODLEVEL=SUT0=CKSEL3=CKSEL2=CKSEL1="0" =3 #include //Библиотека ввода-вывода =4 #include //Библиотека работы с EEPROM =5 #include //Библиотека задержек =6 #define F_CPU 1000000UL //Тактовая частота 1 МГц =7 #define PLUS PB2 //Условное имя для кнопки "+" =8 #define MINUS PB6 //Условное имя для кнопки "-" =9 #define VYBOR PB7 //Условное имя для кнопки "ВЫБОР" =10 unsigned char v; //Счетчик номера режима 0...5 =11 unsigned long count; //Счетчик 20 с (возврат в начало) =12 unsigned char p[6]; //Массив из 6 режимов (1...8) =13 extern void i2start (void); //Внешн. функция старт I2C =14 extern void i2write (unsigned char); //Запись I2C =15 extern unsigned char i2ack (void); //Подтверждение I2C =16 extern void i2stop (void); //Внешняя функция стоп I2C =17 //----------Функция проверки нажатия кнопки----------- =18 unsigned char key (unsigned char pp) //pp -линия порта =19 { if (bit_is_clear(PINB, pp)) //Если кнопка нажата, то =20 { _delay_loop_2(12500); //Пауза 50 мс, "антидребезг" =21 if (bit_is_clear(PINB, pp)) //Повторная проверка =22 { return (0); //Возврат "0" при нажатии кнопки =23 } //Окончание повторной проверки =24 } //Общее окончание проверки нажатия кнопки =25 return (1); //Возврат "1" при отсутствии нажатия =26 } //Окончание внутренней функции "key" =27 //--------Функция свечения "столбиковой шкалы"-------- =28 void ind (unsigned char number) //"number" - число HL =29 { if (number == 1) PORTD=0xFE; //Светится только HL1 =30 if (number == 2) PORTD=0xFC; //Светятся HL1, HL2 =31 if (number == 3) PORTD=0xF8; //Светятся HL1-HL3 =32 if (number == 4) PORTD=0xF0; //Светятся HL1-HL4 =33 if (number == 5) PORTD=0xE0; //Светятся HL1-HL5 =34 if (number == 6) PORTD=0xC0; //Светятся HL1-HL6 =35 if (number == 7) PORTD=0x80; //Светятся HL1-HL7 =36 if (number == 8) PORTD=0x00; //Светятся HL1-HL8 =37 return; //Возврат обратно в программу =38 } //Окончание внутренней функции "ind" =39 //--------Функция записи по шине I2C в TDA7314-------- =40 void tda (void) //Используются переменные "v" и "p[v]" =41 { i2start(); i2write(0x88); i2ack(); //Старт I2C =42 if (v==0) i2write((8-p[v]) << 3); //Громкость 0-70дБ =43 if (v==1) //Баланс громкости по фронту LF-RF =44 { i2write(0x80 | (p[v]-1)); //-1,25...-8,75 дБ (LF) =45 i2ack(); i2write(0xA0 | (9-p[v])); //(RF) =46 } //Итого: баланс при цифре 5 на световой шкале =47 if (v==2) //Баланс громкости по тылу LR-RR =48 { i2write(0xC0 | (p[v]-1)); //-1,25...-8,75 дБ (LR) =49 i2ack(); i2write(0xE0 | (9-p[v])); //(RR) =50 } //Итого: баланс при цифре 5 на световой шкале =51 if (v==3) //Тембр НЧ, -14...+14 дБ =52 { if (p[v] < 5) i2write(0x60 | ((p[v]-1) << 1)); // =53 else i2write(0x60 | ((12-p[v]) << 1)); //Обр. счет =54 } //Итого: шаг регулирования тембра НЧ 4 дБ =55 if (v==4) //Тембр ВЧ, -14...+14 дБ =56 { if (p[v] < 5) i2write(0x70 | ((p[v]-1) << 1)); // =57 else i2write(0x70 | ((12-p[v]) << 1)); //Обр. счет =58 } //Итого: шаг регулирования тембра ВЧ 4 дБ =59 if (v==5) i2write((0x58 & (0xF8-p[v])<<2)); //Чувств.=60 i2ack(); i2stop(); //Завершение работы с шиной I2C =61 return; //Возврат обратно в программу =62 } //Окончание внутренней функции "tda" =63 //===============ОСНОВНАЯ ПРОГРАММА=================== =64 int main(void) //Начало основной программы =65 { PORTB=0xFC; DDRB=0x00; //PB - входы; PB0,PB1 - без R =66 PORTC=PORTD=DDRC=DDRD=0xFF; //PC,PD - выходы с лог.1 =67 for (v=0; v < 6; v++) //Загрузка настроек из EEPROM =68 { p[v]=eeprom_read_byte(0x20 + v); //Чтение байта =69 if ((p[v] > 8) || (p[v]==0)) //Если был сбой, =70 { eeprom_write_byte(0x20+v,0x01); //то запись "1" =71 } //Окончание начальной записи при сбое =72 tda(); //Установка аудиопараметров в TDA7314 =73 } //Окончание загрузки всех 6 режимов =74 while (1) //Бесконечный цикл выполнения операторов =75 { if (count == 0L) //Если начало или прошло 20 сек =76 { v=0; ind (p[v]); //Индикация на световой шкале =77 PORTC = 0xFE; //Свечение HL9, режим громкости =78 } //Окончание процедуры начальной индикации =79 if (++count > 100000L) count = 0L; //Прошло 20 сек =80 if ((key(PLUS)) == 0) //Проверка нажатия кнопки"+" =81 { if (++p[v] > 8) p[v]=8; //Останов при максимуме =82 else //Иначе увеличить номер режима на единицу =83 { ind (p[v]); //Индикация нового значения шкалы =84 tda(); //Изменение аудиопараметров TDA7314 =85 eeprom_write_byte((0x20+v),p[v]); //EEPROM =86 } //Итого: запись в EEPROM до максимума =87 _delay_loop_2(62500); //Пауза на 250 мс =88 count = 1L; //Начало нового отсчета в 20 секунд =89 } //Окончание проверки нажатия кнопки "+" =90 if ((key(MINUS)) == 0) //Проверка нажатия кноп."-" =91 { if (--p[v] < 1) p[v]=1; //Останов при минимуме =92 else //Иначе уменьшить номер режима на единицу =93 { ind (p[v]); //Индикация нового значения шкалы =94 tda(); //Изменение аудиопараметров TDA7314 =95 eeprom_write_byte((0x20+v),p[v]); //EEPROM =96 } //Итого: запись в EEPROM до минимума =97 _delay_loop_2(62500); //Пауза на 250 мс =98 count = 1L; //Начало нового отсчета в 20 секунд =99 } //Окончание проверки нажатия кнопки "-" =100 if ((key(VYBOR)) == 0) //Проверка нажатия "ВЫБОР" =101 { if (++v > 5) v=0; //Если максимум, то в начало =102 PORTC = ~(1 << v); //Индикация режима HL9-HL14 =103 ind (p[v]); //Индикация текущего значения шкалы =104 _delay_loop_2(62500); //Пауза на 250 мс =105 count = 1L; //Начало нового отсчета в 20 секунд =106 } //Окончание проверки нажатия кнопки ВЫБОР =107 } //К началу функции "while", бесконечный цикл =108 } //WinAVR-20050214, длина кода 1232 байтов =109