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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление аудиопроцессором TDA7449.


Управление аудиопроцессором TDA7449.

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

1

Делаю в приемник электронную регулировку звука на TDA7449, и появилось несколько непоняток. Кто в теме, прошу помощи. Изучил Datasheet. Подключение строго по схеме. Управление по I2C, адрес устройства &H88. Потом прописывается субадрес &B000B0000. Если В = 1, то субадрес инкременируется. Если В = 0 , каждый субадрес прописывается ручками. По идее должно получиться так:

Код:
I2Cinit
I2cstart
i2cwbyte &H88
I2cwbyte &B000010000
I2cwbyte Выбор входа
I2cwbyte Предварительное_усиление
I2cwbyte Громкость
I2cwbyte НЧ
I2cwbyte ВЧ
I2cwbyte Аттенюатор_правый
I2cwbyte Аттенюатор_левый
I2cstop

Все загрузилось, кроме НЧ и ВЧ ( default +2 dB) и Аттенюатор_левый (default MUTE). Решил вручную прописать все настройки, выставив В = 0. Не загрузилось ничего. Все настройки остались по умолчанию.

INPUT SELECTION                IN2
INPUT GAIN                        28dB
VOLUME                              MUTE
BASS                                  2dB
TREBLE                               2dB
SPEAKER                             MUTE

Методом проб и ошибок удалось запустить процессор вот так:

Код:
 I2cinit
 I2cstart
 I2cwbyte &H88
 I2cwbyte &B10000                  ' инкременируем субадрес
 I2cwbyte Inp_ut                     ' вход 1
 I2cwbyte Gain_v                     ' предвар. усиление + 10 dB
 I2cwbyte Vol_me                    ' громкость -47 dB
 I2cstop
 I2cstart
 I2cwbyte &H88
 I2cwbyte &B10100                    ' инкременируем субадрес
 I2cwbyte Bas_ss                       ' НЧ 0dB
 I2cwbyte Tre_le                        ' ВЧ 0dB
  I2cstop
 I2cstart
 I2cwbyte &H88
 I2cwbyte &B10110                      ' инкременируем субадрес
 I2cwbyte Att_rf                          ' аттенюатор левый  0dB
 I2cwbyte Att_lf                          ' аттенюатор правый  0dB
   I2cstop

Звучит, конечно, приятно, но нет регулировки ВЧ и НЧ (default + 2 dB). Все остальное работает. На I2C еще сидит RDA5807M, но я ее отключал и убирал из кода все упоминания о ней. Никаких изменений. Прошу помощи у знатоков.

0

2

С нулями "палехчи" чувак  :D
Внимательнее посмотри на свою "писанину"  :rofl:
Для облихчения в баскоме есть такая фича: &b_0000_1000  для простоты видимости.

0

3

А обязательно через инкремент ?
Не проще для каждого субадреса сделать подпрограмму и вызывать при необходимости ?

Код:
bass:
I2cstart
I2cwbyte &H88
I2cwbyte &H04                      ' субадрес BASS
I2cwbyte <переменная>       ' указываем требуемое значение
I2cstop
Return

treble:
I2cstart
I2cwbyte &H88
I2cwbyte &H05                      ' субадрес TREBLE
I2cwbyte <переменная>       ' указываем требуемое значение
I2cstop
Return

При инициализации просто чередовать субадреса:

Код:
...
<переменная> = ххх      ' указываем требуемое значение
Gosub input_select
<переменная> = ххх      ' указываем требуемое значение
Gosub input_gain
...
<переменная> = ххх      ' указываем требуемое значение
Gosub bass
<переменная> = ххх      ' указываем требуемое значение
Gosub treble
...

Можно даже субадрес отправлять переменной, тогда ПП отправки будет одна "на все случаи жизни", меняй себе субадрес и значение...

Отредактировано Nord (2018-06-22 22:42:40)

0

4

Я, наверное, непонятно объяснил, что меня не устраивает. При включении переменным, предназначенным для записи в TDA присваиваю некоторые значения , потом они будут считываться из памяти :

