Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » как управлять ТДА7313?


как управлять ТДА7313?

Сообщений 1 страница 23 из 23

1

Подскажите как управлять тда7313? как ей отправлять правильно по i2c команды на изменение значений уровней громкости и тд.. что то у меня ничего не выходит! если можно то подскажите кусочек кода!

0

2

http://www.promelec.ru/pdf/tda7313.pdf - страница номер 9 документации.

0

3

Да я делал по ней но видать где-то касячу! микруха не реагирует на команды! собрано все верно потому что с готовым проектом взятым с сайта все работает! а так как у меня исходников нету не могу понять где ошибка !

Делаю так !!
I2cstart
I2cwbyte 136
I2cwbyte 92
I2cwbyte 224
I2cwbyte 192
I2cwbyte 160
I2cwbyte 128
I2cwbyte 127
I2cwbyte 104
I2cwbyte 43
I2cstop

Отредактировано Elehome (2015-03-30 08:25:27)

0

4

1. скорость должна быть 100к.
2. инициализировать шину I2C.
3. попробуйте так:

Код:
I2cstart
I2cwbyte &B1000_1000 ' addr
I2cwbyte &B00_000_000 ' volume - 0 dB
I2cwbyte &B101_10_100 ' Speaker RF - 25dB
I2cwbyte &B100_10_100 ' Speaker LF - 25dB
I2cwbyte &B111_10_100 ' Speaker RR - 25dB
I2cwbyte &B110_10_100 ' Speaker LR - 25dB
I2cwbyte &B010_01001 ' Audio Switch - select the stereo 2 input with a gain of +7.5dB LOUDNESS ON
I2cwbyte &B0110_1111 ' Bass - 0dB 
I2cwbyte &B0111_1111 ' Trible - 0dB
I2cstop

+1

5

Капец, неужели Денис начал просто помогать, а не ёрничать!

0

6

не люблю помогать в том, что реально руками не щупал (это как надувная женщина) :D

0

7

спасибо! будем пробовать!

0

8

Вчера тоже пробовал "воевать" с этим делом. Всё понял. Разобрался вроде. :) Хелп и даташиты перечитал, пока не наткнулся на один нюанс.
Подскажет кто? :)
Значит так - адрес всех этих микрух (7313, 7315, 7409, 7440, 8425 и т.д. и т.п.) вроде как - &H88. Это понятно.
Вопросы, Вам уважаемые форумчане, конечно назрели. Как правильно отослать, например, следующий байт суб.адреса?
В ДШ на 7440, например, на стр. 9 в таблице 9, старшие биты указаны как Х (крестики)
Как это отобразить в коде? Вида &Bxxxxxx00 или всё таки прописывать нули - &B00000000 или делать сдвиг?
И второй момент, который мне был непонятен и по которому я в хелпах Баскома ничего не нашёл, это &H и &B.
В моём понимании: в первом - это типа HEX, а во втором - BIN. (системы исчисления) Верно?
Поясните поподробней, если не сложно, что и к чему? Устал я уже перечитывать чужие куски кода, по типу "работа с DS1307" "или работа с внешней ЕЕРROM" или с расширителями портов.
Спасибо.

Отредактировано sevastopolets (2015-04-04 21:20:12)

0

9

RDW написал(а):

не люблю помогать в том, что реально руками не щупал (это как надувная женщина)

А почему же тогда не помогли мне с энкодером? Я честно сказать, ждал ваш коментарий в этой теме.
реализация бездействия
Тоже не щупали?  :D  :D

Отредактировано sevastopolets (2015-03-31 01:14:07)

0

10

&H- это типа HEX  и &B.  - это типа BIN. пересчитывайте из одного в другое хоть в десятичный и пишите в чем удобно!

0

11

&H88 hex - 136 в десятич - 10001000 бин

0

12

sevastopolets написал(а):

Вида &Bxxxxxx00 или всё таки прописывать нули - &B00000000 или делать сдвиг?

В место x может быть любое значение. В данном случае 0 или 1.

0

13

sevastopolets написал(а):

А почему же тогда не помогли мне с энкодером? Я честно сказать, ждал ваш коментарий в этой теме.
реализация бездействия
Тоже не щупали?  :D  :D

1. да, не щупал
2. тема с энкодерами вообще вечная, сколько людей - столько версий реализаций, причем все по своему правы и нет (одновременно, зависит от мест использования).
3. код программы обычно рождается при совокупности (идеально) всех обстоятельств/условий, просто предложить алгоритм - ничего не решит (вам кстати его там предложили и весьма неплохой, только его тоже можно реализовывать многими способами). А раз так, то порой изначально алгоритм человека может быть ошибочным (не раз же бывало такое (у меня по крайней мере), что вначале код один, а потом в корне меняется и проще с нуля всё начать). В общем дело в убеждении, а это целая конфликтная ситуация, короче, проще не участвовать (чем доказывать, особенно когда тебя не слышат).
4. я больше люблю шину I2C. :)

В общем я так до энкодеров не добрался. На полке лежат с кнопкой в ручке, т.е. подобной проблемы не возникнет (благо у китайцев они дешевые)...

зы: кстати на недели возился с PCA9685PW, делал для друга (моделиста) эмуляцию горения свечи на 48 каналов (3 режима работы и настройка яркости на 4 патерна (12 каналов). Досконально не разбирался, но под конкретную задачу работа была выполнена, если интересно, могу выложить режим инициализации и управления (под конкретный режим (просто их там несколько видов), чип весьма гибкий и области применения весьма обширны (от управления сервами, до RGB-светодиодами). В общем чтобы было с чего стартовать...

0

14

RDW написал(а):

1. да, не щупал

А я вот наоборот. Даже одно время пытался найти LS7183
Пощупать. Но увы.

RDW написал(а):

2. тема с энкодерами вообще вечная, сколько людей - столько версий реализаций, причем все по своему правы и нет (одновременно, зависит от мест использования).

Я понял, что Вы хотели этим сказать.  :)

RDW написал(а):

3. код программы обычно рождается при совокупности (идеально) всех обстоятельств/условий, просто предложить алгоритм - ничего не решит (вам кстати его там предложили и весьма неплохой, только его тоже можно реализовывать многими способами). А раз так, то порой изначально алгоритм человека может быть ошибочным (не раз же бывало такое (у меня по крайней мере), что вначале код один, а потом в корне меняется и проще с нуля всё начать). В общем дело в убеждении, а это целая конфликтная ситуация, короче, проще не участвовать (чем доказывать, особенно когда тебя не слышат).

Мне доказывать не надо. Я всё слышу. :) А вот от подсказок не откажусь !! :)

