Alex

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

    4 785
  • Зарегистрирован

  • Посещение

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

    3

Последний раз Alex выиграл 3 декабря 2017

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

Репутация

551 Очень хороший

О Alex

  • Звание
    Убиватель МК
  • День рождения 01.01.1981

Контакты

  • ICQ
    461500721

Информация

  • Пол
    Мужчина
  • Интересы
    Микроконтроллеры, программирование.

Электроника

  • Стаж в электронике
    10-20 лет

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

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

    Ну да. Только без умножения на 10
  2. Работа с DS1307

    Ну да, это оно. Двоично-десятичное конвертирование. Один в один по функционалу как у меня.
  3. Работа с DS1307

    Согласен...
  4. Работа с DS1307

    Выдрал из какого-то проекта : #ifndef _DS1307_H #define _DS1307_H /**************************************************************/ #include "i2c.h" /**************************************************************/ typedef struct{ unsigned char sec; unsigned char min; unsigned char hours; unsigned char day; unsigned char date; unsigned char month; unsigned char year; unsigned char control; }t_ds1307; /**************************************************************/ char DS1307_Init(void); void DS1307_Read(t_ds1307* p_struct); void DS1307_Write(t_ds1307* p_struct); /**************************************************************/ #endif // _DS1307_H #include "ds1307.h" static t_ds1307 ds1307; ........................... ........................... ........................... /****************************************************************/ static void DS1307_Read_Struct(){ unsigned char i, *p=(unsigned char*)&ds1307; I2C_Start(); I2C_Write(0xD0); I2C_Wait_Idle(); I2C_Write(0x00); I2C_Wait_Idle(); I2C_Stop(); I2C_Start(); I2C_Write(0xD1); I2C_Wait_Idle(); for(i=0;i<8;i++){ I2C_Write_ASK(1); *p++=I2C_Read(); I2C_Wait_Idle(); } I2C_Stop(); } /****************************************************************/ static void DS1307_Write_Struct(){ unsigned char i, *p=(unsigned char*)&ds1307; I2C_Start(); I2C_Write(0xD0); I2C_Wait_Idle(); I2C_Write(0x00); I2C_Wait_Idle(); for(i=0;i<8;i++){ I2C_Write(*p++); I2C_Wait_Idle(); } I2C_Stop(); } /****************************************************************/ /****************************************************************/ static unsigned char Bin10_Bin(unsigned char val){ return (val&0x0F)+(unsigned char)(val>>4)*10; } /****************************************************************/ static unsigned char Bin_Bin10(unsigned char val){ return ((val/10)<<4)|(val%10); } /****************************************************************/ void DS1307_Read(t_ds1307* p_struct){ DS1307_Read_Struct(); p_struct->sec=Bin10_Bin(ds1307.sec); p_struct->min=Bin10_Bin(ds1307.min); p_struct->hours=Bin10_Bin(ds1307.hours); p_struct->day=(ds1307.day&0x0F); p_struct->date=Bin10_Bin(ds1307.date); p_struct->month=Bin10_Bin(ds1307.month); p_struct->year=Bin10_Bin(ds1307.year); } /****************************************************************/ void DS1307_Write(t_ds1307* p_struct){ ds1307.sec=Bin_Bin10(p_struct->sec); ds1307.min=Bin_Bin10(p_struct->min); ds1307.hours=Bin_Bin10(p_struct->hours); ds1307.day=p_struct->day; ds1307.date=Bin_Bin10(p_struct->date); ds1307.month=Bin_Bin10(p_struct->month); ds1307.year=Bin_Bin10(p_struct->year); DS1307_Write_Struct(); } /****************************************************************/ Тем, что я помню - в структуре были байты Согласен. Но в случае с битовыми полями, тяжело будет работать со структурой в основной программе.
  5. Работа с DS1307

    Блин, Вы меня смутили Полез в старые архивы смотреть...
  6. Работа с DS1307

    Для примера, функция чтения : void DS_Read(uint8_t addrr, void* pData, uint8_t size){ uint8_t * p= (uint8_t*)pData; I2C_StartCondition(); //начало передачи I2C_SendByte(0b11000000); // Режим чтения. Не уверен, что 0b11000000. В даташит лень лезть. I2C_SendByte(addrr);//Переходим на addrr while(size--) *p++ = RTC_ConvertFromDecBin(I2C_ReciveByte()); // С RTC_ConvertFromDecBin не уверен. Не знаю, как у вас данные обратно выворачиваются I2C_StopCondition(); } Могут быть ошибки. Проверьте всё (бит чтения, ф-ия чтения с I2C, ф-ия обратного конвертирования данных). У него, скорее всего, функция RTC_ConvertFromBinDec сама преобразовывает из байта в тетрады. Достаточно завести в структуре байты с полными значениями секунд/минут/часов. Хотя, не уверен. Не видя кода, тяжело сказать...
  7. Работа с DS1307

    Не нужно передавать каждое значение по-отдельности, теряется смысл создания этой функции. Её назначение - принять блок данных (массив, структуру, ...). Если Вы со структурами не очень дружите, то для начала можете создать обычный массив, в котором будут хранится часы, минуты, секунды. И работать с ним. PS: Кстати, эта функция, скорее всего, пойдёт и для записи данных в RAM. Просто укажите начальный адрес расположения памяти. На сколько я помню, в часах вся память линейна. Начало - часы с календарём, потом идёт RAM.
  8. Работа с DS1307

    Будет зависить от того, что передаёте. Ну а вообще - sizeof() В случае со строкой - strlen()
  9. Работа с DS1307

    Потому, что нельзя передать в функцию сразу 100500 переменных. Можно конечно, но кровь из глаз потечёт от вида этой функции. По этому и применяют указатель. Он - адрес блока данных. А по нему (указателю) уже забирают данные.
  10. Работа с DS1307

    Помнится, у меня не получалось инкрементировать указатель на void. Может я что-то неправильно делал, но забил и просто создаю отдельный на uint8.
  11. Работа с DS1307

    Это указатель на блок данных. void - чтобы можно было передавать указатель любого типа, не преобразовывая его явно к uint8_t при передачи в функцию. Это обычное преобразование типа void к uint8_t Это инкремент указателя, с взятием значения по нему.
  12. Работа с DS1307

    @-=FISHER=- Вот у Вас код : //Устанавливаем время I2C_StartCondition(); I2C_SendByte(0b11010000); I2C_SendByte(0);//Переходим на 0x00 I2C_SendByte(RTC_ConvertFromBinDec(0)); //секунды I2C_SendByte(RTC_ConvertFromBinDec(31)); //минуты I2C_SendByte(RTC_ConvertFromBinDec(20)); //часы I2C_SendByte(RTC_ConvertFromBinDec(5)); //день недели I2C_SendByte(RTC_ConvertFromBinDec(29)); //дата I2C_SendByte(RTC_ConvertFromBinDec(1)); //месяц I2C_SendByte(RTC_ConvertFromBinDec(16)); //год I2C_StopCondition(); Создайте функцию , типа : void DS_Write(uint8_t addrr, void* pData, uint8_t size){ uint8_t * p= (uint8_t*)pData; I2C_StartCondition(); //начало передачи I2C_SendByte(0b11010000); //режим записи I2C_SendByte(addrr);//Переходим на addrr while(size--) I2C_SendByte(RTC_ConvertFromBinDec(*p++)); I2C_StopCondition(); } и применяйте её для записи в часы, вместо простыни из кучи строк. Можно создать структуру, в которой будут хранится секунды всякие, минуты, ... И передавать адрес этой структуры в функцию.
  13. Работа с DS1307

    Да я понял. По этому и выделил его Хотел написать что такое "слово" и что нужно применять слово "Строка", но лениво
  14. Работа с DS1307

    Ничего страшного, это всё пройдёт со временем Это был пример. Так сказать, некий шаблон, который обычно реализуют для передачи/приёма данных.
  15. Работа с DS1307

    Ну, вообще, да. Но фразы : настораживают