Declaração do TRISC no uso de I2C

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Declaração do TRISC no uso de I2C

Mensagempor lpagano » 04 Jun 2008 23:02

Pessoal,

Estou fazendo um programinha no MikroC para usar o protocolo I2C no 18F4520, em que os pinos SDA e SCL ficam no PORTC.

Como essa comunicação é bidirecional, como deve ser feito na declaração do TRISC no início do programa?

Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor tcpipchip » 04 Jun 2008 23:33

nada
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor lpagano » 05 Jun 2008 07:28

E se caso eu utilize os outros pinos do PORTC conforme o exemplo abaixo,

TRISC.F0 = 0;
TRISC.F2 = 1;
TRISC.F5 = 0;

e por aí vai.


Está correto assim também?
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 05 Jun 2008 09:07

vc esta usando a rotina por harware ou por software

Sergio
Editado pela última vez por Sergio38br em 05 Jun 2008 09:40, em um total de 1 vez.
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor lpagano » 05 Jun 2008 20:50

Sérgio38,

Não entendi o que você quis perguntar.
Eu estou tentando comunicar o PIC com um DS1307 via I2C. O software é baseado num exemplo da Mikroe. Lê as horas e mostra num display.
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 06 Jun 2008 09:24

No mikroC tem exemplos utilizando uma rotina por software (Soft_I2C_Config,Soft_I2C_Start,Soft_I2C_Read,Soft_I2C_Write,Soft_I2C_Stop) e outra que usa o modulo MSSP(hardware), nesta especifica o compilador ativa o modulo MSSP e os pinos correspondentes são exclusivos, os outros pinos do port podem ser usados normalmente.

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor andre_luis » 06 Jun 2008 11:20

lpagano,

No CCS, existe uma diretiva chamada #uses_standard_io, que possibilita voce se abstrair da manipulação desse registrador. Procura algo semelhante nesse compilador.

Uma boa alternativa, seria voce substituir a linha de comando de Input/Output do pino por uma função, contendo essa declaração no TRIS.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor lpagano » 06 Jun 2008 11:32

Agora entendi.
Até o momento estou fazendo tudo via software, ou seja, não estou usando o módulo MSSP.

Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 06 Jun 2008 14:41

experimenta este exemplo, tem mais algumas coisas, que vc vai ter de tirar tipo display

Código: Selecionar todos


//**** VARIABLE DEFINITIONS  *********

    unsigned char sec, min1, hr, day, dow, mn, year;
    char *txt, *txt0, *txt1, *txt2, *txt3, *txt4, *txt5, *txt6, *txt8, tnum[4];
    char tnum2[4], tnum3[4], tnum4[4], tnum5[4], tnum6[4];





//**** FUNCTION DECLARATIONs ********

void start1307s();         //starting your ds1307 to caunt
void ds1307_init();       //initialization of ds1307
void ds1307_set_date_time(char day,char mth,char year,char dow,char hr,char min, int sec);   
//setting date and time
void ds1307_get_time_date(char *day, char *mth, char *year, char *dow, char *hr, char *min, char *sec);    //getting date and time from ds1307 to pic
void dateclock();
void Display_Time(char sec, char min, char hr, char day, char mn, char year) ;
void Zero_Fill(char *value);



//**** FUNCTION DEFINITIONs ********

void start1307s(){
    //START SIGNAL FOR DS1307***********
    Soft_I2C_Start();                 // issue start signal
    Soft_I2C_Write(0xD0);         // address of ds1307
    Soft_I2C_Write(0);              // start from word at address 0
    Soft_I2C_Write(0);              // write 0 to config word (enable counting)
    Soft_I2C_Stop();                // issue stop signal
    //**********************************
}//~end of function





void ds1307_init(){
    int seconds=0;

    //Soft_I2C_Config(&PORTC, 5, 2); //veja os pinos e o port que vc esta usando
    Soft_I2C_Start();
    Soft_I2C_Write(0xD0);      // WR to RTC
    Soft_I2C_Write(0x00);      // REG 0
    Soft_I2C_Start();
    Soft_I2C_Write(0xD1);      // RD from RTC
    seconds = Bcd2Dec(Soft_I2C_Read(0)); // Read current "seconds" in DS1307
    Soft_I2C_Stop();
    seconds = (seconds & 0x7F);

    Delay_ms(50);

    Soft_I2C_Start();
    Soft_I2C_Write(0xD0);      // WR to RTC
    Soft_I2C_Write(0x00);      // REG 0
    Soft_I2C_Write(Dec2Bcd(seconds));     // Start oscillator with current "seconds value
    Soft_I2C_Start();
    Soft_I2C_Write(0xD0);      // WR to RTC
    Soft_I2C_Write(0x07);      // Control Register
    Soft_I2C_Write(0x80);      // Disable squarewave output pin
    Soft_I2C_Stop();
}//~end of function





