Самым элегантным вариантом получился вот такой крокодил :(((. Но все же поставлю.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено IgorB 03 апреля 2003 г. 16:11
В ответ на: Вопрос знатокам Си... отправлено IgorB 03 апреля 2003 г. 09:53

// просто &DDRA, &DDRB... не пропустил компилер (EW1.40).
//Пришлось самому городить адреса.
// Работает на EW2.28, только сделать __flash
#define ADDR_DDRA 0x3a
#define ADDR_DDRB 0x37
#define ADDR_DDRD 0x31
#define ADDR_DDRE 0x22
#define ADDR_PINA 0x39
#define ADDR_PINB 0x36
#define ADDR_PIND 0x30
#define ADDR_PINE 0x21

#define WAIT_ACK (10000)
flash const unsigned char* Adr_Dist_SDA[3] =
{
(unsigned char*)((ADDR_DDRA)), /* SDA for first I2C */
(unsigned char*)((ADDR_DDRB)), /* SDA for second I2C */
(unsigned char*)((ADDR_DDRD)) /* SDA for third I2C */
};
flash const unsigned char* Adr_Dist_SCL[3] =
{
(unsigned char*)((ADDR_DDRB)), /* SCL for first I2C */
(unsigned char*)((ADDR_DDRE)), /* SCL for second I2C */
(unsigned char*)((ADDR_DDRA)) /* SCL for third I2C */
};

flash const unsigned char Numbit_SDA[3] =
{
4, /* number bit SDA for first I2C */
2, /* number bit SDA for second I2C */
0 /* number bit SDA for third I2C */
};
flash const unsigned char Numbit_SCL[3] =
{
5, /* number bit SCL for first I2C */
1, /* number bit SCL for second I2C */
4 /* number bit SCL for third I2C */
};

/*******************************************/
unsigned char SDAopros( unsigned char lin )
{
return ((*(unsigned char*)(Adr_Dist_SDA[lin])) & ~(1 << (Numbit_SDA[lin])));
}
/*******************************************/
void SDAset( unsigned char lin )
{
(*(unsigned char*)(Adr_Dist_SDA[lin])) &= ~(1 << (Numbit_SDA[lin]));
}
/*******************************************/
void SCLset( unsigned char lin )
{
(*(unsigned char*)(Adr_Dist_SCL[lin])) &= ~(1 << (Numbit_SCL[lin]));
}
/*******************************************/
void SDAclr( unsigned char lin )
{
(*(unsigned char*)(Adr_Dist_SDA[lin])) |= (1 << (Numbit_SDA[lin]));
}
/*******************************************/
void SCLclr( unsigned char lin )
{
(*(unsigned char*)(Adr_Dist_SCL[lin])) |= (1 << (Numbit_SCL[lin]));
}
/*******************************************/

/* только для демонстрации работы с несколькими линиями I2C!!! */
void OutByteI2C(unsigned char line, unsigned char byte )
{
/* шины подтянуты внешними резисторами: PORTA &= 0xfe, DDRA |= 0x01 ==> A.0 = 0 */

unsigned char count;
unsigned int wait;

/*!!! подтвердить наличие 0 на все PORTi, соответствующих всем линиям SDA,SCL. */
/* ............. */

SCLclr( line );

for( count = 0; count < 8; count++ )
{
if( byte & 0x80 ) { SDAset( line ); }
else { SDAclr( line ); }
SCLset( line );
SCLclr( line );
byte <<= 1;
}/*for count*/

/* ожидание 0 на SDA (ACKNOWLEDGE) */
SDAset( line );
SCLset( line );
count=0;
for( wait = 0; wait <= WAIT_ACK; wait++)
{
SDAset( line );
if( !SDAopros( line ) ) break;
}/*for wait*/
if(wait >= WAIT_ACK) { i2c_error = 1; /* error timeout! */ }
SCLclr( line );
// i2c_write_delay();
}
/*******************************************/

/////// main


--- пример вызова
unsigned char qqq;
for( qqq=0; qqq<3; qqq++ )
{
OutByteI2C( qqq, qqq ); /* послать по выбранной шине I2C некоторое число */
}
/*******************************************/


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru