asis-kbr.ru

автоматические системы и системы безопасности
Текущее время: 22 авг 2018, 00:30

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Библиотека работы с МС часов DS1307
СообщениеДобавлено: 11 сен 2013, 09:14 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Код:
//#######################################################################################################################
//#
//# БИБЛИОТЕЧКА РАБОТЫ С ЧАСАМИ DS1307
//#
//#######################################################################################################################

//включаемые файлы
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/io.h>

//настройки библиотеки
#define IICDDR      DDRC               /*порт управления I2C*/
#define IICPORT     PORTC               /*порт вывода данных на линию I2C*/
#define IICPIN      PINC               /*порт ввода данных с линий I2C*/
   #define IICData     (1<<4)               /*линия DATA*/
   #define IICClc      (1<<5)               /*линия CLC*/


//#######################################################################################################################
//#
//# ФУНКЦИИ РАБОТЫ С ЧАСАМИ DS1307
//#
//#######################################################################################################################

//глобальные переменные
volatile char ClockData [7] = {};         //массив часов [0]секунды, [1]минуты, [2]часы, [3]день, [4]дата, [5]месяц, [6]год
#define second    ClockData[0]
#define minute    ClockData[1]
#define hour    ClockData[2]
#define day    ClockData[3]
#define date    ClockData[4]
#define month    ClockData[5]
#define year    ClockData[6]


//объявления функций
void IICClockReadData (void);               //ф-ции работы с МС часов DS1307
void IICClockWriteData (void);
void IICStart (void);                     //софтовая реализация I2C
void IICStop (void);
char IICByteWrite (char);
char IICByteRead (char);
char IICBit (char);


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ЧТЕНИЯ БЛОКА ДАННЫХ ИЗ МИКРОСХЕМЫ ЧАСОВ DS1307
//чтение происходит в глобальный массив ClockData[7]
//последовательность данных - [0]секунды, [1]минуты, [2]часы, [3]день, [4]дата, [5]месяц, [6]год
void IICClockReadData (void)
{
   IICStart();
   IICByteWrite (0xD0);               //запись данных в DS1307
   IICByteWrite (0x00);               //сбросить указатель адреса DS1307 на 0

   IICStart();   
   IICByteWrite (0xD1);               //команда на чтение данных

   volatile char* pClockData = ClockData;   //указатель на массив часов
   for (char i = 0; i<6; i++)
      *pClockData++ = IICByteRead (0);   //пишем, секунды, минуты, часы, день, дата, месяц (с выдачей подтверждением)
   *pClockData = IICByteRead (1);         //пишем год (без подтверждения)
   IICStop();
}


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ЗАПИСИ БЛОКА ДАННЫХ В МИКРОСХЕМУ ЧАСОВ DS1307
//запись происходит из глобального массива ClockData[7]
//последовательность данных - [0]секунды, [1]минуты, [2]часы, [3]день, [4]дата, [5]месяц, [6]год
void IICClockWriteData (void)
{
   IICStart();
   IICByteWrite (0xD0);               //запись данных в DS1307
   IICByteWrite (0x00);               //сбросить указатель адреса DS1307 на 0

   for (unsigned char i = 0; i<7; i++)
      IICByteWrite (ClockData [i]);      //пишем, секунды, минуты, часы, день, дата, месяц, год

   IICStop();
}


//#######################################################################################################################
//#
//# ФУНКЦИИ ОБСЛУЖИВАНИЯ ИНТЕРФЕЙСА I2C (софтовый вариант)
//#
//#######################################################################################################################

//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ START ПО ИНТЕРФЕЙСУ IIC
void IICStart (void)
{
   IICDDR &= ~(IICData | IICClc);
   _delay_us(2);
   IICDDR |= IICData;                  //подтяжка data к нулю
   _delay_us(2);
   IICDDR |= IICClc;                  //подтяжка clc к нулю
   _delay_us(2);
}


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ STOP ПО ИНТЕРФЕЙСУ IIC
void IICStop (void)
{
   IICDDR |= (IICData | IICClc);
   _delay_us(2);
   IICDDR &= ~IICClc;                  //отпустить data
   _delay_us(2);
   IICDDR &= ~IICData;                  //отпустить clc
   _delay_us(2);
}


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ЗАПИСИ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - байт данных для вывода по IIC
//ЗНАЧЕНИЕ - флаг подтверждения 0 (есть подтверждение) или 1 (нет подтверждения)
char IICByteWrite (char byte)
{
   for (char i = 0; i<8; i++)
      byte = IICBit (byte);

   byte = 0x80;                       
   return IICBit (byte);               //возвращаем бит подтверждения (0-есть бит подтверждения, 1-нет)
}


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ЧТЕНИЯ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - значение бита подтверждения (0 - есть подтверждение, 1 - нет подтверждения)
//ЗНАЧЕНИЕ - принятый байт
char IICByteRead (char bit)
{
   char byte = 0xFF;
   for (char i = 0; i<8; i++)
      byte = IICBit (byte);

   bit <<= 7;
   IICBit (bit);                     //передать значение бита подтверждения
   return byte;                     //возвращаем принятый байт
}


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ЗАПИСИ\ЧТЕНИЯ БИТА ПО ИНТЕРФЕЙСУ IIC
//выводится значение старшего бита аргумента
//принятый бит возвращается в младшем бите предварительно сдвинутого влево аргумента
char IICBit (char byte)                 
{
   if (byte & 0x80)   IICDDR &= ~IICData;   //вывод 1 на линию данных            
   else            IICDDR |= IICData;   //вывод 0 на линию данных
   _delay_us(2);

   IICDDR &= ~IICClc;                  //старт строб импульса
   while (! (IICPIN & IICClc)){}         //ожидание формирования строба
   _delay_us(2);

   char temp;   
   if (IICPIN & IICData)   temp = 1;      //принимаем бит      
   else               temp = 0;      
   IICDDR |= IICClc;                  //завершить строб

   byte <<= 1;
   byte |= temp;
   return byte;
}


//#######################################################################################################################
//#
//# end
//#
//#######################################################################################################################


Вложения:
ds1307.h [6.09 КБ]
Скачиваний: 726
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB