ARV

Members
  • Публикации

    1 646
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    5

Последний раз ARV выиграл 24 мая

Публикации ARV были самыми популярными!

Репутация

463 Хороший

2 подписчика

О ARV

  • Звание
    Живу я тут

Информация

  • Пол
    Мужчина
  • Город
    Новочеркасск

Электроника

  • Стаж в электронике
    Более 20 лет
  • Сфера радиоэлектроники
    Микроконтроллеры, цифровая электроника

Посетители профиля

3 260 просмотров профиля
  1. Работа с DS1307

    И практически один в один то, что делает компилятор сам, при обращении к битовым полям
  2. Работа с DS1307

    Ничуть не сложнее, чем в выбранном вами подходе Конечно, придется значение секунд, например, брать из двух полей, но прозрачность этого действия лучше, чем Bin_Bin10, имхо. Для индикации секунд и минут даже проще - не надо никаких преобразований, все уже преобразовано. Для редактирования через меню при настройке - тоже (если вводить поразрядно, конечно). В общем, дело вкуса, как обычно
  3. Работа с DS1307

    Да чем же?! Имхо, чем меньше преобразовний форматов данных, тем лучше.
  4. Работа с DS1307

    Для работы - достаточно, но для блочной записи-чтения уже не применимо, т.к. форматы байтов и их количество сильно разнятся.
  5. Работа с DS1307

    Вам @Alex советовал, и я присоединяюсь, сделать структуру для времени, и работать уже с нею. DS-ке все равно, 1 байт вы в неё зафигачете, или сразу несколько, а для получения времени и установки со структурой будет удобнее: Вот в соответствии с распределением памяти DS-ки вам разумно свои данные о времени хранить в структуре, полностью повторяющей первые 3 строки этой таблицы: typedef struct{ uint8_t sec : 4; // единицы секунд uint8_t ten_sec : 3; // десятки секунд uint8_t ch : 1; // ?? не помню uint8_t min : 4; // единицы минут uint8_t ten_min : 3; // десятки минут uint8_t reserved : 1; // не используется uint8_t hour : 4; // единицы часов uint8_t ten_hour : 2; // дестяки часов (см. am_pm) uint8_t am_pm : 1; // 12-часовая или 24-часовая система (влияет на интерпретацию десятков часов) uint8_t reserved2 : 1; // не используется } ds_time_t; Вы у себя в программе храните время в том же самом формате, как и DS-ка, например, в переменной ds_time_t my_time; И тогда для установки времени вам надо записать в DS-ку всю эту структуру целиком DS_Write(0, &my_time, sizeof(my_time)); А для того, чтобы узнать время, надо целиком эту структуру прочитать DS_read(0, &my_time, sizeof(my_time));
  6. Работа с DS1307

    Зачем же писать 256, если занимает 1 байт? Вы ж байтами передаете, значит 1 и писать.
  7. Работа с DS1307

    В общем случае при помощи sizeof, но чаще всего вы и так знаете, сколько данных собираетесь передавать.
  8. Работа с DS1307

    Да отделаться-то можно... но в конечном итоге это может быть менее удобно. Указатель обладает способностью "указывать" на данные любой длины, а любая переменная всегда имеет фиксированный размер. Поэтому функцию "под любой" размер с указателями всегда можно приспособить и для работы с int, например, а вот функцию для работы с int приспособить для работы с char будет сложновато...
  9. Работа с DS1307

    Указатели в Си - это та самая бритва, при помощи которой можно сделать шедевр или кровавое месиво Это да, приводить и тут надо. Собственно, ваш подход я и сам применяю, т.к. придерживаюсь принципа "лучше написать больше, но понятнее".
  10. Работа с DS1307

    Ну так теперь можно и не создавать указатель на какой-то участок памяти МК значение указателя p сделать равным значению pData. Собственно говоря, это по сути лишнее, привести тип указателя можно было бы и сразу в месте, где эти данные требуются, без промежуточного указателя. Взять байт по указателю и увеличить указатель на 1. Вообще говоря, все вышесказанное - азы Си... без знаний этого в Си, как без рук.
  11. Работа с DS1307

    Тут, скорее всего, речь не о машинном слове, а о "текстовом" слове
  12. Работа с DS1307

    Описание этой функции должно быть понятно из её названия и параметров: запись блока (указатель на записываемые данные и количество байтов этих данных). Вы за 5 минут можете написать её самостоятельно из имеющихся у вас функций записи 1 байта и обычного цикла.
  13. Работа с DS1307

    Ну так вообще говоря, обмен с внешними устройствами обычно и делается при помощи функции типа write_block(void* data, int data_len) ну и чтение аналогично.
  14. Работа с DS1307

    1 байт может быть не очень удачным вариантом, т.к. в момент подачи питания содержимое ОЗУ может быть СЛУЧАЙНЫМ, а байт задает всего 256 комбинаций. Т.е. вероятность того, что случайно содержимое этого байта станет равно вами заданному 1/256. В случае со строкой вероятность кардинально меньше, и чем длиннее строка, тем выша гарантия, что ложных "срабатываний" не будет.
  15. Работа с DS1307

    RAM - это ОЗУ, оно не сохраняет содержимое при снятии питания. В случае с DS1307 эта память питается от батарейки и будет хранить содержимое все время, пока батарейка подключена. При отключении батарейки, естественно, "слово" сотрется. Некорректное состояние календаря никак не повлияет на часы, т.к. календарь меняется по часам, а не наоборот.