RDW написал(а):

4. я больше люблю шину I2C.

Теперь мне тоже придётся её любить  :D Понадобилась.

RDW написал(а):

зы: кстати на недели возился с PCA9685PW, делал для друга (моделиста) эмуляцию горения свечи на 48 каналов (3 режима работы и настройка яркости на 4 патерна (12 каналов). Досконально не разбирался, но под конкретную задачу работа была выполнена, если интересно, могу выложить режим инициализации и управления (под конкретный режим (просто их там несколько видов), чип весьма гибкий и области применения весьма обширны (от управления сервами, до RGB-светодиодами). В общем чтобы было с чего стартовать...

Если не врать, немного не моё направление в настоящий момент, но заинтересовало. Мне бы, закончить хотя бы то, что начал. :) ДШ скачал и немножко по нему пробежался. Впечатляет.  :cool:

0

15

Значит так - теории у меня опять полная голова  %-)  :D
На практике пока туговато.
Хочу переспросить - Как же всё таки правильно отправлять TDA7313, по I2C команды на изменение значений уровней громкости и т.д.? Если точнее, то интересует меня вот что:
  Чтобы регулировать громкость, например от "А" до "Б", с ней необходимо каждый раз связываться по адресу (&H88), посылать суб.адрес и дата адрес? Или достаточно будет один раз в программе указать адрес устройства, с которым работаем?
  Далее:
Кто работал с подобными микрухами, подскажите пожалуйста, мне кажется пока не инициализируешь и не отправишь все байты на установку входа, баланса и прочих примочек, то звука не улышишь, хоть даже код у тебя и правильный. Или я ошибаюсь?
К ДШ можете не отсылать, у меня подобных уже более 30 штук. Читал. Сравнивал. Так и неразобрался. :dontknow:
Спасибо.

0

16

sevastopolets написал(а):

Кто работал с подобными микрухами

Когда-то делал для TDA8425, может пригодится:

Код:
$regfile = "m32def.dat"                                     'подключаем файл заголовков для контроллера ATmega32
$crystal = 8000000                                          'определяем частоту кварца/внутреннего генератора
$baud = 9600                                                'настройка скорости UART
$hwstack = 64                                               'аппаратный стек
$swstack = 64                                               'програмный стек
$framesize = 200                                            'размер фрейма

Config Lcd = 16 * 2                                         'дисплей 2 строки по 16 символов
'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1

Cursor Off                                                  'выключить курсор
Cls                                                         'очистить дисплей

Config Rc5 = Pinb.0                                         'на пин b0 подключен TSOP1736

Config Sda = Portb.1                                        'на пин b1 подключена линия Sda
Config Scl = Portb.2                                        'на пин b2 подключена линия Scl

Config Pinb.3 = Output                                      'настройка пина b3 на выход
Mute Alias Portb.3                                          'присваиваем пину b3 имя Mute

Config Pinb.4 = Output                                      'настройка пина b4 на выход
Power_amp Alias Portb.4                                     'присваиваем пину b4 имя Power_amp

Config Pinb.5 = Output                                      'настройка пина b5 на выход
Fan Alias Portb.5                                           'присваиваем пину b5 имя Fan

Config Pinb.6 = Output                                      'настройка пина b6 на выход
Red_led Alias Portb.6                                       'присваиваем пину b6 имя Red_led

Config Pinb.7 = Output                                      'настройка пина b7 на выход
Green_led Alias Portb.7                                     'присваиваем пину b7 имя Green_led

Config Pinc.6 = Output                                      'настройка пина c6 на выход
Yellow_led Alias Portc.6                                    'присваиваем пину c6 имя Yellow_led

Config 1wire = Portc.7                                      'на пин c7 подключен DS18B20

Config Pind.0 = Input                                       'настройка пина d0 на вход
Choice_mode Alias Pind.0                                    'присваиваем пину d0 имя Choice_mode
Set Portd.0                                                 'включить внутренний подтягивающий резистор

Config Pind.1 = Input                                       'настройка пина d1 на вход
Power_on_off Alias Pind.1                                   'присваиваем пину d1 имя Power_on_off
Set Portd.1                                                 'включить внутренний подтягивающий резистор

Config Pind.2 = Input                                       'настройка пина d2 на вход
Sw Alias Pind.2                                             'присваиваем пину d2 имя Sw
Set Portd.2                                                 'включить внутренний подтягивающий резистор

Config Pind.3 = Input                                       'настройка пина d3 на вход(вывод A энкодера)
Valcod_a Alias Pind.3                                       'присваиваем пину d3 имя Valcod_a
Set Portd.3                                                 'включить внутренний подтягивающий резистор
Config Pind.4 = Input                                       'настройка пина d4 на вход(вывод B энкодера)
Valcod_b Alias Pind.4                                       'присваиваем пину d4 имя Valcod_b
Set Portd.4                                                 'включить внутренний подтягивающий резистор                                                '

Config Pind.6 = Input                                       'настройка пина d6 на вход
Mute_on_off Alias Pind.6                                    'присваиваем пину d6 имя Mute_on_off
Set Portd.6                                                 'включить внутренний подтягивающий резистор

Config Pind.7 = Input                                       'настройка пина d7 на вход
Inputss Alias Pind.7                                        'присваиваем пину d7 имя Inputss
Set Portd.7                                                 'включить внутренний подтягивающий резистор

Config Int1 = Falling                                       'настраиваем внешнее прерывание INT1 на срабатывание при изменении из "1" в "0"
On Int1 Valcoder                                            'подпрограмма обработки прерывания Valcoder
Enable Int1                                                 'разрешаем работу прерывания  INT1
Enable Interrupts                                           'разрешаем глобальные прерывания

Config Clock = User                                         'работа с DS1307
Const Ds1307w = &HD0                                        'константа адреса  записи DS1307
Const Ds1307r = &HD1                                        'константа адреса  чтения DS1307
Config Date = Dmy , Separator = .                           'настраиваем способ отображения даты ДДММГГ, разделитель точка

