Делаю усилитель на ТДА7314, мега32, и лсд от самсунга. Проблема скорее всего с передачей по шине I2C. Использую программный I2C, описаный в радиохобби 2005-5. Сами вычисления чисел работают, а вот с передачей данных бок выходит. Вот мой код в кодвижене:
Переменную тайм увиличил с 10 до 160, т.к. кварц у меня 16мгц а не 1мгц как в статье.
Програмная реализация I2C
В строке 41, заменил if (bit_is_set(PINB,SDA)) check++; //Если ошибка =41 на if (PINC & (1<<PINC.1)) {check++;} //Если ошибка =41
для чего считать ошибки мне непонятно.
Ну и сама отправка чисел в main? т.к. нужна первичная запись в регистры
Ну и отправка значений если меняются они на примере НЧ
Непойму что не так, может быть в железе дело, а я тут программу мучаю. Надеюсь на Вашу помощь.
Раздел: AVR
//=Библиотека внешних функций 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