Вот это работает.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено BlackJack 20 октября 2004 г. 10:46
В ответ на: Вот скажите мне глупому, что я не так делаю с TWI в MEGA16? отправлено Grapaf 20 октября 2004 г. 10:24

Написано втупую по DS
Тока надо заменить ^^ на < <

void InitDS (void)
{
TWCR=(1^^TWINT)|(1^^TWSTA)|(1^^TWEN); //Send Start
WaitTWINT;
if ((TWSR&0xF8)!=START) TWErr();
TWDR=DS1307W; //Slave adress for writing
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_SLA_ACK) TWErr();
TWDR=0x07;//Control Reg
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_DATA_ACK) TWErr();
//------------------------Send data--------------------------

TWDR=0x40;// for DS1307 =0x90 ! Out=1;SQWE=1; 1Hz
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_DATA_ACK) TWErr();
//-----------------------
TWCR=(1^^TWINT)|(1^^TWSTO)|(1^^TWEN);
wait50;
wait50;
wait_beep;
//WaitTWINT;
//now send 0 to Reg0 to start clock
TWCR=(1^^TWINT)|(1^^TWSTA)|(1^^TWEN); //Send Start
WaitTWINT;
if ((TWSR&0xF8)!=START) TWErr();
TWDR=DS1307W; //Slave adress for writing
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_SLA_ACK) TWErr();
TWDR=0x00;//Sec Reg
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_DATA_ACK) TWErr();
//------------------------Send data
TWDR=0x00;//
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_DATA_ACK) TWErr();
//-----------------------
TWCR=(1^^TWINT)|(1^^TWSTO)|(1^^TWEN);
//WaitTWINT;
//TWCR=(1^^TWINT);

}
void GetTime(void)
{
char i;

TWCR=(1^^TWINT)|(1^^TWSTA)|(1^^TWEN); //Send Start
WaitTWINT;
if ((TWSR&0xF8)!=START) TWErr();
TWDR=DS1307W; //Slave adress for writing
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_SLA_ACK) TWErr();
TWDR=0x00;// Reg
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;
if ((TWSR&0xF8)!=MT_DATA_ACK) TWErr();

TWCR=(1^^TWINT)|(1^^TWSTO)|(1^^TWEN);
wait5;

TWCR=(1^^TWINT)|(1^^TWSTA)|(1^^TWEN); //Send Start
WaitTWINT;
if ((TWSR&0xF8)!=START) TWErr();

TWDR=DS1307R; //Slave adress for read
TWCR=(1^^TWINT)|(1^^TWEN)|(1^^TWEA);// TWEA разрешает слейву передать дату
WaitTWINT;
if ((TWSR&0xF8)!=MT_SLA_R_ACK) TWErr();
for (i=0;i<7;i++)
{ TWCR=(1^^TWINT)|(1^^TWEN)|(1^^TWEA);
WaitTWINT;
if ((TWSR&0xF8)!=MT_DATA_R_ACK) TWErr();
time[i]=TWDR;
};

TWCR&=~(1^^TWEA);//NACK
TWCR=(1^^TWINT)|(1^^TWEN);
WaitTWINT;

TWCR=(1^^TWINT)|(1^^TWSTO)|(1^^TWEN);

//if ((TWSR&0xF8)!=MT_DATA_R_ACK) TWErr();

}


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

Ответы



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

E-mail: info@telesys.ru