Declare Sub Timbre_disp                                     'подпрограмма вывода значений тембра НЧ и ВЧ на дисплей
Declare Sub Balance                                         'подпрограмма расчета баланса
Declare Sub Vol_disp                                        'подпрограмма перевода цифровых значений громкости в dB
Declare Sub Convertt                                        'подпрограмма преобразования температуры датчика на шине 1wire
'Declare Sub Standby                                         'подпрограмма режима ожидания усилителя
Declare Sub Power_on                                        'подпрограмма основного режима работы усилителя
Declare Sub Setdatetime                                     'подпрограмма установки даты и времени
Declare Sub Month_disp                                      'подпрограмма перевода цифровых значений месяца в названия месяца

Dim Lsb As Byte                                             'переменная младшего байта DS18B20
Dim Msb As Byte                                             'переменная старшего байта DS18B20
Dim Temp As Byte                                            'переменная температуры
Dim Temp1 As Byte                                           'временная переменная для вычесления температуры
Dim Address As Byte                                         'переменная адреса Rc5
Dim Command As Byte                                         'переменная команды Rc5
Dim Vol As Byte                                             'переменная громкости
Dim Voll As Byte                                            'переменная громкости левого канала
Dim Volr As Byte                                            'переменная громкости правого канала
Dim Vol_disp As String * 5                                  'переменная громкости, выводимая на дисплей
Dim Bal As Byte                                             'переменная баланса
Dim Treble As Byte                                          'переменная тембра ВЧ
'Dim Treble_disp As String * 5                               'переменная тембра ВЧ, выводимая на дисплей
Dim Bass As Byte                                            'переменная тембра НЧ
'Dim Bass_disp As String * 5                                 'переменная тембра НЧ, выводимая на дисплей
Dim Inputs As Byte                                          'переменная номера входа TDA8425
Dim Subaddr As Byte                                         'переменная субадреса TDA8425
Dim Datas As Byte                                           'переменная данных TDA8425
Dim Swfunc As Byte                                          'переменная переключения функций TDA8425
Dim Chr_code As Byte                                        'переменная некоторых символов, хранящихся в памяти ЖКИ
Dim Menu As Byte                                            'переменная меню для энкодера
Dim Timbre As Byte                                          'переменная тембра
Dim Timbre_disp As String * 5                               'переменная тембра, выводимая на дисплей
Dim Choice_timbre As Bit                                    'переменная выбора тембра ВЧ или НЧ
Dim Z As Byte                                               'переменная знакоместа
Dim Mode_disp As String * 7                                 'переменная выбора звучания TDA8425, выводимая на дисплей
Dim Daysmonth As Byte                                       'переменная дней в месяце
Dim Month_disp As String * 8                                'переменная месяца, выводимая на дисплей
Dim Weekday_disp As String * 7                              'переменная дня недели, выводимая на дисплей
Dim Weekday_read As Byte                                    'переменная номера дня недели, считываемая из DS1307
Dim Weekday As Byte                                         'переменная номера дня недели
Dim Press_rc5 As Bit

Deflcdchar 0 , 31 , 31 , 31 , 17 , 31 , 31 , 31 , 31        'инверсный минус
Deflcdchar 1 , 31 , 32 , 32 , 32 , 32 , 32 , 32 , 31        'пустое деление шкалы
Deflcdchar 2 , 31 , 19 , 21 , 21 , 19 , 21 , 21 , 31        'инверсная буква R
Deflcdchar 3 , 31 , 23 , 23 , 23 , 23 , 23 , 17 , 31        'инверсная буква L
Deflcdchar 4 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        'знак градусов
Deflcdchar 5 , 32 , 2 , 6 , 26 , 18 , 26 , 6 , 2            'динамик
Deflcdchar 6 , 31 , 32 , 31 , 31 , 31 , 31 , 32 , 31        'полное деление шкалы
Deflcdchar 7 , 31 , 31 , 27 , 17 , 27 , 31 , 31 , 31        'инверсный плюс

Readeeprom Swfunc , 1
If Swfunc = 255 Then
Swfunc = 206
Writeeeprom Swfunc , 1
End If
Subaddr = 8
Datas = Swfunc
Gosub I2c

Readeeprom Vol , 2
If Vol = 255 Then
Vol = 222
Writeeeprom Vol , 2
End If
Subaddr = 0
Datas = Vol
Gosub I2c
Subaddr = 1
Datas = Vol
Gosub I2c

Readeeprom Bal , 3
If Bal = 255 Then
Bal = 4
Writeeeprom Bal , 3
Call Balance
End If

Readeeprom Bass , 4
If Bass = 255 Then
Bass = 246
Writeeeprom Bass , 5
End If
Subaddr = 2
Datas = 0
Gosub I2c

Readeeprom Treble , 5
If Treble = 255 Then
Treble = 246
Writeeeprom Treble , 4
End If
Subaddr = 3
Datas = Treble
Gosub I2c

Pwm1a = 40

Set Red_led                                                 'включаем красный светодиод питания

Reset Green_led                                             'выключаем зеленый светодиод питания

Standby:                                                    'подпрограмма режима ожидания усилителя
'*******************************************************************************
Cls                                                         'очищаем экран ЖКИ

Set Red_led                                                 'включаем красный светодиод питания

Reset Green_led                                             'выключаем зеленый светодиод питания

Do                                                          'начало основного цикла

Call Month_disp                                             'вызываем подпрограмму перевода цифровых значений месяца в названия месяца

Locate 1 , 1                                                'задаем позицию курсора
Lcd Time$                                                   'выводим на ЖКИ время, вызывая подпрограмму чтения времени из DS1307
Locate 2 , 1                                                'задаем позицию курсора
Lcd _day ; " " ; Month_disp                                 'выводим на ЖКИ значение переменной _day, пробел, значение переменной Month_disp
If _year < 10 Then                                          'если значение переменной _year < 10 то,
Lcd " 200" ; _year ; "    "                                 'выводим на ЖКИ, пробел, 200, значение переменной _year, 4 пробела
Else                                                        'иначе
Lcd " 20" ; _year ; "    "                                  'выводим на ЖКИ, пробел, 20, значение переменной _year, 4 пробела
End If                                                      'конец если

Weekday_read = Dayofweek()                                  'считываем номер дня недели из DS1307
Weekday_disp = Lookupstr(weekday_read , Weekdays)           'преобразовываем номер дня недели в название дня недели
Locate 1 , 10                                               'задаем позицию курсора
Lcd Weekday_disp                                            'выводим на ЖКИ значение переменной Weekday_disp

