Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Вт янв 06, 2015 12:49:24
Си - великая вэщ... но иногда источник великого садомазохизма...
Увы, пользуюсь токмо асмом, мож кто из Сишников подскажет...
Вт янв 06, 2015 14:20:43
Это делалось по аналогии, увиденного в интернете.
С секундами/минутами/часами все работает, однако там все куда проще. После преобразования в двоичный код они сразу выводятся на дисплей и все...
Вт янв 06, 2015 14:25:26
двоично-десятичный формат был преобразован в двоичный
У вас в восьмеричный... а не в двоичный...
00111 это 73 в десятичном...
Последний раз редактировалось
HHIMERA Вт янв 06, 2015 14:26:26, всего редактировалось 1 раз.
Вт янв 06, 2015 14:25:50
Зачем Вы числа в восьмеричном виде написали? 00010 = 8. Хотя бы 0b00010. А ещё понятней в десятичном (1,2,3,4...).
ps. опередили
И ещё, зачем из BCD переводить числа меньше 10-ти?
Вт янв 06, 2015 14:40:29
Как тогда мне считать данные? Точнее даже не считать, а что писать в условие if?
Вт янв 06, 2015 15:05:27
Так и писать, только числа правильные поставить.
- Код:
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);
Вт янв 06, 2015 19:24:00
У меня в таком случае выводит "SAT" всегда.
То есть дни недели не в виде 1-7...
(пробовал ставить условие и на субботу, однако тогда не выводит ничего - подтверждение предыдущих слов)
Вт янв 06, 2015 19:42:07
Возможно, при первом включении этот регистр не инициализирован и там ноль. Попробуйте туда записать значение от 1 до 7, а потом прочитать.
Вт янв 06, 2015 19:44:33
Спасибо за совет!
Да, так заработало.
Это гарантия, что все верно работает и будет считываться как нужно?
Вт янв 06, 2015 19:53:26
Выставьте день в семерку, время 23:59 и дождитесь переключения дня на единицу. Должно.
Вт янв 06, 2015 20:00:26
Выставил...
День не переключило...
Но дату прибавило.
Вот еще решил установить 28 декабря 2014 года, а оно мне:
залить картинку
Ср янв 07, 2015 08:42:20
Бывают кристаллы с поврежденной маской календаря...
И не только среди DSок - касается ВСЕХ типов RTC...
Проверь заведомо годным.
Насчет усяких симуляторов- инструкции на соответствующих ветках форума.
Ср янв 07, 2015 11:20:51
Всмысле?
Я в протеусе проверяю, там нерабочих деталей нет)
Под словом "симулятор" вы имели ввиду протеус?
Ср янв 07, 2015 11:56:37
Тогды точно "шпротоглюки" - надо искать ответ у спецов по шпроту.
Ср янв 07, 2015 15:51:15
Вы, чего, издеваетесь, какой протеус??? в железе проверили?
ps. я Вам дам под десяток глюков Протеуса.... а я думал, Вы всё-таки в железе... жаль...
Ср янв 07, 2015 16:59:59
Все знают, что в протеусе досточно ошибок. Однако время выводит вполне адекватно, почему оно должно ошибаться с датой?
В железе нет возможности проверить, т.к. нет DS1307...
Я вот не пойму, в ds1307 информация хранится в двоично-десятичном коде, однако день недели (и т.д.) мы записываем в десятичном формате...
Ср янв 07, 2015 18:00:31
А если не понимаете, то озвучьте разницу, чем отличается день недели (т.е., число, меньшее 8-ми) в двоично-десятичном формате от дня недели в десятичном?
P.S. Протеус вполне адектватно работает с DS1307, за исключением одного момента, что при старте программы день недели он из системного времени считает не Пн..Вс = 1..7, а как Вс..Сб = 1..7.
Ср янв 07, 2015 19:39:22
Отличается ведь...
Ср янв 07, 2015 20:21:00
Вы меня не так поняли, наверное. Я имел в виду, что непреобразованное десятичное число и преобразованное в двоично-десятичный формат ничем не отличается, если оно меньше 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. Покажите, что у вас в коде сейчас вместо
ранее приведённого ошибочного кода.
Ср янв 07, 2015 23:27:08
На данный момент работает такой вариант (знаю, использовать 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...
Аналогично и с годом...
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.