Problemas com rotinas do DS1821.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Problemas com rotinas do DS1821.

Mensagempor bomber-eng » 18 Abr 2007 14:39

Pessoal, estou com um problema sério em conseguir fazer minha rotina funcionar com o DS1821. Estou usando a Rotina do Fábio Pereira para 1 wire e tentei fazer uma rotina de leitura de temperatura atravéz do datasheet do DS1821.
Estou colocando aqui junto a rotina completa, inclusive a 1wire do Fábio Pereira.
Gostaria muito que dessem sugestões onde estou errando, pois já não sei pra onde escapar.
Muito obrigado pela ajuda e atenção de todos.

void main(void)
{
setup_counters(RTCC_INTERNAL,wdt_2304ms);


// configura os TRIS
set_tris_a(0b11111111); // configuração dos pinos de I/O
set_tris_b(0b11000000);
set_tris_c(0b00001111);
set_tris_d(0b00000011);
set_tris_e(0b00000111);

// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
.
.
.
.
etc..

/************************************************************************/
/* 1WIRE.C - Biblioteca de comunicação 1-wire */
/* */
/* Autor: Fábio Pereira */
/* */
/************************************************************************/

// definição do pino de comunicação
// Para utilizar outro pino, basta incluir uma nova definição antes
// de incluir este arquivo na aplicação desejada
#ifndef pino_1w
#define pino_1w pin_b7 // define o pino RD0 como comunicação 1-wire
#endif

#inline
void seta_saida_1w (void)
// coloca a saída em la impedância
{
output_float (pino_1w);
}

#inline
void limpa_saida_1w (void)
// coloca a saída em nível 0
{
output_low (pino_1w);
}

boolean reset_1w(void)
// reseta os dispositivos no barramento
{
boolean presente = 0;
limpa_saida_1w ();
delay_us(480);
seta_saida_1w ();
delay_us(60);
presente = input (pino_1w);
delay_us (240);
return (presente);
// 0 = dispositivo presente
// 1 = nenhum dispositivo detectado
}

void alimenta_barramento_1w (void)
// força o barramento em nível alto
// utilizado com dispositivos alimentados no modo parasita
{
output_high (pino_1w);
delay_ms(1000);
seta_saida_1w();
}

boolean le_bit_1w (void)
// lê um bit do barramento 1-wire
{
// dá um pulso na linha, inicia quadro de leitura
limpa_saida_1w (); // coloca saida em zero
seta_saida_1w (); // retorna a saída a um
delay_us (15); // aguarda o dispositivo colocar
// o dado na saída
return (input(pino_1w)); // retorna o dado
}

void escreve_bit_1w (boolean bit)
// escreve um bit no barramento 1-wire
{
limpa_saida_1w ();
if (bit) seta_saida_1w (); // coloca dado 1 na saida
delay_us (120);
seta_saida_1w ();
}

byte le_byte_1w (void)
// lê um byte do barramento 1-wire
{
byte i, dado = 0;
// lê oito bits iniciando pelo bit menos significativo
for (i=0;i<8;i++)
{
if (le_bit_1w ()) dado|=0x01<<i;
delay_us(90); // aguarda o fim do quadro de leitura
// do bit atual
}
return (dado);
}

void escreve_byte_1w (char dado)
// escreve um byte no barramento 1-wire
{
byte i, temp;
// envia o byte iniciando do bit menos significativo
for (i=0; i<8; i++)
{
temp = dado>>i; // desloca o dado 1 bit à direita
temp &= 0x01; // isola o bit 0 (LSB)
escreve_bit_1w (temp); // escreve o bit no barramento
}
}


//Escreve configuração no DS1821
void DS1821_Escreve_Config( char config )
{
reset_1w();
escreve_byte_1w( 0x0C );
escreve_byte_1w( config );
delay_ms(20);
}

//Lê configuração do DS1821
char DS1821_Le_Config( void )
{
reset_1w();
escreve_byte_1w( 0xAC );
return le_byte_1w();
}

//Lê o valor da Temperatura do DS1821
char DS1821_Le_Temperatura( void )
{
reset_1w();
escreve_byte_1w( 0xAA );
return le_byte_1w();
}

//Inicia Conversão da Temperatura
void Inicia_Conversao( void )
{
reset_1w();
escreve_byte_1w( 0xEE );
delay_ms(100);
}

//Para Conversão da Temperatura
void Para_Conversao( void )
{
reset_1w();
escreve_byte_1w( 0x22 );
}

//Mede a Temperatura
char Mede_Temperatura( void )
{
char Temp;
Inicia_Conversao();
Temp=DS1821_Le_Temperatura();
Para_Conversao();
return Temp;
}

void ler_temperatura(void)
{
//alimenta_barramento_1w();
config = 0;
reset_1w();
DS1821_Escreve_Config(config);
envia_byte_lcd(0,0xC0); // posiciona o cursor na linha 1, coluna 0
printf (escreve_lcd,"%03u", reset_1w());
envia_byte_lcd(0,0xC4); // posiciona o cursor na linha 1, coluna 0
printf (escreve_lcd,"%03u", DS1821_Le_Config());
envia_byte_lcd(0,0xC8); // posiciona o cursor na linha 1, coluna 0
printf (escreve_lcd,"%03u",Mede_Temperatura());
return;
}
bomber-eng
Bit
 
Mensagens: 14
Registrado em: 21 Nov 2006 05:36

Voltar para PIC

Quem está online

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

cron

x