Gosub Rc5                                                   'переход на подпрограмму опроса Rc5

If Power_on_off = 0 Or Command = 12 Then                    'если Power_on_off = 0 или Command = 12, то
Waitms 100                                                  'подождать 100 мс
Set Power_amp                                               'включить питание усилителя
Call Power_on                                               'идти на подпрограмму основного режима работы усилителя
End If                                                      'конец если

If Command = 15 Then Pwm1a = 210 Else Pwm1a = 40

If Sw = 0 Then                                              'если Sw = 0, то
Waitms 100                                                  'подождать 100 мс
Call Setdatetime                                            'идти на подпрограмму установки даты и времени
End If                                                      'конец если

If Swfunc.5 = 1 Then                                        'если бит 5 Swfunc = 1, то
Reset Mute                                                  'выключить режим Mute
Swfunc.5 = Not Swfunc.5                                     'значение бита 5 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

Loop                                                        'конец основного цикла

End                                                         'конец программы

Sub Setdatetime                                             'подпрограмма установки даты и времени
'*******************************************************************************
Menu = 0

Pwm1a = 200

Set Red_led                                                 'включаем красный светодиод питания

Reset Green_led                                             'выключаем зеленый светодиод питания

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Month_disp                                             'вызываем подпрограмму перевода цифровых значений месяца в названия месяца

Locate 1 , 1                                                'задаем позицию курсора
If _hour < 10 Then                                          'если значение переменной _hour < 10 то,
Lcd "0" ; _hour ; ":"                                       'выводим на ЖКИ 0, значение переменной _hour, двоеточие
Else                                                        'иначе
Lcd _hour ; ":"                                             'выводим на ЖКИ значение переменной _hour, двоеточие
End If                                                      'конец если
If _min < 10 Then                                           'если значение переменной _min < 10 то,
Lcd "0" ; _min ; ":"                                        'выводим на ЖКИ 0, значение переменной _min, двоеточие
Else                                                        'иначе
Lcd _min ; ":"                                              'выводим на ЖКИ значение переменной _min, двоеточие
End If                                                      'конец если
Lcd "00"                                                    'выводим на ЖКИ 00
Locate 2 , 1                                                'задаем позицию курсора
Lcd _day ; " " ; Month_disp                                 'выводим на ЖКИ значение переменной _day, пробел, значение переменной Month_disp
If _year < 10 Then                                          'если значение переменной _year < 10 то,
Lcd " 200" ; _year ; "    "                                 'выводим на ЖКИ пробел, 200, значение переменной _year, 4 пробела
Else                                                        'иначе
Lcd " 20" ; _year ; "    "                                  'выводим на ЖКИ пробел, 20, значение переменной _year, 4 пробела
End If                                                      'конец если

Weekday_read = Dayofweek()                                  'считываем номер дня недели из DS1307
Weekday_disp = Lookupstr(weekday_read , Weekdays)           'преобразовываем номер дня недели в название дня недели
Locate 1 , 10                                               'задаем позицию курсора
Lcd Weekday_disp                                            'выводим на ЖКИ значение переменной Weekday_disp

If Sw = 0 Then                                              'если Sw = 0, то
Waitms 100                                                  'подождать 100 мс
Incr Menu                                                   'увеличить значение переменной Menu на 1
End If                                                      'конец если

If Menu = 6 Then                                            'если значение переменной Menu = 6, то
Gosub Standby                                               'идти на подпрограмму режима ожидания усилителя
End If                                                      'конец если

Loop                                                        'конец основного цикла

End Sub                                                     'конец подпрограммы

Sub Power_on                                                'подпрограмма основного режима работы усилителя
'*******************************************************************************
Menu = 7

Pwm1a = 200

Reset Red_led                                               'выключаем красный светодиод питания

Set Green_led                                               'включаем зеленый светодиод питания

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Convertt                                               'переход на подпрограмму преобразования температуры

Call Vol_disp                                               'переход на подпрограмму перевода цифровых значений громкости в dB

Call Balance                                                'переход на подпрограмму расчета баланса

If Temp => 38 Then                                          'если значение переменной Temp => 38, то
Set Fan                                                     'включить вентилятор охлаждения
Elseif Temp = 31 Then                                       'иначе если значение переменной Temp = 31, то
Reset Fan                                                   'выключить вентилятор охлаждения
End If                                                      'конец если

Locate 2 , 11                                               'задаем позицию курсора
Lcd "T=" ; Temp ; Chr(4) ; "C "                             'выводим на ЖКИ T=, значение переменной Temp, знак градусов, C, пробел

Locate 1 , 1                                                'задаем позицию курсора
Lcd "Bx."                                                   'выводим на ЖКИ Вх.

Locate 2 , 1                                                'задаем позицию курсора
Lcd "Ўp."                                                   'выводим на ЖКИ Гр.

Locate 2 , 5                                                'задаем позицию курсора
Lcd Vol_disp                                                'выводим на ЖКИ значение переменной Vol_disp

Select Case Swfunc                                          'выбираем из значений переменной Swfunc
Case 206 : Inputs = 1                                       'если значение переменной Swfunc = 206, то Inputs = 1(вход 1)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук включен
Case 207 : Inputs = 2                                       'если значение переменной Swfunc = 207, то Inputs = 2(вход 2)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук включен
Case 222 : Inputs = 1                                       'если значение переменной Swfunc = 222, то Inputs = 1(вход 1)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук включен
Case 223 : Inputs = 2                                       'если значение переменной Swfunc = 223, то Inputs = 2(вход 2)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук включен
Case 238 : Inputs = 1                                       'если значение переменной Swfunc = 238, то Inputs = 1(вход 1)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук выключен
Case 239 : Inputs = 2                                       'если значение переменной Swfunc = 239, то Inputs = 2(вход 2)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук выключен
Case 254 : Inputs = 1                                       'если значение переменной Swfunc = 254, то Inputs = 1(вход 1)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук выключен
Case 255 : Inputs = 2                                       'если значение переменной Swfunc = 255, то Inputs = 2(вход 2)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук выключен
End Select                                                  'закончить выбор