Код:
Gain_v = &B00000101   'предварит. усиление  10 dB
Gain_d = 0
Gain = 1
Vol_me = &B00101111        ' громкость -47 dB
Inp_ut = &B00000011         ' вход 1
Att_lf = &B00000000           ' аттенюатор левый 0dB
Att_rf = &B00000000          ' аттенюатор правый 0dB
Bas_ss = &B00000000         ' низкие частоты 0dB
Tre_le = &B00000000          ' высокие частоты 0dB


Потом я их записываю в процессор.

Код:
 I2cinit
 I2cstart
 I2cwbyte &H88
 I2cwbyte &B00010000
 I2cwbyte Inp_ut                     ' выбор входа
 I2cwbyte Gain_v                    ' предвар. усиление
 I2cwbyte Vol_me                   ' громкость 
 I2cstop
 I2cstart
 I2cwbyte &H88
 I2cwbyte &B00010100
 I2cwbyte Bas_ss                      ' НЧ
 I2cwbyte Tre_le                       ' ВЧ
  I2cstop
 I2cstart
 I2cwbyte &H88
 I2cwbyte &B00010110
 I2cwbyte Att_rf                         ' аттенюатор правый
 I2cwbyte Att_lf                         ' аттенюатор левый
   I2cstop


Именно с этим кодом записалось все, кроме Bas_ss и Tre_le
Далее, подпрограмма регулировки низких частот.

Код:
'------------ НЧ ----------------------
Sub Tonesh:
Select Case H
Case 1 : Decr Tonb
         If Tonb < 1 Then Tonb = 1
Case 0 : Incr Tonb
         If Tonb > 16 Then Tonb = 16
End Select

Select Case Tonb
   Case 1 : Bas_ss = &B00000000
   Case 2 : Bas_ss = &B00000001
   Case 3 : Bas_ss = &B00000010
   Case 4 : Bas_ss = &B00000011
   Case 5 : Bas_ss = &B00000100
   Case 6 : Bas_ss = &B00000101
   Case 7 : Bas_ss = &B00000110
   Case 8 : Bas_ss = &B00000111
   Case 9 : Bas_ss = &B00001111
   Case 10 : Bas_ss = &B00001110
   Case 11 : Bas_ss = &B00001101
   Case 12 : Bas_ss = &B00001100
   Case 13 : Bas_ss = &B00001011
   Case 14 : Bas_ss = &B00001010
   Case 15 : Bas_ss = &B00001001
   Case 16 : Bas_ss = &B00001000
   End Select
   Waitms 100
  Locate 1 , 1 : Lcd bas_ss              ' смотрим что записывается в TDA
  I2cstart
  I2cwbyte &H88
  I2cwbyte &B00000100
  I2cwbyte Bas_ss
  I2cstop
End Sub

У меня все работает, кроме регулировки высоких и низких частот.  Bas_ss принимает нужные значения (специально вывел на LCD посмотреть ), как по даташиту  0-1-2-3-4-5-6-7-15-14-13-12-11-10-9-8, но на слух никаких изменений нет. И мне, не столь важно, почему инкремент субадреса работает криво, или не работает вообще. Мне хочется понять, почему не регулируются частоты. TDAшку менял, ничего не изменилось.

0

5

А вы емкости по входам все повесили и правильного номинала?
Остальное управление вроде как "Input gain selection", такое же (из датащита).

0

6

Да, все по даташиту.
INPUT SELECT
при включении выбирается IN1 &B00000011, кнопкой переключается IN2 &B00000010
INPUT GAIN
четыре предустановленных значения.
&B00000101  10 dB
&B00001000  16 dB
&B00001100  24 dB
&B00001111  30 dB
При включении +10dB, кнопками изменяется +16 +24 +30 dB
VOLUME
при включении -47 dB кнопками изменяется до 0 и обратно
SPEAKER ATTENUATE SELECTION
используется для регулировки баланса при включении оба канала 0dB, регулировка от 0 до -7dB. То же работает.
Из изменений в схеме только на входе керамика 0,82 мкф. Вот ТУТ автор посчитал, что так будет правильнее.

