Всё по DS1307 и прочим часам Dallas (Maxim)

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15547
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение BOB51 »

Си - великая вэщ... но иногда источник великого садомазохизма...
Увы, пользуюсь токмо асмом, мож кто из Сишников подскажет...
8)
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

Это делалось по аналогии, увиденного в интернете.
С секундами/минутами/часами все работает, однако там все куда проще. После преобразования в двоичный код они сразу выводятся на дисплей и все...
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение HHIMERA »

двоично-десятичный формат был преобразован в двоичный

У вас в восьмеричный... а не в двоичный...
00111 это 73 в десятичном...
Последний раз редактировалось HHIMERA Вт янв 06, 2015 14:26:26, всего редактировалось 1 раз.
"Я не даю готовых решений, я заставляю думать!"(С)
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение a_skr »

Зачем Вы числа в восьмеричном виде написали? 00010 = 8. Хотя бы 0b00010. А ещё понятней в десятичном (1,2,3,4...).

ps. опередили :-)
И ещё, зачем из BCD переводить числа меньше 10-ти?
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

:facepalm:
Как тогда мне считать данные? Точнее даже не считать, а что писать в условие if?
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение a_skr »

Так и писать, только числа правильные поставить.

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

DS1307Read(0x03,&week); // Чтение регистра дня недели
lcd_gotoxy(0,1);
if(week == 1) lcd_string("SUN",3);
else if (week == 2) lcd_string("MON",3);
else if (week == 3) lcd_string("TUE",3);
else if (week == 4) lcd_string("WED",3);
else if (week == 5) lcd_string("THU",3);
else if (week == 6) lcd_string("FRI",3);
else  lcd_string("SAT",3);
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

У меня в таком случае выводит "SAT" всегда.
То есть дни недели не в виде 1-7...
(пробовал ставить условие и на субботу, однако тогда не выводит ничего - подтверждение предыдущих слов)
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение a_skr »

Возможно, при первом включении этот регистр не инициализирован и там ноль. Попробуйте туда записать значение от 1 до 7, а потом прочитать.
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

Спасибо за совет!
Да, так заработало.
Это гарантия, что все верно работает и будет считываться как нужно?
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение a_skr »

Выставьте день в семерку, время 23:59 и дождитесь переключения дня на единицу. Должно.
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

Выставил...
День не переключило... :(

Но дату прибавило.

Вот еще решил установить 28 декабря 2014 года, а оно мне:
Изображение
залить картинку
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15547
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение BOB51 »

Бывают кристаллы с поврежденной маской календаря...
И не только среди DSок - касается ВСЕХ типов RTC... :(
Проверь заведомо годным.
Насчет усяких симуляторов- инструкции на соответствующих ветках форума.
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

Всмысле?
Я в протеусе проверяю, там нерабочих деталей нет)
Под словом "симулятор" вы имели ввиду протеус?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15547
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение BOB51 »

Тогды точно "шпротоглюки" - надо искать ответ у спецов по шпроту. 8)
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение a_skr »

Вы, чего, издеваетесь, какой протеус??? в железе проверили?

ps. я Вам дам под десяток глюков Протеуса.... а я думал, Вы всё-таки в железе... жаль...
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

Все знают, что в протеусе досточно ошибок. Однако время выводит вполне адекватно, почему оно должно ошибаться с датой?
В железе нет возможности проверить, т.к. нет DS1307...

Я вот не пойму, в ds1307 информация хранится в двоично-десятичном коде, однако день недели (и т.д.) мы записываем в десятичном формате...
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение WiseLord »

А если не понимаете, то озвучьте разницу, чем отличается день недели (т.е., число, меньшее 8-ми) в двоично-десятичном формате от дня недели в десятичном?

P.S. Протеус вполне адектватно работает с DS1307, за исключением одного момента, что при старте программы день недели он из системного времени считает не Пн..Вс = 1..7, а как Вс..Сб = 1..7.
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

Отличается ведь...
Изображение
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение WiseLord »

Вы меня не так поняли, наверное. Я имел в виду, что непреобразованное десятичное число и преобразованное в двоично-десятичный формат ничем не отличается, если оно меньше 10.

Скажем, если нам надо записать в микросхему дату например, 23.02.2015, мы пишем:
Байт 4: 23 число => записываем в ячейку памяти 0x23, т.е. число 35.
Байт 5: 02 месяц => записываем в ячейку памяти 0x01, т.е. число 02.
Байт 6: 15 год => записываем в ячейку памяти 0x15, т.е. число 21.
День недели понедельник - пишем 01 как 0x01, оно же всё равно 01.
А вот для Proteus-a понедельник - это число 2 в DS1307.

P.S. Покажите, что у вас в коде сейчас вместо ранее приведённого ошибочного кода.
Аватара пользователя
tantrum
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Сб фев 09, 2013 11:39:13
Откуда: Украина, Марганец

Re: Всё по DS1307 и прочим часам Dallas (Maxim)

Сообщение tantrum »

На данный момент работает такой вариант (знаю, использовать switch лучше, однако на самом деле день недели мне не нужен будет, это так, лишь бы во всем разобраться)

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

 week_write = 5;
      DS1307Write(0x03, week_write);

      DS1307Read(0x03,&week); // Чтение регистра дня недели
      lcd_gotoxy(0,1);
      if(week == 1) lcd_string("SUN",3);
      else if (week == 2) lcd_string("MON",3);
      else if (week == 3) lcd_string("TUE",3);
      else if (week == 4) lcd_string("WED",3);
      else if (week == 5) lcd_string("THU",3);
      else if (week == 6) lcd_string("FRI",3);
      else  lcd_string("SAT",3);

Я специально назвал переменные по разному, чтобы убедиться в том, что данные записываются в микросхему и считываются.
tantrum писал(а):0x23, т.е. число 35.

А почему это число 35? Нам ведь нужно 23...
Аналогично и с годом...
Ответить

Вернуться в «Периферия»