Locate 1 , 5                                                'задаем позицию курсора
Lcd Inputs                                                  'выводим на ЖКИ значение переменной Inputs

Locate 1 , 7                                                'задаем позицию курсора
Lcd Mode_disp                                               'выводим на ЖКИ значение переменной Mode_disp

If Inputss = 0 Then                                         'если Inputss = 0 , то
Waitms 100                                                  'подождать 100 мс
Swfunc.0 = Not Swfunc.0                                     'значение бита 0 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

If Swfunc.5 = 1 Then                                        'если бит 5 Swfunc = 1, то
Waitms 100                                                  'подождать 100 мс
Locate 1 , 15                                               'задаем позицию курсора
Lcd Chr(5) ; "x"                                            'выводим на ЖКИ символ динамика, x
Set Mute                                                    'включить режим Mute
Else                                                        'иначе
Locate 1 , 15                                               'задаем позицию курсора
Lcd "  "                                                    'выводим на ЖКИ 2 пробела
Reset Mute                                                  'выключить режим Mute
End If                                                      'конец если

If Choice_mode = 0 Then                                     'если Inputss = 0 , то
Waitms 100                                                  'подождать 100 мс
Swfunc.4 = Not Swfunc.4                                     'значение бита 4 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

Gosub Rc5                                                   'переход на подпрограмму опроса Rc5

If Mute_on_off = 0 Or Command = 13 Then                     'если Mute_on_off = 0 или Command = 13, то
Waitms 100                                                  'подождать 100 мс
Swfunc.5 = Not Swfunc.5                                     'значение бита 5 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Volume                                                'идти на подпрограмму
End If                                                      'конец если

If Power_on_off = 0 Or Command = 12 Then                    'если Power_on_off = 0 или Command = 12, то
Waitms 100                                                  'подождать 100 мс
Reset Fan                                                   'выключить вентилятор охлаждения
Reset Power_amp                                             'включить питание усилителя
Gosub Standby                                               'идти на подпрограмму режима ожидания усилителя
Cls                                                         'очищаем экран ЖКИ
End If                                                      'конец если

If Command = 32 Then                                        'если Command = 32
If Vol < 255 Then Incr Vol                                  'и если значение переменной Vol < 255, то увеличить значение переменной Vol на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Vol > 220 Then Decr Vol                                  'и если значение переменной Vol > 220, то уменьшить значение переменной Vol на 1
End If                                                      'конец если

Loop                                                        'конец основного цикла

End Sub                                                     'конец подпрограммы

Volume:
'*******************************************************************************
Menu = 8

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Locate 1 , 1                                                'задаем позицию курсора
Lcd "ЎpoјєocїД"                                             'выводим на ЖКИ надпись Громкость
Locate 1 , 12                                               'задаем позицию курсора
Lcd Vol_disp                                                'выводим на ЖКИ значение переменной Vol_disp

Locate 2 , 2                                                'задаем позицию курсора
Lcd Chr(0)                                                  'выводим на ЖКИ инверсный минус
Locate 2 , 15                                               'задаем позицию курсора
Lcd Chr(7)                                                  'выводим на ЖКИ инверсный плюс

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then                                        'если Command = 32
If Vol < 255 Then Incr Vol                                  'и если значение переменной Vol < 255, то увеличить значение переменной Vol на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Vol > 220 Then Decr Vol                                  'и если значение переменной Vol > 220, то уменьшить значение переменной Vol на 1
End If                                                      'конец если

Call Vol_disp                                               'переход на подпрограмму перевода цифровых значений громкости в dB

Call Balance                                                'переход на подпрограмму расчета баланса

Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Balance_disp                                          'идти на подпрограмму вывода шкалы баланса
End If                                                      'конец если

Select Case Vol                                             'выбираем из значений переменной Vol, выводим на ЖКИ шкалу громкости
Case 220 : Locate 2 , 3
Lcd Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 221 To 223 : Locate 2 , 3
Lcd Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 224 To 226 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 227 To 229 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 230 To 232 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 233 To 235 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 236 To 238 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 239 To 241 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 242 To 244 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 245 To 247 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1)
Case 248 To 250 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1)
Case 251 To 253 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1)
Case 254 To 255 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
End Select                                                  'закончить выбор

Loop                                                        'конец основного цикла

Sub Vol_disp                                                'подпрограмма перевода цифровых значений громкости в dB
'*******************************************************************************
Select Case Vol                                             'выбираем из значений переменной Vol, переводим в dB
Case 220 : Vol_disp = "-64dB"
Case 221 : Vol_disp = "-62dB"
Case 222 : Vol_disp = "-60dB"
Case 223 : Vol_disp = "-58dB"
Case 224 : Vol_disp = "-56dB"
Case 225 : Vol_disp = "-54dB"
Case 226 : Vol_disp = "-52dB"
Case 227 : Vol_disp = "-50dB"
Case 228 : Vol_disp = "-48dB"
Case 229 : Vol_disp = "-46dB"
Case 230 : Vol_disp = "-44dB"
Case 231 : Vol_disp = "-42dB"
Case 232 : Vol_disp = "-40dB"
Case 233 : Vol_disp = "-38dB"
Case 234 : Vol_disp = "-36dB"
Case 235 : Vol_disp = "-34dB"
Case 236 : Vol_disp = "-32dB"
Case 237 : Vol_disp = "-30dB"
Case 238 : Vol_disp = "-28dB"
Case 239 : Vol_disp = "-26dB"
Case 240 : Vol_disp = "-24dB"
Case 241 : Vol_disp = "-22dB"
Case 242 : Vol_disp = "-20dB"
Case 243 : Vol_disp = "-18dB"
Case 244 : Vol_disp = "-16dB"
Case 245 : Vol_disp = "-14dB"
Case 246 : Vol_disp = "-12dB"
Case 247 : Vol_disp = "-10dB"
Case 248 : Vol_disp = " -8dB"
Case 249 : Vol_disp = " -6dB"
Case 250 : Vol_disp = " -4dB"
Case 252 : Vol_disp = "  0dB"
Case 253 : Vol_disp = " +2dB"
Case 254 : Vol_disp = " +4dB"
Case 255 : Vol_disp = " +6dB"
End Select                                                  'закончить выбор

End Sub                                                     'конец подпрограммы