0

7

ТВОЮ Ж МАТЬ! ВОТ Я ОЛЕНЬ! Оказывается вместо TDA7449 мне привезли TDA7449L. Не посмотрел, и вот результат. Там регулятор тембров отсутствует. Завтра пойду разбираться. Тема закрыта. Всем спасибо.

0

8

Ну что-ж, молодец хоть, что не постеснялся отписать, хороший урок на будущее для всех (перепроверять).

0

9

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

Завтра пойду разбираться

только без рук, Лелик! (ц)  :D
хотя... если надеть маску голубя....

0

10

Спрошу здесь, чтобы не создавать новую тему. Приемник доделал, правда вместо TDA7449 поставил TDA7439. Там еще регулировка средних частот есть. Все красиво заработало, на макетке. Спаял плату, кнопки управления перенес с PORTB на PORTC, так было удобнее. И вот тут начались глюки. АЦП ловит наводки от руки. Показания на индикаторе скачут, мерцают и т. д. и т. п. Можно это как то победить, или только назад кнопки цеплять? Плату переделывать не хочется.

0

11

Спрошу по другому. Вот так работает четко, никаких наводок.

Код:
 Ddrc = &B00000
 Portc = &B11111
Config Scl = Portc.5
Config Sda = Portc.4
 Menu Alias Pinc.0
 Plus Alias Pinc.1
 Minus Alias Pinc.2
 S_tereo Alias Pinc.3

А вот так не хочет работать.

Код:
Config Scl = Portc.5
Config Sda = Portc.4
  Config Pinc.0 = Input : Pinc.0 = 1 : Menu Alias Pinc.0
  Config Pinc.1 = Input : Pinc.1 = 1 : Plus Alias Pinc.1
  Config Pinc.2 = Input : Pinc.2 = 1 : Minus Alias Pinc.2
  Config Pinc.3 = Input : Pinc.3 = 1 : S_tereo Alias Pinc.3

Идут наводки от руки при приближении, мерцает индикатор. А бывает, что все режимы начинают сами переключаться, как будто нажаты все кнопки. Померял напряжение на кнопках 2,5 вольта. Хотелось бы понять почему так получилось.

0

12

Вместо

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

Config Pinc.0 = Input :
Config Pinc.1 = Input :
Config Pinc.2 = Input :
Config Pinc.3 = Input :

Думаю, правильнее будет

Config PORT.0 = Input :
Config PORT.1 = Input :
Config PORT.2 = Input :
Config PORT.3 = Input :

0

13

Пробовал и так и так. Работает одинаково.

0

14

В первом случае:
Ddrc = &B00000         - включаем порт режим "Вход" (регистр DDRx)
Portc = &B11111        - загоняем в порт (регистр "выход") значение "1"

В втором случае:
Config Pinc.0 = Input  - присваиваем регистру "вход" значение "выход"
Pinc.0 = 1                  - загоняем в регистр "вход" значение "1"

В чем логика ? ;)
Перепутаны понятия...

И еще вопросы...
Кнопки наверняка на GND замыкаются, если "Pinc.0 = 1" ?
Подтяжки до Vпит имеются ?
Без подтяжек ножка, настроенная на "вход", может служить прекрасной антенной для наводок...

Еще один вариант - какой МК ?
Если Мега8 или подобный по цоколевке, то куда подключена ножка AVCC ?

Отредактировано Nord (2018-08-04 05:28:43)

0

15

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

Config Pinc.0 = Input  - присваиваем регистру "вход" значение "выход"

гуглопереводчик клянется, что Input - это Вход  :confused:

0

16

ну дык в первом случае идет подвязка портов к питанию, а втором нет)

0

17

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

ну дык в первом случае идет подвязка портов к питанию, а втором нет)

А разве PORTC.X = 1 это не подтяжка к + 5В?

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

