Страница 1 из 17
Всё по DS1307 и прочим часам Dallas (Maxim)
Добавлено: Пт янв 11, 2013 13:30:50
Pika4u
Предлагаю по аналогии с
viewtopic.php?f=20&t=64022 скидывать наработки сюда. Блин, нужна чья-то помощь. Есть у кого код для Иара? А то свой написал, проверил 100500 раз, а ни на один байт ACK не могу получить. Делал в соответствии со спецификацией, проверял.
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 13:50:36
Pika4u
Ах, да, вот код(CBI-ClearBit,SBI-SetBit).
Спойлер
Код: Выделить всё
define I2C_DELAY 40 //ms
#define debug
//*** Формирование старт-бита
// <-- если 0 - линия занята, иначе - передан старт
unsigned char i2c_start (void)
{
unsigned char Res = 1;
CBI(I2C_DDR, I2C_SDA);
if (GBI(I2C_PIN, I2C_SDA)) // проверка на ошибку линии
{
// устанавливаем лог 1 на линии SCL за счет подтягивающих резисторов
CBI(I2C_DDR, I2C_SCL);
CBI(I2C_PORT, I2C_SCL);
delay_us(I2C_DELAY);
// устанавливаем лог 0 на линии SDA за счет защелки
SBI(I2C_DDR, I2C_SDA);
CBI(I2C_PORT, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 0 на линии SCL за счет защелки
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
}
else
Res = 0;
return Res;
}
//*** Формирование стоп-бита
void i2c_stop (void)
{
// устанавливаем лог 0 на линии SDA за счет подтягивающих резисторов
SBI(I2C_DDR, I2C_SDA);
CBI(I2C_PORT, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SCL за счет защелки
SBI(I2C_DDR, I2C_SCL);
CBI(I2C_PORT, I2C_SCL);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SDA за счет защелки
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
}
unsigned char i2c_write_byte(u8 Data)
{
unsigned char Res = 0;
CBI(I2C_PORT, I2C_SCL);
CBI(I2C_PORT, I2C_SDA);
for (u8 i = 0; i < 8; i++)
{
SBI(I2C_DDR, I2C_SDA);
if (Data & 0x80)
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SCL за счет подтягивающих резисторов
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
// устанавливаем лог 0 на линии SCL за счет подтягивающих резисторов
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
Data <<= 1;
}
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SCL за счет подтягивающих резисторов
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
Res = GBI(I2C_PIN, I2C_SDA);
// устанавливаем лог 0 на линии SCL за счет подтягивающих резисторов
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
SBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
return Res;
}
//*** Чтение байта из I2C
// --> Ack > 0 - генерировать, иначе - нет
// <-- принятые данные
unsigned char i2c_read_byte(u8 Ack)
{
unsigned char Res=0;
CBI(I2C_DDR, I2C_SDA);
CBI(I2C_PORT, I2C_SDA);
for(u8 x=0; x<8; x++)
{
Res <<= 1;
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
if(GBI(I2C_PIN, I2C_SDA))
Res |= 1;
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
}
if(Ack)
SBI(I2C_DDR, I2C_SDA);
else
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
SBI(I2C_DDR, I2C_SCL);
CBI(I2C_DDR, I2C_SCL);
return Res;
}
//*** Инициализация интерфейса I2C
void i2c_init( void )
{
CBI(I2C_DDR, I2C_SDA);
CBI(I2C_DDR, I2C_SCL);
CBI(I2C_PORT, I2C_SDA);
CBI(I2C_PORT, I2C_SCL);
}
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 14:24:22
phanis
Не знаю насколько подойдет иар авр
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 14:25:07
shads
А вот как я юзаю DS1307, только для WINAVR.....
Код: Выделить всё
void IICClockReadData (void)
{
IICStart();
IICByteWrite (0xD0); IICByteWrite (0x00); IICStart();
IICByteWrite (0xD1); char temp = IICByteRead (0); if (temp != ClockData[0]){
ClockData[0] = temp;
ClockMiliSecond = 0; }
char* pClockData = &ClockData[1]; for (char i = 0; i<5; i++)
*pClockData++ = IICByteRead (0); *pClockData = IICByteRead (1); IICStop();
}
void IICClockWriteData (void)
{
IICStart();
IICByteWrite (0xD0); IICByteWrite (0x00); for (unsigned char i = 0; i<7; i++)
IICByteWrite (ClockData [i]); IICStop();
}
А вот софтовая реализация I2C.
Заморочек меньше чем с аппаратной, да и цеплять можно на любые выводы контроллера
Спойлер
Код: Выделить всё
NOINLINE void Delay2Mks (void)
{
_delay_us (2);
}
void IICStart (void)
{
IICDDR &= ~(IICData | IICClc);
Delay2Mks();
IICDDR |= IICData; Delay2Mks();
IICDDR |= IICClc; Delay2Mks();
}
void IICStop (void)
{
IICDDR |= (IICData | IICClc);
Delay2Mks();
IICDDR &= ~IICClc; Delay2Mks();
IICDDR &= ~IICData; Delay2Mks();
}
char IICByteWrite (char byte)
{
for (char i = 0; i<8; i++)
byte = IICBit (byte);
byte = 0x80;
return IICBit (byte); }
char IICByteRead (char bit)
{
char byte = 0xFF;
for (char i = 0; i<8; i++)
byte = IICBit (byte);
bit <<= 7;
IICBit (bit); return byte; }
char IICBit (char byte)
{
if (byte & 0x80) IICDDR &= ~IICData; else
IICDDR |= IICData; Delay2Mks();
IICDDR &= ~IICClc; while (! (IICPIN & IICClc)){} Delay2Mks();
char temp;
if (IICPIN & IICData) temp = 1;
else
temp = 0;
IICDDR |= IICClc; byte <<= 1;
byte |= temp;
return byte;
}
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 14:28:09
Pika4u
Спасибо, буду разбираться, у вас, видимо, используется аппаратный TWI? Ну тогда сначала попытаюсь хоть от TWI завести)
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 14:33:30
Pika4u
shads, огромное спасибо!!!!!!!!!!!!!!!!! Пойду пробовать) А темку предлагаю закрепить))По аналогии с ds18b20 )
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 15:23:31
Pika4u
Блин, подключение 100500 раз перепроверил, кварц есть(с материнки,на 32768Гц), биты в дефайнах, ес-но, поменял. Неа, ACK нету

Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 15:32:29
akl