Balance_disp:                                               'подпрограмма вывода шкалы баланса
'*******************************************************************************
Menu = 9

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Locate 1 , 1                                                'задаем позицию курсора
Lcd " a»aЅc"                                                'выводим на ЖКИ надпись Баланс
Locate 1 , 12
Lcd Bal

Locate 2 , 3                                                'задаем позицию курсора
Lcd Chr(3)                                                  'выводим на ЖКИ инверсную букву L
Locate 2 , 14                                               'задаем позицию курсора
Lcd Chr(2)                                                  'выводим на ЖКИ инверсную букву R

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then                                        'если Command = 32
If Bal < 8 Then Incr Bal                                    'и если значение переменной Bal < 8 , то увеличить значение переменной Bal на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Bal > 0 Then Decr Bal                                    'и если значение переменной Bal > 0, то уменьшить значение переменной Bal на 1
End If                                                      'конец если

Call Balance                                                'переход на подпрограмму расчета баланса

Select Case Bal                                             'выбираем из значений переменной Bal, выводим на ЖКИ шкалу баланса
Case 0 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 1 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(6)
Case 2 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(1) ; Chr(6) ; Chr(6)
Case 3 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(6) ; Chr(6) ; Chr(6)
Case 4 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 5 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 6 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 7 : Locate 2 , 4
Lcd Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 8 : Locate 2 , 4
Lcd Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
End Select                                                  'закончить выбор

Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Treble                                                'идти на подпрограмму
End If                                                      'конец если

Loop                                                        'конец основного цикла

Treble:
'*******************************************************************************
Menu = 10

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Timbre_disp                                            'переход на подпрограмму вывода значений тембра НЧ и ВЧ на дисплей

Set Choice_timbre                                           'выставляем битовую переменную Choice_timbre

Locate 1 , 1                                                'задаем позицию курсора
Lcd "TeјІp B«"                                              'выводим на ЖКИ надпись Тембр ВЧ

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then                                        'если Command = 32
If Treble < 250 Then Incr Treble                            'и если значение переменной Treble < 250 , то увеличить значение переменной Treble на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Treble > 242 Then Decr Treble                            'и если значение переменной Treble > 242, то уменьшить значение переменной Treble на 1
End If                                                      'конец если

Subaddr = 3
Datas = Treble
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425

Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Bass                                                  'идти на подпрограмму
End If

Loop                                                        'конец основного цикла

Bass:
'*******************************************************************************
Menu = 11

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Timbre_disp                                            'переход на подпрограмму вывода значений тембра НЧ и ВЧ на дисплей

Reset Choice_timbre                                         'сбрасываем битовую переменную Choice_timbre

Locate 1 , 1                                                'задаем позицию курсора
Lcd "TeјІp H«"                                              'выводим на ЖКИ надпись Тембр НЧ

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then
If Bass < 251 Then Incr Bass
End If

If Command = 33 Then
If Bass > 242 Then Decr Bass
End If

Subaddr = 2
Datas = Bass
Gosub I2c

Gosub Writerom

If Bass < 251 Then
Locate 2 , 13                                               'задаем позицию курсора
Lcd Chr(1)
End If

If Bass = 251 Then
Timbre_disp = "+15dB"
Locate 2 , 13                                               'задаем позицию курсора
Lcd Chr(6)
End If

If Command = 59 Then
Waitms 10
Gosub Power_on
End If

If Sw = 0 Then
Waitms 10
Gosub Power_on
End If

Loop

Sub Timbre_disp
'*******************************************************************************
Locate 1 , 12                                               'задаем позицию курсора
Lcd Timbre_disp                                             'выводим на ЖКИ значение переменной Timbre_disp

Locate 2 , 4                                                'задаем позицию курсора
Lcd Chr(0)                                                  'выводим на ЖКИ инверсный минус

If Choice_timbre = 1 Then
Timbre = Treble
Z = 13
Locate 2 , 14                                               'задаем позицию курсора
Lcd " "
Else
Timbre = Bass
Z = 14
End If

Locate 2 , Z                                                'задаем позицию курсора
Lcd Chr(7)                                                  'выводим на ЖКИ инверсный плюс

Select Case Timbre
Case 242 : Timbre_disp = "-12dB"
Locate 2 , 5
Lcd Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 243 : Timbre_disp = " -9dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 244 : Timbre_disp = " -6dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 245 : Timbre_disp = " -3dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 246 : Timbre_disp = "  0dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 247 : Timbre_disp = " +3dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 248 : Timbre_disp = " +6dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 249 : Timbre_disp = " +9dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1)       '; Chr(1)
Case 250 : Timbre_disp = "+12dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)       '; Chr(1)
End Select

End Sub

Sub Month_disp                                              'подпрограмма перевода цифровых значений месяца в названия месяца
'*******************************************************************************
Select Case _month

Case 1 : Month_disp = "ЗЅіapЗ"                              'января
Daysmonth = 31
Case 2 : Month_disp = "дeіpa»З"                             'февраля
Daysmonth = _year And &H03                                  'проверяем на високосный год
If Daysmonth = 0 Then                                       'если год високосный (переменная Daysmonth = 0)
Daysmonth = 29                                              'то переменная Daysmonth = 29
Else                                                        'иначе
Daysmonth = 28                                              'переменная Daysmonth = 28
End If
Case 3 : Month_disp = "јapїa"                               'марта
Daysmonth = 31
Case 4 : Month_disp = "aѕpe»З"                              'апреля
Daysmonth = 30
Case 5 : Month_disp = "јaЗ"                                 'мая
Daysmonth = 31
Case 6 : Month_disp = "ёЖЅЗ"                                'июня
Daysmonth = 30
Case 7 : Month_disp = "ёЖ»З"                                'июля
Daysmonth = 31
Case 8 : Month_disp = "aіґycїa"                             'августа
Daysmonth = 31
Case 9 : Month_disp = "ceЅїЗІpЗ"                            'сентября
Daysmonth = 30
Case 10 : Month_disp = "oєїЗІpЗ"                            'октября
Daysmonth = 31
Case 11 : Month_disp = "ЅoЗІpЗ"                             'ноября
Daysmonth = 30
Case 12 : Month_disp = "гeєaІpЗ"                            'декабря
Daysmonth = 31

End Select
End Sub

