Página 1 de 2
Declaração do TRISC no uso de I2C

Enviado:
04 Jun 2008 23:02
por lpagano
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!

Enviado:
04 Jun 2008 23:33
por tcpipchip
nada

Enviado:
05 Jun 2008 07:28
por lpagano
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?

Enviado:
05 Jun 2008 09:07
por Sergio38br
vc esta usando a rotina por harware ou por software
Sergio

Enviado:
05 Jun 2008 20:50
por lpagano
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.

Enviado:
06 Jun 2008 09:24
por Sergio38br
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

Enviado:
06 Jun 2008 11:20
por andre_luis
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.
+++

Enviado:
06 Jun 2008 11:32
por lpagano
Agora entendi.
Até o momento estou fazendo tudo via software, ou seja, não estou usando o módulo MSSP.
Valeu!

Enviado:
06 Jun 2008 14:41
por Sergio38br
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

Enviado:
07 Jun 2008 11:41
por lpagano
Valeu Sérgio,
Vou dar uma "enxugada" no seu código para fazer o meu funcionar só com uns displays de 7 segmentos.
Obrigado

Enviado:
07 Jun 2008 15:34
por lpagano
Só mais uma coisa: no I2C via software, onde a gente define qual a velocidade de comunicação entre os dispositivos?

Enviado:
08 Jun 2008 13:17
por MOR_AL
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

Enviado:
08 Jun 2008 19:18
por lpagano
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.

Enviado:
09 Jun 2008 07:39
por Sergio38br
Bom dia, nas rotinas por soft para I2C do mikroc esta definido em 100KHz a velocidade de clock
Sergio

Enviado:
09 Jun 2008 08:09
por lpagano
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!!!