Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > часы реального времени


Автор: ОВиталий 4.5.2009, 00:23
здравствуйте! помогите кто может....
я собрал в протеусе элементарную схему: МК атмега8, часы реального времени ds1307 и I2C debuger(подключен параллельно с часами). написал черновую программку,  суть которой(идеале) вытягивать время из часов. 
я хотел для начала вытянуть минуты. но почему то когда я пытаюсь передать адрес минут, я получаю секунды (это видно в I2c debuger). знаю что где то ошибка но не знаю где. 
использую WinAvr 

Код

#include<avr/io.h>
#include <avr/delay.h>
#include <util/twi.h>
//------------------------------------
int start_twi(void){
    TWCR = 0xA4;                //  1010 0100(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
    while (!(TWCR & 0x80));

    if ((TWSR & 0xF8) == 0x08)
        return 0;
    else
        return 1;
}
int sla_r(unsigned char read_addr)
{
    TWDR = read_addr;
    TWCR = 0x84;                //  1000 0100(1<<TWINT)|(1<<TWEN)
    while (!(TWCR & 0x80));

    if ((TWSR & 0xF8) == 0x40)
        return 0;
    else
        return 1;
}
//------------------------------------
int sla_w(unsigned char write_addr){
    TWDR = write_addr;
    TWCR = 0x84;                //  1000 0100(1<<TWINT)|(1<<TWEN)
    while (!(TWCR & 0x80));

    if ((TWSR & 0xF8) == 0x18)
        return 0;
    else
        return 1;
}
//------------------------------------
int read_byte_twi(){
    TWCR = 0xC4;                //  1100 0100(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
    while (!(TWCR & 0x80));

    if ((TWSR & 0xF8) == 0x50)
        return 0;
    else
        return 1;
}
//------------------------------------
void stop_twi(void) {
    TWCR = 0x94;                //  1001 0100(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)

    if (TWSR == 0x00)
        TWCR = 0x90;                //  1001 0000(1<<TWINT)|(1<<TWSTO)
}
//-------------------------
int main(){
int i=0;
i=start_twi();
    i=sla_r(0b11010000);
            i=sla_r(1);
                read_byte_twi();
                    stop_twi();

return 0;
}



буду благодарен за любую помощь. 

Автор: cardinal 4.5.2009, 00:41
Особо не вникал, но возможно дело вот в чем:
Цитата

Data is transferred with the most significant bit (MSB) first.

ну и тут посмотри таблицу на 8 стр. внизу
http://datasheets.maxim-ic.com/en/ds/DS1307.pdf

Автор: ОВиталий 4.5.2009, 13:26
с этим вопросом считывания разобрался.  спасибо!

НО не могу сформировать СТОП условие. можно ли как нибудь без него обойтись, но что бы потом, если понадобиться мог еще раз воспользоваться часами? 

Автор: cardinal 4.5.2009, 18:56
Цитата(ОВиталий @  4.5.2009,  11:26 Найти цитируемый пост)
НО не могу сформировать СТОП условие. можно ли как нибудь без него обойтись, но что бы потом, если понадобиться мог еще раз воспользоваться часами? 

Пожалуйста, один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)