Sub Balance
'*******************************************************************************
Voll = 0
Volr = 0
If Bal < 5 Then                                             'если Bal < 5, то преобладает левый баланс
Volr = Bal * 3                                              'вычисляем значение уменьшения
Volr = 15 - Volr                                            'громкости для правого канала
Volr = Vol - Volr                                           'рассчитываем значение для правого канала
Subaddr = 1                                                 'отправляем его в TDA
Datas = Volr
Gosub I2c
Elseif Bal = 5 Then                                         'если B = 5 , то в обоих каналах одинаковая громкость
Voll = Vol
Volr = Vol
Subaddr = 0                                                 'отправляем его в TDA
Datas = Vol
Gosub I2c
Subaddr = 1
Datas = Vol
Gosub I2c
Elseif Bal > 5 Then                                         'если Bal > 5 , то преобладает правый баланс
Voll = Bal - 5                                               'вычисляем значение уменьшения
Voll = Voll * 3                                             'громкости для левого канала
Voll = Vol - Voll                                           'рассчитываем значение для левого канала
Subaddr = 0                                                 'отправляем его в TDA
Datas = Voll
Gosub I2c
End If

End Sub

Valcoder:                                                   'подпрограмма обработки прерывания INT1
'*******************************************************************************
Select Case Menu
Case 1 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _year < 50 Then Incr _year                               'то если  переменная _year не достигла значения 50 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _year > 9 Then Decr _year                                'то если  переменная _year не достигла значения 9 уменьшаем ее на 1
End If
Case 2 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _month < 12 Then Incr _month                             'то если  переменная _month не достигла значения 12 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _month > 1 Then Decr _month                              'то если  переменная _month не достигла значения 1 уменьшаем ее на 1
End If
Case 3 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _day < Daysmonth Then Incr _day                          'то если  переменная _day не достигла значения переменной Daysmonth увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _day > 1 Then Decr _day                                  'то если  переменная _day не достигла значения 1 уменьшаем ее на 1
End If
Gosub Setdate                                               'перехоод на подпрограмму записи даты в DS1307
Gosub Getdatetime                                           'перехоод на подпрограмму чтения данных из DS1307
Case 4 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _hour < 23 Then Incr _hour                               'то если  переменная _hour не достигла значения 23 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _hour > 0 Then Decr _hour                                'то если  переменная _hour не достигла значения 0 уменьшаем ее на 1
End If
Case 5 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _min < 59 Then Incr _min                                 'то если  переменная _min не достигла значения 59 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _min > 0 Then Decr _min                                  'то если  переменная _min не достигла значения 0 уменьшаем ее на 1
End If
_sec = 0
Gosub Settime                                               'перехоод на подпрограмму записи времени в DS1307
Gosub Getdatetime                                           'перехоод на подпрограмму чтения данных из DS1307
Case 8 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If Vol < 255 Then Incr Vol                                  'то если  переменная Vol не достигла значения 255 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Vol > 220 Then Decr Vol                                  'то если  переменная Vol не достигла значения 220 уменьшаем ее на 1
End If
Case 9 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If Bal < 8 Then Incr Bal                                    'то если  переменная Bal не достигла значения 8 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Bal > 0 Then Decr Bal                                    'то если  переменная Bal не достигла значения 0 уменьшаем ее на 1
End If
Case 10 : If Valcod_b = 1 Then                              'если на линии B лог "1"
If Treble < 250 Then Incr Treble                            'то если  переменная Treble не достигла значения 250 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Treble > 242 Then Decr Treble                            'то если  переменная Treble не достигла значения 242 уменьшаем ее на 1
End If
Case 11 : If Valcod_b = 1 Then                              'если на линии B лог "1"
If Bass < 251 Then Incr Bass                                'то если  переменная Bass  не достигла значения 251 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Bass > 242 Then Decr Bass                                'то если  переменная Bass  не достигла значения 242 уменьшаем ее на 1
End If
End Select

Return                                                      'возврат из подпрогрммы

Getdatetime:                                                'подпрограмма чтения данных из DS1307
'*******************************************************************************
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 0                                                ' начальный адрес в DS1307

  I2cstart                                                  '  I2C START
  I2cwbyte Ds1307r                                          ' константа адрес чтения  DS1307
  I2crbyte _sec , Ack                                       ' чтение значения СЕКУНД
  I2crbyte _min , Ack                                       ' чтение значения МИНУТ
  I2crbyte _hour , Ack                                      ' чтение значения ЧАСА
  I2crbyte Weekday , Ack                                    ' чтение значения НЕДЕЛИ
  I2crbyte _day , Ack                                       ' чтение значения ДНЯ
  I2crbyte _month , Ack                                     ' чтение значения МЕСЯЦА
  I2crbyte _year , Nack                                     ' чтение значения ГОДА
  I2cstop                                                   'I2C STOP
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)       'преобразуем все переменные в десятичный вид
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)       'преобразуем все переменные в десятичный вид
Return                                                      'возврат из подпрогрммы

Setdate:                                                    'подпрограмма записи даты в DS1307
'*******************************************************************************
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)       'преобразуем все переменные в двоичный вид
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 4                                                ' начальный адрес в DS1307
  I2cwbyte _day                                             ' запись ДЕНЬ
  I2cwbyte _month                                           ' запись МЕСЯЦ
  I2cwbyte _year                                            ' запись ГОД
  I2cstop                                                   'I2C STOP
Return                                                      'возврат из подпрогрммы

Settime:                                                    'подпрограмма записи времени в DS1307
'*******************************************************************************
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)       'преобразуем все переменные в двоичный вид
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 0                                                ' начальный адрес в DS1307
  I2cwbyte _sec                                             ' запись СЕКУНД
  I2cwbyte _min                                             ' запись МИНУТ
  I2cwbyte _hour                                            ' запись ЧАСА
  I2cstop                                                   'I2C STOP
Return                                                      'возврат из подпрогрммы

Sub Convertt
'*******************************************************************************
1wreset                                                     'сбросить шину 1wire
1wwrite &HCC                                                'выдаем команду чтения ПЗУ датчика
1wwrite &H44                                                ' Convert T
'Waitms 750
1wreset                                                     'сбросить шину 1wire
1wwrite &HCC                                                'выдаем команду чтения ПЗУ датчика
1wwrite &HBE                                                'команда чтения ОЗУ датчика
Lsb = 1wread()                                              'читаем младший байт
Msb = 1wread()                                              'читаем старший байт
Temp = Lsb / 16                                             'сдвигаем младший байт вправо на 4 бита
Temp1 = Msb * 16                                            'сдвигаем старший байт влево на 4 бита
Temp = Temp + Temp1                                         'формирмируем результам
End Sub

