I2C com o PIC 16F877A eo PCF8575

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

I2C com o PIC 16F877A eo PCF8575

Mensagempor rodrigoadachi » 22 Jun 2009 22:58

Ola,

Alguem já utlizou esse carinha PCF8575?

Tem algum exemplo pro CCS?
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor ze » 23 Jun 2009 08:12

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor rodrigoadachi » 23 Jun 2009 20:38

KKKKKKKKKKKKKKKKKKKKKKKKK

lellis kk

Ja tinha visto em seus posts q vc num gsta do CCS, pq? kkk
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor rodrigoadachi » 24 Jun 2009 23:15

Como faço para ler ou escrever em uma porta do PCF8575?
:roll:
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor ze » 25 Jun 2009 07:39

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor rodrigoadachi » 26 Jun 2009 07:53

Valew...

Vou tentar aki
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor rodrigoadachi » 26 Jun 2009 10:27

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..
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil


Voltar para PIC

Quem está online

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

x