DS1307 требует подключения батарейки +3V.
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 15:32:57
Pika4u
Завел через переменник 3 Вольта на него, то же самое)
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 16:13:22
ds1307
Еще требуется инициализация микросхемы.
rtc_init(0, 0, 0); // при первом запуске DS1307 его регистры не установлены (ручками установим их - биты: rs=0, sqwe=0, out=0)
Кажется rs обязательно надо в 0 установить. Давно разбирался. Теперь пользуюсь готовым куском и не парюсь. Но все в CV.
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 16:54:48
Pika4u
До регистров далеко, тут даже ACK не получен(
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 17:32:30
shads
В протеусе попробуй..... если в проте работает, то тогда в железе можно пробовать.....
Или скинь сюда схемку в протеусе, вместе поморокуем.....
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 17:50:56
Vov123
Только в IAR,в CVAVR "религия" не позволяет?
Re: Все по DS1307.
Добавлено: Пт янв 11, 2013 23:13:54
Ser60
Pika4u - по-моему у Вас ошибка в среднем блоке функции i2c_stop() и комментарии там везде неправильные. Если это не поможет, дайте код обрашения к DS1307 с указанием ее I2C адреса (может он неправильный в программе?) Получаете-ли ACK после отсылки адреса по I2C? Если ДА, то на каком этапе коммуникации с DS получаете NACK?
Re: Все по DS1307.
Добавлено: Сб янв 12, 2013 00:56:19
BOB51
На асме для mcs51 имеется наработка... DS1307 для побайтовой адресации довольно специфичное решение требует - в даташите только блочный обмен...

Re: Все по DS1307.
Добавлено: Пт янв 18, 2013 17:46:22
Pika4u
Итак, добил я все же эту ds1307,посадил ей 3 вывод(батарея) на землю и вышеизложенный код заработал. Но вот в чем трабла-смотрю на дисплее результаты отправки байтов-случайным образом, бывает, ACK не приходит.В случае получения NACK, нужно байт отправить ещё раз?
Re: Все по DS1307.
Добавлено: Пт янв 18, 2013 19:09:14
BOB51
Я ж уже говорил - предназначено для блочного обмена.
Ежли хочется побайтовое общение с произвольным начальным адресом см. вот этот листик:
в данном случае имеет место "слэнг" I2C.
Ну и вот эта шпоргалка, когда-то нашкрябаная:
В случае на сассемблере - помогу, под СИ не работаю...
Re: Все по DS1307.
Добавлено: Сб янв 19, 2013 05:00:23
Pika4u
Как это ни странно, проблема решилась установкой электролита по питанию 1307.
Re: Все по DS1307.
Добавлено: Сб янв 19, 2013 09:58:08
BOB51
Как все запущено оказалось...
А полазить по сайтам производителей часиков и почитать рекомендации по применению ? Да и правила по обычным микрухам пока не отменялись!
Вот на всяк случай манька по PCFам - типовые решения все одинаковые:
А вот так выглядит мое решение макетки часиков на DS1307 как отдельного узла (под схему с акумулятором или ионистором - при литиевой батарее цепочка заряда не ставится!):

А вот для ленивых немышеловов древняя подборка апноток от MAXIM-DALLAS из трех кусочков:

Re: Все по DS1307.
Добавлено: Сб янв 19, 2013 14:32:51
Pika4u
Спасибо огромное) просто у меня сейчас отладочная плата на меге8(сделал сам, все по минимуму, разводка питания и все выводы выведены на штыри. Так вот, на плате мега8, дс1307, дс18б20, и жк-дисплей. Все питается от программатора(юсб,5В). Я думал, что конденсатора меги, керамики 18б20 и конденсатора в программаторе хватит... Не хватило)