I2C com o PIC 16F877A eo PCF8575

Enviado:
22 Jun 2009 22:58
por rodrigoadachi
Ola,
Alguem já utlizou esse carinha PCF8575?
Tem algum exemplo pro CCS?

Enviado:
23 Jun 2009 08:12
por ze
sim e não
sim:
http://www.asm51.eng.br/phpbb/viewtopic ... light=8575
não:
ccs
veja se os ex. do fábio podem ajudar
abç

Enviado:
23 Jun 2009 20:38
por rodrigoadachi
KKKKKKKKKKKKKKKKKKKKKKKKK
lellis kk
Ja tinha visto em seus posts q vc num gsta do CCS, pq? kkk

Enviado:
24 Jun 2009 23:15
por rodrigoadachi
Como faço para ler ou escrever em uma porta do PCF8575?


Enviado:
25 Jun 2009 07:39
por ze
lendo o datasheet.....(rs pero no mucho)
me lembro que sofri um pouco pra tal feito. Cá estão algumas rotinas que lhe podem [não] ser [in]úteis.
- Código: Selecionar todos
void i2c_waitForIdle()
{
while ((SSPCON2 & 0x1F) | RW ); // wait for idle and not writing (PIC18F252)
//while ((SSPCON2 & 0x1F) | STAT_RW ); // wait for idle and not writing (PIC16F876A)
}
/******************************************************************************************/
void i2c_start()
{
i2c_waitForIdle();
SEN=1;
}
/******************************************************************************************/
void i2c_repStart()
{
i2c_waitForIdle();
RSEN=1;
}
/******************************************************************************************/
void i2c_stop()
{
i2c_waitForIdle();
PEN=1;
}
/******************************************************************************************/
- Código: Selecionar todos
unsigned char i2c_write( unsigned char i2cWriteData )
{
i2c_waitForIdle();
SSPBUF = i2cWriteData;
return ( ! ACKSTAT ); // function returns '1' if transmission is acknowledged
}
escrever no port
- Código: Selecionar todos
void outsaida(unsigned int sd)
{
i2c_start();
i2c_repStart();
i2c_write(0b01001110);//comando escreve no port i2c
i2c_write(sd);
sd>>=8;
i2c_write(sd);
i2c_stop();
}
Rotinas pra ler o port e configurar o i2c no pic fica por sua conta ou de outro ot... bom samaritano.
abç

Enviado:
26 Jun 2009 10:27
por rodrigoadachi
Lelis
fiz um teste assim
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <input.c>
#include <_lcd.c>
#use i2c(master, sda=PIN_c4, scl=PIN_c3)
#define LED_STATUS pin_a0
#define key1 input(pin_a3)
#define key2 input(pin_a4)
#int_timer0
void MeuTimer(){// TIME INTERNO
static int time;
static boolean led;
set_timer0(78-get_timer0());
time++;
if (time == 1000){ // TEMPO DE PISCAR LED STATUS CPU
time=0;
led=!led;
output_bit(LED_STATUS,led);
}
}
void write_ext_sram(BYTE address, BYTE data){
i2c_start();
i2c_write(0xa0);
i2c_write(address);
i2c_write(data);
i2c_stop();
}
BYTE read_ext_sram(BYTE address)
{
BYTE data;
i2c_start();
i2c_write(0xa0);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}
void main() {
BYTE value;
BYTE address;
int dado;
set_timer0(78);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64);
enable_interrupts(int_timer0);
enable_interrupts(GLOBAL); // Habilita registrador de interrupção.
portb = 0;
set_tris_b(0b11000000);
inicializa_lcd();
limpa_lcd();
while(true){
address=0x20;
value=0b01001110;
if (key1){ // escreve
lcd_pos_xy(1,1);printf(escreve_lcd,"Escreve: %X ",address);
lcd_pos_xy(1,2);printf(escreve_lcd,"Dado: %X ",value);
WRITE_EXT_SRAM( address, value );
}
if (key2){ // ler
dado=READ_EXT_SRAM( address );
lcd_pos_xy(1,1);printf(escreve_lcd,"Ler: %X ",address);
lcd_pos_xy(1,2);printf(escreve_lcd,"Dado: %X ",dado);
}
}
}
Vi q no datasheet do PCF8575
A2 A1 A0 I2C BUS SLAVE ADDRESS
L L L 32 (decimal), 20 (hexadecimal)
mas naum screveu nada nas saidas..