Еще один вариант - какой МК ?
Если Мега8 или подобный по цоколевке, то куда подключена ножка AVCC ?

Да, Мега8. AVCC изначально никуда не подключал, потом подключил к питанию. Ничего не изменилось.

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

В чем логика ? ;)
Перепутаны понятия...

Тогда хотелось бы уточнить, как, все таки правильно. На одних сайтах пишут Config PORTC.X = Input, на других
Config PINC.X = Input.
Вот из хелпа Bascom"a
http://s9.uploads.ru/t/YqWs1.jpg
И перевод, машинный.
X                                        Действительная буква порта, такая как A, B, C и т. Д.
                                                 Пример: CONFIG PORTB = OUTPUT

Y                                        Действительный номер штыря в диапазоне 0-7.
                                                 Пример: CONFIG PINB.0 = INPUT
Так как правильно?

0

18

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

А разве PORTC.X = 1 это не подтяжка к + 5В?

вроде как не совсем. это установка на порту (порте, портя) лог.1 а не включение подтягивающих резюков. а аппаратно подтянуть уже не получится?

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

AVCC изначально никуда не подключал, потом подключил к питанию. Ничего не изменилось.

керамику 0.1мкф не пробовали на питание?

0

19

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

керамику 0.1мкф не пробовали на питание?

Керамику цепляю везде и всегда, и по несколько штук. Повторюсь, что через DDRC все заработало нормально, и без подтягивающих резисторов, и с подключением AVCC к питанию.

0

20

Andrusha
так все верно. командой Portc = &B11111 вы включаете подтяжку. а командой Pinc.0 = 1 всего лишь один раз суете в порт единицу, которая после первого же нажатия сбрасывается и вы остаетесь без подтяжки уапще  :D

0

21

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

А разве PORTC.X = 1 это не подтяжка к + 5В?

В конкретном примере, ничего подобного нет. "Pin" используется только для опроса порта/входа, но никак не для конфигурирования (должно быть "port").

0

22

Вот теперь все понятно. Большое спасибо всем.

0

23

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

Да, Мега8. AVCC изначально никуда не подключал, потом подключил к питанию. Ничего не изменилось.

Дело в том, что порт, на котором имеются АЦП, питается от AVCC...
О последствиях -   читаем ДШ.
Не удивлюсь, что порт уже частично нерабочий по этой причине...

0

24

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

гуглопереводчик клянется, что Input - это Вход

Очепятка...  :blush:

0

25

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

так все верно. командой Portc = &B11111 вы включаете подтяжку. а командой Pinc.0 = 1 всего лишь один раз суете в порт единицу, которая после первого же нажатия сбрасывается и вы остаетесь без подтяжки уапще

И как давно это стало? PINC.x=1 разве не тоже самое что SET PINC.X ? Если в программе больше ни где не менять состояние данного пина или порта то как оно может само взять и сбросится? Это что то новенькое.

Всегда порты настраиваю на вход так
Kn_up Alias Pind.7 : Config Kn_up = Input : Set Kn_up
Kn_down Alias Pind.6 : Config Kn_down = Input : Set Kn_down
Kn_mode Alias Pind.5 : Config Kn_mode = Input : Set Kn_mode

Мне лично так удобнее при смене портов. В одном месте меняется нужный пин на другой.
И ни каких внешних резисторов для подтяжки не использую. Даже с энкодером трещёткой. Работает без проблем даже с емкостями 47 нан на ножках.

Отредактировано zenit (2018-08-05 01:43:43)

0

26

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

Всегда порты настраиваю на вход так
Kn_up Alias Pind.7 : Config Kn_up = Input : Set Kn_up


Ну может хватит уже меня запутывать. Я и так уже весь такой запутанный.
Kn_up Alias Pind.7                  ' присваиваем PIND.7  имя Kn_up, в моем случае Plus
Config Kn_up = Input             ' конфигурируем PIND.7  на вход
Set Kn_up                              ' подтяжка PIND.7  к +5 вольт.
И чем эта запись отличается от моего примера?

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

