[an error occurred while processing this directive]
без TWI
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено колян безпарольный 26 июля 2005 г. 18:44
В ответ на: DS1307 и ATmega8. добрые люди, поделитесь сорцами на си для связки DS1307 и ATmega8, желательно, но не обязательно использование TWI отправлено <font color=gray>Игорь</font> 26 июля 2005 г. 18:11


#define SDI 1
#define SDO 1
#define SCL 0

#define SetSCL PORTD|= (Set<#define ClrSCL PORTD&=~(Set<#define SetSDO PORTD|= (Set<#define ClrSDO PORTD&=~(Set<#define DataOUT DDRD|= (Set<#define DataIN DDRD&=~(Set<#define WrAdr b11010000
#define RdAdr b11010001
#define NACK 1
#define ACK 0
void I2Cdelay (unsigned int a)
{//задержка в 1 мкс
while (a>0) {a--;_WDR();_WDR();}
}

void I2Cinit (void)
{//Инициализация
DDRD|= (Set< PORTD|=(Set< }

char I2Cwrite(unsigned char a)
{unsigned char i;
DataIN;
I2Cdelay(5);
for (i=0;i<8;i++)
{if (a&0x80) SetSDO; else ClrSDO;
DataOUT;
a<<=1; I2Cdelay(5);
SetSCL;I2Cdelay(5);
ClrSCL;DataIN;
I2Cdelay(5);
}
SetSDO;I2Cdelay(5);
SetSCL;I2Cdelay(5);
i=PIND;
ClrSCL;I2Cdelay(5);
return(i&(Set< }
char I2Cread(char res)
{unsigned char i, j;
DataIN;I2Cdelay(5);
for(i = 0; i < 8; i++) // Get 8 bits from the device
{SetSCL;I2Cdelay(5);
j=j<<1;
if (PIND&(Set< ClrSCL;I2Cdelay(5);
}
if (res==ACK) ClrSDO; else SetSDO;
DataOUT;I2Cdelay(5);
SetSCL;I2Cdelay(5);
ClrSCL;DataIN;
I2Cdelay(5);
SetSDO;
return(j) ;
}
void I2Cstart(void)
{DataOUT;I2Cdelay(5);
SetSDO; I2Cdelay(15);
SetSCL; I2Cdelay(15);
ClrSDO; I2Cdelay(5);
ClrSCL; I2Cdelay(5);
}
void I2Cstop(void)
{DataOUT;I2Cdelay(5);
ClrSDO; I2Cdelay(5);
SetSCL; I2Cdelay(5);
SetSDO; I2Cdelay(5);
}


void I2CstartW(void)
{I2Cstart();
I2Cdelay(20);
I2Cwrite(WrAdr);
}
void I2CstartR(void)
{I2Cstart();
I2Cdelay(20);
I2Cwrite(RdAdr);
}


//=======================================
void ReadTime(void)
{//считать время
I2CstartW();
I2Cwrite(0x00);//Установить адрес
I2CstartR();
CurrentTime.Sek =I2Cread(ACK)&0x7F;
CurrentTime.Min =I2Cread(ACK);
CurrentTime.Hour =I2Cread(ACK);
CurrentTime.Data =I2Cread(ACK);
CurrentTime.Data =I2Cread(ACK);
CurrentTime.Month=I2Cread(ACK);
CurrentTime.Year =I2Cread(NACK);
I2Cstop();
}
void StartTime(void)
{//Записать время и стартовать
I2Cinit();
I2CstartW();
I2Cwrite(0x00);//стать на младший байт(секунды)
I2Cwrite(0x80);//остановить часы
I2Cwrite(CurrentTime.Min);
I2Cwrite(CurrentTime.Hour);
I2Cwrite(0x00);//пустышка для дня недели
I2Cwrite(CurrentTime.Data);
I2Cwrite(CurrentTime.Month);
I2Cwrite(CurrentTime.Year);
I2Cstop();
//Запустить часы
I2CstartW();
I2Cwrite(0x00);//стать на младший байт(секунды)
I2Cwrite(CurrentTime.Sek);//запустить часы
I2Cstop();
}




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

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


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

E-mail: info@telesys.ru