CodeVision e a 24c256

Software e Hardware para ATMEL

Moderadores: 51, guest2003, brasilma

CodeVision e a 24c256

Mensagempor fmaesso » 21 Jul 2007 18:53

Boa noite!
Estou tentando usar a lib que vem junto com o CodeVision pra ler/escrever em uma 24C256 junto a um ATMega8, mas o danado nao vai.
Estou usando os pinos 4 da porta C para dados e 5 da porta C para clock.
Depois de por um pullup no clock as coisas melhoraram um pouco ... agora tenho clock, mas se ponho um pullup no pino de dados, o pino de dados nao baixa o suficente pra memoria notar. resultado! sempre grava 0xFF.
Algem já usou o codevision pra ler esta memoria? tem alguma pegadinha que ainda nao pagei o pedagio?
O que estou fazendo é o feijao com arroz que dao no help. Tambem ja tentei definir na os parametros de porta como entrada e saida de tudo que é forma que dá, mas nadas.
Se alguem souber , por favor dá uma dica!

Obrigado e boa noite
Fernando Maesso
fmaesso
Bit
 
Mensagens: 17
Registrado em: 16 Nov 2006 17:21

Mensagempor RobL » 23 Jul 2007 08:19

Se com um pullup os pulsos não baixam suficientemente, você tem um problema de HW e nao de SW.
Caso esteja testando em protoborad ou similar o problema é a capacitância dele. Há uma alta capacitância em suas portas. Baixe a frequencia o máximo que puder para teste.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor fmaesso » 23 Jul 2007 10:04

Poderia ser melhor, mais este está funcionando. Se alguem puder melhorar seria bom.


#define SDADDR DDRC.4
#define SCLDDR DDRC.5
#define SDAPIN PINC.4
#define SCLPIN PINC.5
#define SDAP PORTC.4
#define SCLP PORTC.5

#define wr_eep_pos 0xA0
#define rd_eep_pos 0xA1

unsigned char mask_val[8] = {0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};


//*******************************************************
//
//*******************************************************
void I2C_init(void){
SDADDR = 1;
SCLDDR = 1;
SDAP = 1;
SCLP = 1;

}

//*******************************************************
//
//*******************************************************
void I2C_start(void){
SDADDR = 1; //torna SDA em saida
SDAP = 1;
delay (5);
SCLP = 1;
delay (3);
SDAP = 0;
delay (3);
SCLP = 0;

}

//*******************************************************
//
//*******************************************************
void I2C_stop(void){

SDADDR = 1; //torna SDA em saida
SDAP = 0;
delay(3);
SCLP = 1;
delay(8);
SDAP = 1;
delay(3);
SCLP = 0;
}

//*******************************************************
//
//*******************************************************
void I2C_SCL_TOGGLE(void){
delay (3);
SCLP = 1;
delay (8);
SCLP = 0;
delay (8);
}

//*******************************************************
//
//*******************************************************
void I2C_ACK(void){
SDADDR = 1; //torna SDA em saida
SDAP = 0;
delay(8);
SCLP = 1;
delay(8);
SCLP = 0;
delay(3);
}

//*******************************************************
//
//*******************************************************
void I2C_NAK(void){
SDADDR = 1; //torna SDA em saida
SDAP = 1;
delay(3);
SCLP = 1;
delay(8);
SCLP = 0;
delay(3);
}


//*******************************************************
//
//*******************************************************
void I2C_write(unsigned char b){
unsigned char i;
SDADDR = 1; //torna SDA em saida
SDAP = 1;
for (i = 0; i < 8;i++){
if (b & mask_val[i]){
SDAP = 1;
#asm("nop");
}else{
SDAP = 0;
#asm("nop");
}
I2C_SCL_TOGGLE();
}
SDADDR = 0;
SDAP = 1;
delay(2);
SCLP = 1;
#asm("nop");
for (i = 0; i < 100;i++){
if (!SDAPIN) break;
}
SCLP = 0;
delay(3);

}

//*********************************************************************
//
//*********************************************************************
unsigned char I2C_read(unsigned char last){
unsigned char i, b, p;

SDADDR = 0;
b = 0;
for(i = 0;i < 8;i++){
SCLP = 1;
#asm("nop");
#asm("nop");
#asm("nop");
if (SDAPIN){
b |= mask_val[i];
}
SCLP = 0;
#asm("nop");
#asm("nop");
#asm("nop");
}
SDADDR = 1;
return b;
}



//******************************************************
//Le da EEPROM externa para a RAM nos enderecos H e L,
//na quantidade i
//******************************************************
void read_eeprom(unsigned char *Dest, unsigned char H, unsigned char L, unsigned char i){
unsigned char I;
TIMSK=0x00;
ptr_to_ram = Dest;
I2C_start();
I2C_write(wr_eep_pos);
I2C_write(H);
I2C_write(L);
I2C_start();
I2C_write(rd_eep_pos);
for (I = 0; I < i; I++){
*ptr_to_ram++ = I2C_read(0);
I2C_ACK();
}
I2C_read(0);
I2C_NAK();
I2C_stop();
TIMSK=0x04;
}

//******************************************************
// Escreve na EEPROM os dados em Origem no enderece H e L,
// na quantidade i
//******************************************************
void write_eeprom(unsigned char *Origem, unsigned char H, unsigned char L, unsigned char i){
unsigned char I;
I2C_start();
I2C_write(wr_eep_pos);
I2C_write(H);
I2C_write(L);
for (I = 0; I < i; I++){
I2C_write(*ptr_to_ram++);
}
I2C_stop();
delay_ms(20);
}


Fernando Maesso
fmaesso
Bit
 
Mensagens: 17
Registrado em: 16 Nov 2006 17:21


Voltar para AVR

Quem está online

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

x