void ds1307_set_date_time(char day,char mth,char year,char dow,char hr,char min, int sec){
    sec =(sec & 0x7F);
    hr =(hr & 0x3F);

    Soft_I2C_Start();
    Soft_I2C_Write(0xD0);                    // I2C write address
    Soft_I2C_Write(0x00);                    // Start at REG 0 - Seconds
    Soft_I2C_Write(Dec2Bcd(sec));       // REG 0
    Soft_I2C_Write(Dec2Bcd(min));      // REG 1
    Soft_I2C_Write(Dec2Bcd(hr));        // REG 2
    Soft_I2C_Write(Dec2Bcd(dow));      // REG 3
    Soft_I2C_Write(Dec2Bcd(day));      // REG 4
    Soft_I2C_Write(Dec2Bcd(mth));     // REG 5
    Soft_I2C_Write(Dec2Bcd(year));    // REG 6
    Soft_I2C_Write(0x80);               // REG 7 - Disable squarewave output pin
    Soft_I2C_Stop();
}//~end of function





void ds1307_get_time_date(char *day, char *mth, char *year, char *dow, char *hr, char *min, char *sec){
    Soft_I2C_Start();
    Soft_I2C_Write(0xD0);
    Soft_I2C_Write(0x00);                     // Start at REG 3 - Day of week
    Soft_I2C_Start();
    Soft_I2C_Write(0xD1);
    *sec=Bcd2Dec(Soft_I2C_Read(1) & 0x7F);
    *min=Bcd2Dec(Soft_I2C_Read(1) & 0x7F);
    *hr=Bcd2Dec(Soft_I2C_Read(1) & 0x3F);
    *dow=Bcd2Dec(Soft_I2C_Read(1) & 0x7F);   // REG 3
    *day=Bcd2Dec(Soft_I2C_Read(1) & 0x3F);   // REG 4
    *mth=Bcd2Dec(Soft_I2C_Read(1) & 0x1F);   // REG 5
    *year=Bcd2Dec(Soft_I2C_Read(0));         // REG 6}
    Soft_I2C_Stop();
}//~end of function





void dateclock(){
    ds1307_get_time_date(&day, &mn, &year, &dow, &hr, &min1, &sec);
    Display_Time(sec, min1, hr, day, mn, year);    // prepare and display on LCD
}//~



void Display_Time(char sec, char min, char hr, char day, char mn, char year) {
    T6963C_waitReady();
    ByteToStr(day,tnum);
    txt0 = rtrim(tnum);
    Zero_Fill(txt0);

    T6963C_waitReady();
    ByteToStr(day,tnum);
    txt1 = rtrim(tnum);
    Zero_Fill(txt1);
    T6963C_write_text(txt1 , 0, 5, 1) ;
    T6963C_waitReady();

    ByteToStr(mn,tnum);
    txt2 = rtrim(tnum);
    Zero_Fill(txt2);
    T6963C_write_text(txt2 , 3, 5, 1) ;
    T6963C_waitReady();

    ByteToStr(year,tnum);
    txt3 = rtrim(tnum);
    Zero_Fill(txt3);
    T6963C_write_text(txt3 , 6, 5, 1) ;
    T6963C_waitReady();

    ByteToStr(hr,tnum);
    txt4 = rtrim(tnum);
    Zero_Fill(txt4);
    T6963C_write_text(txt4 , 0, 6, 1) ;
    T6963C_waitReady();

    ByteToStr(min,tnum);
    txt5 = rtrim(tnum);
    Zero_Fill(txt5);
    T6963C_write_text(txt5 , 3, 6, 1) ;
    T6963C_waitReady();

    ByteToStr(sec,tnum);
    txt6 = rtrim(tnum);
    Zero_Fill(txt6);
    T6963C_write_text(txt6 , 6, 6, 1) ;
    T6963C_waitReady();

}//~






void Zero_Fill(char *value) {    // fill text repesentation
    if (value[1] == 0) {           //      with leading zero
    value[1] = value[0];
    value[0] = 48;
    value[2] = 0;
    }
}//~


Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor lpagano » 07 Jun 2008 11:41

Valeu Sérgio,

Vou dar uma "enxugada" no seu código para fazer o meu funcionar só com uns displays de 7 segmentos.

Obrigado
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor lpagano » 07 Jun 2008 15:34

Só mais uma coisa: no I2C via software, onde a gente define qual a velocidade de comunicação entre os dispositivos?
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor MOR_AL » 08 Jun 2008 13:17

Olá lpagano. Tudo bem?

Olha. Até onde eu me lembro, a taxa de transferência está amarrada em um valor máximo que depende dos períodos mínimos dos pulsos (reset, presença, Tx 1, Tx 0 Rx 0 e Rx 1). Agora. A taxa mínima depende.
Apesar dos pulsos possuirem uma taxa aproximadamente constante, a taxa mínima depende do período que você espera até enviar novo byte.
Os períodos exigidos na comunicação I2C são aproximadamente estes:

Reset >= 480us
15us <= Wait <= 60us
60us <= Presença <= 240us

60us <= Tx "0" <= 120us
Tx "1" >= 1us

15us <= Read "0" <= 60us
Read "1" >= 1us

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor lpagano » 08 Jun 2008 19:18

Fala Mor_al

Na spec do DS1307 está escrito que a velocidade de comunicação entre ele e o uC deve ser de 100kHz pois o mesmo trabalha somente em stardard mode.
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 09 Jun 2008 07:39

Bom dia, nas rotinas por soft para I2C do mikroc esta definido em 100KHz a velocidade de clock

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor lpagano » 09 Jun 2008 08:09

Já que nesse caso ele trabalha em 100kHz, então vou conseguir fazer o que estou pretendendo.

Vou começar a montar o circuito de teste ainda hoje.

Valeu!!!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x