Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чтение времени с DS1904
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
swagger
Добрый день!
Подключил к контроллеру PIC16F876A часы реального времени DS1904 и сделал тестовую программку. Проблема в том что ID часов читается, а контрольный регистр и текущее время ни в какую (вернее читаются FF). Может кто подскажет в чем дело? Код программы ниже.
Код
#include "touch.c"


void touch_reset()
{
    output_low(TOUCH_PIN);
    delay_us(500);
    output_float(TOUCH_PIN);
}


void Set_Time(unsigned int32 Time)
{
    
   touch_write_byte(0x99);             //Write Clock register command
   touch_write_byte(0x0C);             //Set osc to run
            
   touch_write_byte(MAKE8(time, 0));   //LSB
   touch_write_byte(MAKE8(time, 1));
   touch_write_byte(MAKE8(time, 2));
   touch_write_byte(MAKE8(time, 3));   //MSB
                        
   touch_reset();                      //Transfer data from R/W buffer to register
    
}

BYTE buffer_ID[8];
unsigned int32 Get_ID()
{  

    BYTE i;
    
    touch_write_byte(0x33);
    
    for(i=0;i<8;++i)
    buffer_ID[i]=touch_read_byte();

    touch_reset();                      //According to datasheet flow chart it is needed
    
    return (buffer_ID);

}

   int8 TimeLSB, Time2, Time3, TimeMSB;
   int8 control_reg;
unsigned int32 Get_Time()
{
   touch_write_byte(0x66);             //Read Clock register command
   control_reg = touch_read_byte();    //Read control register
            
   TimeLSB  =  touch_read_byte();      //LSB
   Time2    =  touch_read_byte();
   Time3    =  touch_read_byte();
   TimeMSB  =  touch_read_byte();      //MSB

   touch_reset();                      //According to datasheet flow chart it is needed

   return(make32(TimeMSB, Time3, Time2, TimeLSB));

}

int8 Get_Status()
{
   int8 control_reg;
    
   touch_write_byte(0x66);             //Read Clock register
   control_reg = touch_read_byte();    //Read control register
    
   touch_reset();                      //Stop reading
    
   return(control_reg);
}

void main() {
   BYTE buffer[8];
   BYTE i;

   printf("\r\nWaiting for a touch device...\r\n");
   while (TRUE) {

    if(touch_present()) {
    Get_ID();
    }
    printf("\r\nID ok\r\n");

    Get_Time();
    printf("\r\ntime ok\r\n");

  }

}
swagger
Догнал в чем проблема была...
После чтения ID не надо было запрещать чтение.
Код
    touch_reset();                      //According to datasheet flow chart it is needed
xemul
Цитата(swagger @ Aug 27 2009, 13:15) *
Догнал в чем проблема была...
После чтения ID не надо было запрещать чтение.
Код
    touch_reset();                      //According to datasheet flow chart it is needed

Если таки делать в соответствии с даташитом, то сбросом шины операции на ванвари _начинаются_, а не заканчиваются.
И придумайте (себе) объяснение для каши из
BYTE buffer_ID[8];
unsigned int32 Get_ID()
{
...
return (buffer_ID);
}
и т.п. бесполезных return'ов (глобальных переменных).
И #include "touch.c" очень глазки режет...
swagger
можно поподробнее.....
Код
Если таки делать в соответствии с даташитом, то сбросом шины операции на ванвари _начинаются_, а не заканчиваются.
И придумайте (себе) объяснение для каши из
BYTE buffer_ID[8];
unsigned int32 Get_ID()
{
...
return (buffer_ID);
}
и т.п. бесполезных return'ов (глобальных переменных).

это была пробная программа, в окончательном варианте все возвраты были убраны.

Код
И #include "touch.c" очень глазки режет...

"touch.c" - стандартная библиотека компилятра, думаю ее не стоит мешать в собственный файл. Или может на это есть причины другие?
zltigo
Цитата(swagger @ Aug 28 2009, 08:52) *
"touch.c" - стандартная библиотека компилятра, думаю ее не стоит мешать в собственный файл. Или может на это есть причины другие?

Причины 4 sad.gif
1. не стандартная
2. не библиотека
3. не компилятора
4. Вы именно мешаете ее в собственый файл.
Просто какой-то исходник. И если у Вас дейсвительно компилятор, то комппилируется сия вещь вещь ОТДЕЛЬНО, делается действительно библиотека или объектный файл и потом уже Линкер склеивает воедино.
swagger
touch.c идет в папке драйвера в дитрибутиве CCS. Я работаю в MPlabe со встроенным ССS. Как ее превратить в библитеку/обеъктный файл? Чем они будут отличаться от просто файла *.с?
DpInRock
Просто убрать include, но включить в проект. Но тогда надо будет включить *.h с заголовками из *.с. Где-то должен быть touch.h....
xemul
Цитата(swagger @ Aug 28 2009, 09:52) *
можно поподробнее.....

Цитата
Если таки делать в соответствии с даташитом, то сбросом шины операции на ванвари _начинаются_, а не заканчиваются.

Что здесь уточнять, я не знаю. Достаточно взглянуть на flow chart'ы в datasheet'е, и сделать accordingly.
Цитата
BYTE buffer_ID[8];
unsigned int32 Get_ID()
{
...
return (buffer_ID);
}

Get_ID() по Вашему замыслу должна вернуть unsigned int32, но возвращает BYTE *. Если CCS на такое не выдал предупреждение о несоответсвии типов, то настоятельно рекомендую не пользоваться этим компилятором. (если выдал, но Вы проигнорировали, то ... "Каждый сам себе злобный буратин")
Ну и в контексте приведённой программы return (buffer_ID) будет всегда возвращать одно и то же число (а разумный компилятор должен был сделать retlw).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.