Ds1307 и ATmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

Доброй ночи, уважаемые коты! Делаю устройство на ATmega8, подключил DS1307. Устанавливаю время, оно записывается в микросхему часов, но не изменяется. снимаю питание., батарейка есть. Сохраняется время то что я ввел.Кварц менял. Плата разведена как в даташите. Ниже прикладываю фрагмент схемы и фрагмент платы. Может кто подскажет,в чем может быть трабла. Понимаю, что проблема в том что нет импульсов с кварца. Но кварц новый. уже пробовал корпус кварца на земля подключать. не помогает. Куда копать?
Изображение
Изображение
Использовал для проверки и свой код в AVRStudio и подключал Ардуино Мега и заливал готовый скетч. Все повторяется время устанавливает, но не меняется. До этого код из AVRStudio работал на другом устройстве. DS1307 китайская брал 10 на ebay. Микросхемы разные подкидывал, все одинаково.
Реклама
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

melandr писал(а):Понимаю, что проблема в том что нет импульсов с кварца.
Так есть генерация или нет? Если нет генерации, софт можно бесконечно переписывать и проверять.
Как вариант, подать 32КHz с внешнего генератора.

Битик CH регистре #0 не в "1"-ке стоит?
Реклама
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

А как генерацию проверить? Осциллограф есть. А по поводу битика СН. Я так понимаю в ардуиновском коде он должен быть установлен. А в моем вот так сделано
Спойлер

Код: Выделить всё

  // Запускаем ход часов
  uint8_t temp;
  DS1307Read(0x00, &temp);
  temp &= ~(1 << 7); // обнуляем 7 бит
  DS1307Write(0x00, temp);

  sei();
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

/*Бит 7 регистра 0 – это бит останова часов (clock halt - CH). Когда этот бит
установлен в 1, тактовый генератор выключен. Когда сброшен в 0, - тактовый генератор включен.
Имейте в виду, что при включении питания начальное состояние всех регистров не
определено. Поэтому необходимо принудительно включать тактовый генератор (бит CH = 0) во
время начальной инициализации.*/
У меня так работало.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

melandr писал(а):А по поводу битика СН. Я так понимаю в ардуиновском коде он должен быть установлен. А в моем вот так сделано
melandr, а если бит стоит в "1"? Он так и останется в "1", т.е.осциллятор как был выключен, так остался.

А что там делается в ардуино, мне смотреть лень :) А есть ли причины в своем коде не сбрасывать этот бит?
Реклама
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

Так в моем коде он сбрасывается при запуске
Реклама
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пн июн 18, 2012 09:21:00

Сообщение d_f_m »

Может конденсаторы нужно поставить на кварц? 12,5p?
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

melandr писал(а):Так в моем коде он сбрасывается при запуске
Туплю :oops:

желательно бы DS1307 поменять на зведомо рабочую, а не из той же партии (китайцы - они такие, могут и фигню всякую продать)

убедиться что есть генерация (осциллографом на ножке X2 (выход осциллятора)). Может быть срыв генерации (у осциллографа входная емкость, сопротивление). Но если ты видишь осциллографом 32.768KHz, то скорей всего осциллятор работает.
Можно временно (для проверки) отцепить кварц и на ножку X1 подать частоту, например с выхода таймера, ... (т.е. не использовать кварц и осцилятор DS1307)
Еще можно вывести частоту на 7-ю ножку (см. datasheet) и там посмотреть осциллографом.
Вымогатель припоя
Сообщения: 541
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Кусок из рабочего проекта, обратите внимание на rtc_init

Код: Выделить всё

// работа с часами DS1307 (i2c)
#include "twi.h"
#include "ds1307.h"

unsigned char hour;
unsigned char min;
unsigned char sec;
unsigned char date;
unsigned char month;
unsigned char year;

unsigned char bcd2bin(unsigned char x)
{
    return (((x & 0xF0)>>4)*10 + (x & 0x0F));
}

unsigned char bin2bcd(unsigned char x)
{
    return ((x%10) | ((x/10)<<4));
}

void rtc_init(unsigned char PeriodSelect,   // выбор периода на выходе OUT
              // 0 - 1 гц
              // 1 - 4096 гц
              // 2 - 8192 гц
              // 3 - 32768 гц
              unsigned char SQWe,           // включение сигнала на выходе OUT
              unsigned char OUTlevel        // уровень на OUT, если SQWe==0
             )
{
    PeriodSelect &= 3;
    // устанавливаем флаги для записи в регистр
    if (SQWe) PeriodSelect |= 0x10;
    if (OUTlevel) PeriodSelect |= 0x80;
    // выводим в шину
    i2c_start(0xd0);
    i2c_write(7);
    i2c_write(PeriodSelect);
    i2c_stop();
}

void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec)
{
    i2c_start(0xd0);
    i2c_write(0);
    i2c_start(0xd1);
    *sec = bcd2bin(i2c_read(1));
    *min = bcd2bin(i2c_read(1));
    *hour = bcd2bin(i2c_read(0));
    i2c_stop();
}

void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec)
{
    i2c_start(0xd0);
    i2c_write(0);
    i2c_write(bin2bcd(sec));
    i2c_write(bin2bcd(min));
    i2c_write(bin2bcd(hour));
    i2c_stop();
}