Config Pinc.0 = Input : Pinc.0 = 1 : Menu Alias Pinc.0
  Config Pinc.1 = Input : Pinc.1 = 1 : Plus Alias Pinc.1
  Config Pinc.2 = Input : Pinc.2 = 1 : Minus Alias Pinc.2
  Config Pinc.3 = Input : Pinc.3 = 1 : S_tereo Alias Pinc.3

Раньше я тоже так писал. С PORTB и PORTD работало, а с PORTC не хочет. В одной и той же программе, только менял С на В. Ну и кнопки перекидывал на макетке.
Поэтому и решил спросить. И мнение профи.

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

"Pin" используется только для опроса порта/входа, но никак не для конфигурирования (должно быть "port").

0

27

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

Ну может хватит уже меня запутывать. Я и так уже весь такой запутанный.

Вот тут очень доступно все разложено и путаться больше не придется.
http://easyelectronics.ru/avr-uchebnyj- … yvoda.html

0

28

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

Ну может хватит уже меня запутывать. Я и так уже весь такой запутанный.

Распутаетесь. Один раз это нужно и дальше будет просто. Порой после выжженого порта в меге(((
Попробуйте после конфигурации измерить тестером сколько мега кушает при замыкании ножки на массу.  Если замыкать на массу установленную в единицу ногу настроенную на выход- то увеличившееся потребление меги сразу же видно. Меги и тиньки они конечно живучие и порой прощают такое....но до поры до времени.

Если вы напишите Config Portc = Input то команда SET порт или пин подключит подтягивающий резистор.
Если Config Portc = Output то SET порт включит выход в единицу и если начать его замыкать на массу мега может такое не простить.

Тонкость в том что баском не проверяет и не ругается зачем вдруг проверяют состояние настроенной на.... выход ножки. Вот это не много запутывает.

Порт настроенный на выход командой SET PINC вы в единицу не включите. А знаете  почему? Резистор в меге если и  подключится то он не пересилит выходную логику порта))) По этому на выходе будет ноль.

Поставьте протеус. Чтоб железо не убивать. Там это отлично видно))

Основное как сконфигурирована нога- на вход или на выход. INPUT или OUTPUT для понимания раз и на всегда. Чтоб не путаться баском позволяет удобно условно разделить пин и порт. Пин это входы а порт выходы. Я привык при конфигурации ножки на вход писать как PIN а на выход как PORT. Баском продвинутый компилятор и дальше отследит на что назначили ногу и додумывает за вас чего устанавливать в единицу.

0

29

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

"Pin" используется только для опроса порта/входа, но никак не для конфигурирования (должно быть "port").

Раньше так наверное и было.   До какой то версии компилятора скорее всего так. Я уже не помню. Но уже давно конфигурирую ножку на вход как Config Pinc = Input и работает это так же как Config Portc = Input. Далее установка в единицу = включение подтягивающего резистора.  Выходит в баскоме DDR  можно отдельно конфигурировать на input как пин или порт.

0

30

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

Я и так уже весь такой запутанный.

Я чот тоже никак нифсосу...  :crazyfun:
PINx - читаем из порта
DDRx - вход/выход ног
PORTx - писать в порт
Никогда не пользовался командами Set и Reset PORTx... ибо не работало так, как я хотел или я  %-)    Объясните мне ЭТО!
Всегда писал ассемблерными вставками. Порты и пины всегда конфигурирую только напрямую через вышеуказанные регистры.
ПортС скорее всего включает в себя АЦП и компаратор, в датащах впринципе всё понятно описано, как там всё сконфигурировать. Скажу кратко - есть масочный регистр который ПОЛНОСТЬЮ отключает драйвера от ног! DIDRx называется. Это если с АЦП работать.
Ёщё непонятно почему, баг это или фича баскома... если "плевать" в порт единицу - на выходе получим МЕАНДР! Чо за ххня?
Тогда как работает Toggle???

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление аудиопроцессором TDA7449.