Предварительный Усилитель На Tda7314

3-08-2013, 12:43 От: admin Посмотрели: 705
Делаю усилитель на ТДА7314, мега32, и лсд от самсунга. Проблема скорее всего с передачей по шине I2C. Использую программный I2C, описаный в радиохобби 2005-5. Сами вычисления чисел работают, а вот с передачей данных бок выходит. Вот мой код в кодвижене:




//=Библиотека внешних функций i2c=, РадиоХобби, №5-2005 =1
#define SCL PORTC.0 //Условное имя для линии PB0 шины I2C =3
#define SDA PORTC.1 //Условное имя для линии PB1 шины I2C =4
#define TIME 160 //Константа для задержки времени =5
#define _BV(x) (1<<(x))



Переменную тайм увиличил с 10 до 160, т.к. кварц у меня 16мгц а не 1мгц как в статье.

Програмная реализация I2C




//---------------Функция задержки времени--------------- =6
void pause(void) //Фиксированная во времени пауза =7
{ static unsigned char p; //Счетчик времени =8
for (p=TIME; p > 0; p--); //Задержка на TIME-итераций =9
return; //Возврат после выполнения функции =10
} //Окончание функции "pause" =11
//-------------Функция старта для шины I2C------------- =12
void i2start(void) //Команда START шины I2C =13
{ DDRC &= ~_BV(SDA) & ~_BV(SCL); //SDA, SCL - входы =14
PORTC &= ~_BV(SDA) & ~_BV(SCL); //SDA,SCL-имитация ОК =15
pause(); //Пауза с лог.1 на SCL и SDA =16
DDRC |= _BV(SDA); //Установка лог.0 на SDA =17
pause(); //Пауза для лог.0 на SDA и лог.1 на SCL =18
DDRC |= _BV(SCL); //Установка лог.0 на SCL =19
pause(); //Пауза с лог.0 на SCL и SDA =20
return; //Возврат после выполнения функции =21
} //Окончание функции "i2start" =22
//-----------Функция записи байта по шине i2c---------- =23
void i2write(unsigned char bw) //Команда WRITE шины I2C =24
{ unsigned char k, m; //Вспомогательные счетчики =25
for (k=0; k < 8; k++) //Смена 8 битов в байте =26
{ m = 0x01 & (bw >> (7-k)); //Сдвиг битов вправо =27
if (m == 0) DDRC |= _BV(SDA); //Бит лог.0 на SDA =28
else DDRC &= ~_BV(SDA); //Иначе бит лог.1 на SDA =29
pause(); //Пауза перед импульсом SCL =30
DDRC &= ~_BV(SCL); pause(); //Импульс лог.1 на SCL =31
DDRC |= _BV(SCL); pause(); //Пауза с лог.0 на SCL =32
} //Переход к передаче следующего бита =33
return; //Возврат после выполнения функции =34
} //Окончание функции "i2write" =35
//---------Функция проверки бита подтверждения--------- =36
unsigned char i2ack(void) //Команда ACK шины I2C =37
{ unsigned char check=0; //Бит подтверждения в норме =38
DDRC &= ~_BV(SDA); pause(); //Пауза с лог.1 на SDA =39
DDRC &= ~_BV(SCL); pause(); //Импульс лог.1 на SCL =40
if (PINC & (1<<PINC.1)) {check++;} //Если ошибка =41
DDRC |= _BV(SCL); pause(); //Пауза с лог.0 на SCL =42
return (check); //Возврат "0" (норма), "1" (ошибка) =43
} //Окончание функции "i2ack" =44
//--------Функция завершения работы с шиной I2C-------- =45
void i2stop(void) //Команда STOP шины I2C =46
{ DDRC |= _BV(SDA); pause(); //Пауза с лог.0 SDA, SCL =47
DDRC &= ~_BV(SCL); //Установка лог.1 на SCL =48
pause(); //Пауза с лог.0 на SDA и лог.1 на SCL =49
DDRC &= ~_BV(SDA); pause(); //Пауза с лог.1 SDA, SCL =50
return; //Возврат после выполнения функции =51
} //Окончание функции "i2stop" =52



В строке 41, заменил if (bit_is_set(PINB,SDA)) check++; //Если ошибка =41 на if (PINC & (1<<PINC.1)) {check++;} //Если ошибка =41

для чего считать ошибки мне непонятно.

Ну и сама отправка чисел в main? т.к. нужна первичная запись в регистры




i2start(); i2write(0X88); i2ack();
i2write(0X00);i2ack();
i2write(LFFL);i2ack();
i2write(RFrontP);i2ack();
i2write(LRP);i2ack();
i2write(RRP);i2ack();
i2write(GGP);i2ack();
i2write(BASS);i2ack();
i2write(TTRR);i2ack();
i2stop();

Ну и отправка значений если меняются они на примере НЧ




if(BASY==1){BASR++; if(BASR>16){BASR=16;} if(BASR<=8){BASS=map(BASR,1,8,96,103);} if (BASR>9){BASS=map(BASR,9,16,111,104);} eBASR=BASR; eBASS=BASS;
i2start(); i2write(0X88); i2ack(); i2write(BASS);i2ack();i2stop();}

Непойму что не так, может быть в железе дело, а я тут программу мучаю. Надеюсь на Вашу помощь.
Раздел: AVR

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Предварительный Усилитель На Tda7314 все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031