void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year)
{
    i2c_start(0xd0);
    i2c_write(4);
    i2c_start(0xd1);
    *date=bcd2bin(i2c_read(1));
    *month=bcd2bin(i2c_read(1));
    *year=bcd2bin(i2c_read(0));
    i2c_stop();
}

void rtc_set_date(unsigned char date,unsigned char month,unsigned char year)
{
    i2c_start(0xd0);
    i2c_write(4);
    i2c_write(bin2bcd(date));
    i2c_write(bin2bcd(month));
    i2c_write(bin2bcd(year));
    i2c_stop();
}

// Zapisuje bait pod adres
void rtc_write_bait(unsigned char adres,unsigned char danne)
{
    if ((adres>7)&&(adres<=63)) //Sprawdza granicy adresu
    {
        i2c_start(0xd0);
        i2c_write(adres);
        i2c_write(danne);
        i2c_stop();
    }
}

// Czyta bait spod adresu
void rtc_read_bait(unsigned char adres,unsigned char *danne)
{
    if ((adres>7)&&(adres<=63)) //Sprawdza granicy adresu
    {
        i2c_start(0xd0);
        i2c_write(adres);
        i2c_start(0xd1);
        *danne = i2c_read(0);
        i2c_stop();
    }
}

Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

Вытащил осциллограф , сейчас буду проверять. Микросхемы все из одной партии. Ведут себя одинаково. Но пару раз генерация начиналась, когда я плату дергал пока подключал, но потом пропадал
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

Подключил осциллограф к пину Х2 микросхемы часов. не видно никакой генерация, видно постоянное напряжение 400 мВ. Вопрос в том, что осциллограф может сам вносить искажения. При подключении осциллографа к линии данных и линии SCK видно обмен по шине. Сегодня попробую впаять третий кварц, может с ним проблема. еще как вариант думаю подать тактовый сигнал с микроконтроллера. Правда нужно прикинуть как сделать частоту 32768 Гц. Как все таки можно проверить генерацию кварца?
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Если кварц с материнки, то могут быть проблемы. Во всяком случае, у меня они с часами не работали, пробовал несколько штук
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

да нет кварц покупал вот такой
http://www.kosmodrom.com.ua/prodlist.ph ... B%E0%E4%F3
не знаю, просто куда уже копать. микросхема вроде отвечает, и записывает время при установке. но не тикает.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Я бы попробовал несколько разных кварцов
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

melandr писал(а): Как все таки можно проверить генерацию кварца?
Если мерить через выносной делитель (пробник) 1:10, то вносимая емкость небольшая и не должна срывать генерацию (если она была).
Изображение
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

В этом источнике http://www.getchip.net/posts/052-kak-za ... c/прочитал , что может влиять флюс,который остался на плате. Посмотрел, что у меня после перепайки старого кварца остался флюс. Почистил и часы завелись. Хотя после первого кварца плату помыл хорошо, а после перепайки не заметил.
ЗЫ: опять какой-то глюк, прихожу домой, а часы опять время стоит.Буду пробовать кварц менять, может поможет.
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

Может неправильно сделана разводка платы возле DS1307? А то не знаю куда копать.
Прорезались зубы
Аватара пользователя
Сообщения: 240
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Сообщение AlanDrakes »

Несколько раз собирал часы на данной микросхеме. Кварцы использовал какие попало - всё запускается. Единственные проблемы с ней - это резервная батарея, которая должна иметь напряжение около 3V.
Линии данных подтягиваю к питанию резисторами на 4.7кОм, трассы к кварцу - короткие, с максимально возможным расстоянием между проводниками и максимально далеко от других линий (лучше всего ставить кварц прямо у микросхемы).
После подачи питания - через 10-20мс читаю и записываю 0-й регистр (секунды и отключение кварца), сбрасывая верхний бит.
После этого всё работает.
Чтобы проверить, тикает ли микросхема - можете вывод 7 (SQW/OUT) подтянуть к питанию и записать в регистр 7 число 0x13. На выходе должны быть импульсы с частотой кварца.
0x12 - 8KHz
0x11 - 4KHz
0x10 - 1Hz.
0x0X - отключает пин и переводит его в 0
0x8X - отключает и переводит в 1 (Z состояние).

Если нет генерации - проверяйте остатки флюсов, замыкания и утечку у кварца.
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Сообщение melandr »

Ну у меня в начале темы сделан скрин как сделана разводка возле часов. По поводу батареи, некоторые пишут, что можно без батареи. Может полигон земли нужен меньше возле кварца?
ЗЫ:Короче победил я эти часики. Рассказываю в чем была проблема. На печатной плате, которую заказывал, были невидимые глазу непротравы. Которые создавали сопротивление до 10МОм между выводами кварца и на землю. За счет этих непротравов и часики не работали. когда панельку микросхемы выпаял и начал замерять сопротивление. То на двух дорожках на кварц сопротивление мерял было и 2 МОм. Начал пропилы делать между дорожками. Визуально вроде все пропилил, а сопротивление не менялось. Но когда пропилил, что сопротивление показывало бесконечность, тогда и заработали часики.
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

melandr писал(а):невидимые глазу непротравы. Которые создавали сопротивление до 10МОм
Чудеса... это какой же толщины должен быть непротравленный участок меди ? В один молекулярный слой ? Наверно, все-таки это были плохо очищенные остатки флюса или травильного раствора.
Изображение
Ответить

Вернуться в «AVR»