Rc5:
'*******************************************************************************
Getrc5(address , Command)                                   'считать код RC-5
'If Address = 0 Then                                         'если адрес = 0,
Command = Command And &B01111111                            'то наложить маску
'End If
Return                                                      'возврат из подпрогрммы

I2c:                                                        'подпрограмма записи значений в TDA8425
'*******************************************************************************
I2cstart
I2cwbyte 130
I2cwbyte Subaddr
I2cwbyte Datas
I2cstop
Return                                                      'возврат из подпрогрммы

Writerom:                                                   'подпрограмма записи значений в EEPROM
'*******************************************************************************
Writeeeprom Swfunc , 1
Writeeeprom Vol , 2
Writeeeprom Bal , 3
Writeeeprom Bass , 4
Writeeeprom Treble , 5
Return                                                      'возврат из подпрогрммы

Weekdays:
'*******************************************************************************
Data "ЁoЅeг. "                                              'Понед.
Data "BїopЅёє"                                              'Вторник
Data "Cpeгa  "                                              'Среда
Data "«eїіepґ"                                              'Четверг
Data "ЁЗїЅёеa"                                              'Пятница
Data "CyІІoїa"                                              'Суббота
Data "Bocєp. "                                              'Воскр.

+1

17

max написал(а):

Когда-то делал для TDA8425, может пригодится:

Конечно пригодится!!!  :cool:  Копипаст делать не привык. Своё хочется.
Спасибо огромное, MAX.
Я так и знал, что эту тему ты не обойдёшь стороной. Знаю, что был у тебя опыт.
Спасибо.  :music:

Отредактировано sevastopolets (2015-04-05 20:32:09)

0

18

Не вопрос.

0

19

можно отправлять так! все работает тока проверил!
I2cstart
I2cwbyte &B10001000 ' адрес
I2cwbyte &B00000000 ' Громкость
I2cwbyte &B10110100 ' RF
I2cwbyte &B10010100 ' LF
I2cwbyte &B11110100 ' RR
I2cwbyte &B11010100 ' LR
I2cwbyte &B01001001 ' Audio in
I2cwbyte &B01101111 ' Басс
I2cwbyte &B01111111 ' Тэмбр

потом в отдельности можно так ...
I2cstart
I2cwbyte &B10001000 ' адрес
I2cwbyte &B00000000 ' Громкость
I2cstop

+1

20

sevastopolets написал(а):

Хочу переспросить - Как же всё таки правильно отправлять TDA7313, по I2C команды на изменение значений уровней громкости и т.д.?

Если посмотрите в таблицы, то увидите закономерность в старших битах байта - это признак принадлежности команды/настроек/регистров  TDA7313.
Я в коде подчеркиваниями специально это всё выделил, чтобы было наглядно (видимо не было).  :D
Например для регулировки общей громкости нужно менять значения "ААА" и "ВВВ":

Код:
I2cstart
I2cwbyte &B1000_1000 ' addr
I2cwbyte &B00_ААА_ВВВ ' volume - 0 dB
I2cstop

ААА - это шаг по 10дБ (3 бита)
ВВВ - шаг по 1.25дБ (3 бита)

ААА и ВВВ - это биты в байте, следовательно чтобы по шагу производить регулировку, то нужно использовать операции над битами (AND + OR + ROTATE).

Если нужно регулировать ВЧ/НЧ, то:

Код:
I2cstart
I2cwbyte &B1000_1000 ' addr
I2cwbyte &B0110_BBBB ' Bass - 0dB 
I2cwbyte &B0111_TTTT ' Trible - 0dB
I2cstop

BBBB - регулировка баса (4 бита)
TTTT - регулировка верхов (4 бита)

И т.д...чип по первой/начальной тетраде понимает к какому типу относится команда.

+1

21

Та не. Это для меня давно стало понятно.

Elehome написал(а):

можно отправлять так! все работает тока проверил!
I2cstart
I2cwbyte &B10001000 ' адрес
I2cwbyte &B00000000 ' Громкость
I2cwbyte &B10110100 ' RF
I2cwbyte &B10010100 ' LF
I2cwbyte &B11110100 ' RR
I2cwbyte &B11010100 ' LR
I2cwbyte &B01001001 ' Audio in
I2cwbyte &B01101111 ' Басс
I2cwbyte &B01111111 ' Тэмбр

потом в отдельности можно так ...
I2cstart
I2cwbyte &B10001000 ' адрес
I2cwbyte &B00000000 ' Громкость
I2cstop


А вот это я как раз и пытался узнать (спросить). :) Можно ли посылать в неё всё сразу или нет?
Просто я неправильно вопрос поставил. Спасибо всем. Буду разбираться.

Отредактировано sevastopolets (2015-04-06 19:14:59)

0

22

и сразу все и по отдельности! сначало адрес потом комманда! потом стоп соответственно!

0

23

Пишу поделиться "горьким" опытом управления TDA7313 и им подобными.
В общем "боролся" я с этим делом, если посмотреть на дату предпоследнего сообщения - почти месяц!! Ничего не работало. Ничего не получалось. А снова сюда писать было стыдно, тем более что разжевали мне так, что даже самый тупой бы понял, как этим "хозяйством" надо управлять. Даже готовый проект MAX выложил!! (Отдельное ОГРОМНОЕ спасибо).
И вот, сидя очередным вечером и перечитывая вновь и вновь все даташиты... (уже на всё, что только можно с шиной I2C  :D ) я вдруг понял, что БА-НА-ЛЬ-НО!! не поставил на выходе TDA7440 - электролитические конденсаторы!!. (в ДШ их нет)............ Поставил......... И......... О, Боже!!!!...... Звук есть, регулировка на месте и т.д.!! Аааааааааааааааа!!!
Не поверите, из за такой вот мелочи, я себя морально изнасиловал!!  :rofl:  :rofl:  :rofl:
Спасибо всем, кто отозвался и всем тем, кто следил за темой, но оставался в стороне.
Всё работает, всё - СУПЕР!!  :cool:
МОРАЛЬ - Вот и верь после этого даташитам!!  :rofl:

Отредактировано sevastopolets (2015-04-28 22:55:34)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » как управлять ТДА7313?