Ir ao conteúdo
  • Cadastre-se

DS2430A com PIC 16F877 em C


Tiago Shimizu

Posts recomendados

Olá, tenho que fazer a comunicação de um PIC 16F877 com uma memória DS2430A onde preciso pegar o valor guardade na memória e mostrar em um display, logo em seguido, tenho que gravar na memória. Meu problema está em fazer a rotina de comunicação memória <-> PIC. Alguem teria algum exemplo? Gostaria de fazer isso em C. Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Posta o seu codigo aqui. mas apenas dando uma resumida.. 1-Wire é igual codigo morse... haha brincadeira.. mas o conceito é parecido ja que para enviar nivel logicoum voce coloca o nivel logico do bus em 0 por pouco tempo e para enviar 0 voce colocar por um periodo maior de tempo. Da uma olhada nesse tutorial da MAXIM: LINK

Depois se precisar .. avise o que esta acontecendo.

Lembre-se que 1-Wire tem quer ser open-drain... pelo menos ate onde eu lembro.

Abs

Link para o comentário
Compartilhar em outros sites

Cara, o código que estou utilizando é o seguinte:

#include <16F877A.h>

#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP

#use delay (clock=4000000)

#incluide <LCD.c>

#incluide <1wire.c>

float buffer;

void main (void)

{while (true)

{

if (input(PIN_A0))

{

reset_1w();

escreve_byte_1w (0xcc);

escreve_byte_1w (0x33);

escreve_byte_1w (0xF0);

reset_1w();

}

if (input(PIN_A1))

{

reset_1w ();

buffer = le_byte_1w ();

}

lcd_putc("f");

lcd_putc("buffer");

delay_ms(1000);

}

}

Cara, se puder me ajudar, preciso muito disso mesmo. valeu desde já.

Link para o comentário
Compartilhar em outros sites

Antes de tudo... imagino que sim .. mas você ta usando o CCS como compilador né? E a versão da 1wire.c é em portugues mesmo? Abs
Isto mesmo, estou utilizando o CCS. Quanto a 1wire.c pegue no site www.editoraerica.com.br nos arquivos de download do livro Microcontoladores PIC - Programação e C. Comprei até esse livro para ajudar mas nada. Agradeço desde já a ajuda.
Link para o comentário
Compartilhar em outros sites

Me desculpa pela demora mas não dei tempo de eu ver isso até hoje. Bom primeiramente não faz sentido o seu codigo. Por que raios voce manda os seguintes comandos:

Skip ROM

Read ROM

Search ROM

Se voce escreveu o Skip ROM a ideia é não se importar com o numero da ROM...

O que exatamente você quer fazer?

Abs

Link para o comentário
Compartilhar em outros sites

Bom, é o seguinte, tenho uma memória dassas instaladas em um equipamento aqui da empresa em que cada vez que ligo e/ou reseto ele, ele grava um valor + 1 na memória. Tipo, tinha 50 vezes ligado ele e reseto, vai para 51. Isso foi o que me passaram. Tenho que fazer essa comunicação para que o PIC comunique com o DS2430, faça a leitura de quantas vezes foi ligado/resetado e se preciso, modifique essa quantia. Cara, se puder me ajudar agradeço muito mesmo.

Link para o comentário
Compartilhar em outros sites

Bom eu vou supor que a biblioteca funciona e que a sua montagem esta certa. Segundo um exemplo do datasheet, um exemplo para ler e escrever o que esta na memoria seria:


#include <16F877A.h>
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP
#use delay (clock=4000000)
#incluide <LCD.c>
#incluide <1wire.c>

unsigned char buffer;
boolean detectado;

void main (void)
{
while (true)
{
if (input(PIN_A0))
{
detectado = reset_1w();
if(detectado)
{
escreve_byte_1w (0xCC);
escreve_byte_1w (0x0F);
escreve_byte_1w (0x02);
escreve_byte_1w (0x05);
detectado = reset_1w();
escreve_byte_1w (0xCC);
escreve_byte_1w (0x55);
escreve_byte_1w (0xA5);
delay_ms(10);
detectado = reset_1w();
detectado = 0;
}
else
{
lcd_putc("ERRO");
}
}
if (input(PIN_A1))
{
detectado = reset_1w();
if(detectado)
{
escreve_byte_1w (0xCC);
escreve_byte_1w (0xF0);
escreve_byte_1w (0x02);
buffer = le_byte_1w ();
detectado = reset_1w();
detectado = 0;
lcd_putc(buffer);
}
else
{
lcd_putc("ERRO");
}
}
delay_ms(1000);
}
}

Eu não sei como funciona a função lcd_putc.. ela pode receber um unsigned char como argumento? Ou seria um string? No caso do exemplo eu estou escrevendo na posição 2 da memoria o numero 5 .. e com o outro input lendo da posição 2 da memoria... voce leu o exemplo disponivel no datasheet?

Abs

Link para o comentário
Compartilhar em outros sites

Sink00, primeiro muito obrigado pela ajuda mas, não funcionou ainda... tipo, notei que depois do void main (void){ tava faltando o lcd_init(); para a inicialização do LCD. Bem, coloquei ele lá e também fiz a substituição do pino RD0 de comuinicação com o DS2430 pelo RD3 pois já estava usando o RD0. Segue em anexo o diagrama. Então, dei uma olhada no datasheet mas não entendi muito não. Tô testando esse circuito com o Proteus 7.1 antes de gravar no pic e ver na prátima. Estranho que era pra funcionar mesmo assim.
Link para o comentário
Compartilhar em outros sites

Como voce conseguiu? voce usou o meu codigo? O que voce mudou?

Sim isso é possivel mas nao como esta feito porque um dos comandos que esta sendo utilizado é para desativar o enderecamento dos dispositivos na linha 1-wire. Para ler cada dispositivo ja é mais chato.. mas é possivel sim.

Link para o comentário
Compartilhar em outros sites

Então, consegui utilizando seu código só que alterfando o parâmetro conectado e montando o circuito na bancada mesmo.

#include <16F877A.h>

#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP

#use delay (clock=4000000)

#use rs232 (baud = 19200, xmit = PIN_C6, rcv = PIN_C7)

#incluide <1wire.c>

unsigned char buffer;

boolean detectado;

void main (void)

{

while (true)

{

if (input(PIN_A0))

{

detectado = !reset_1w();

if(detectado)

{

escreve_byte_1w (0xCC);

escreve_byte_1w (0x0F);

escreve_byte_1w (0x02);

escreve_byte_1w (0x05);

detectado = !reset_1w();

escreve_byte_1w (0xCC);

escreve_byte_1w (0x55);

escreve_byte_1w (0xA5);

delay_ms(10);

detectado = !reset_1w();

detectado = 0;

}

else

{

printf ("ERRO");

}

}

if (input(PIN_A1))

{

detectado = !reset_1w();

if(detectado)

{

escreve_byte_1w (0xCC);

escreve_byte_1w (0xF0);

escreve_byte_1w (0x02);

buffer = le_byte_1w ();

detectado = !reset_1w();

detectado = 0;

printf ("%x\r\n",buffer);

}

else

{

printf ("ERRO");

}

}

delay_ms(1000);

}

}

Só notei que quando incluia a biblioteca do LCD (#incluide <LCD.c>), ele sempre retornava que havia uma memória conectada ao PIC, mesmo ela não estando. Então, decidi utilizar a UART mesmo. Se puder só me ajudar então a fazer essa leitura completa da memória e gravar em uma outra agradeço. Estava pensando em algo do tipo, utilizar dois pinos do PIC, um para a memória original e outro para que vai ser gravada. Daí fazer uma verificação, se a memória original estiver conectada e a zerada também, ele já faz essa gravação automaticamente. O que acha? E obrigado desde já pela ajuda.

Link para o comentário
Compartilhar em outros sites

E laia haha.. como eu so burro.. nao vi que o return do reset era 0 para presente e não 1. Bom eu so nao entendi uma coisa.. voce quer ler todaS aS memoriaS (varios dispositivos diferentes) ou Toda a memoria (de apenas um dispositivo)? Se for apenas um dispositivo fica bem simples. E a segunda memoria tambem é 1-wire? Se for existem dois modos. Um voce colocaria as duas memorias no mesmo barramento porém voce teria a dificuldade de obrigar o PIC a descobrir o enderećo delas o que da um pouco de trabalho. porém se voce quiser utilizar 2 pinos voce tera que alterar o codigo da 1wire.c pois aquelas funcoes sao definidas para um pino especifico. O que voce pode fazer é criar uma copia para cada funcao da 1wire para o segundo pino. Eu realmente nao entendi o problema que estava ocorrendo com o LCD. Quanto a como ler a memoria inteira eu vou deixar para voce ver se voce descobre. Pega o datasheet e da uma olhada no exemplo que ele tem e o no detalhamento de o que cada comando faz.

PS: Eu to com um teclado horrivel aqui que nao funciona nada. Me desculpe por todos os erros de portugues.

Abs

Link para o comentário
Compartilhar em outros sites

Obrigado desde já pela ajuda Sink00. Então, estava querendo copiar o 1wire.c e modifica-lo para que pudesse aceitar dois dispositivos. Até aí tranquilo. Estava dando uma olhada no datasheet dele e pelo que entendi teria de mandar un [F0h] (READ MEMORY) para ler toda a memória? Se sim, teria de colocar isso depois em uma variável ou dar um outro comando para já gravar na memória 2?

Link para o comentário
Compartilhar em outros sites

Então funciona assim. Antes de qualquer comunicação voce tem enviar um Reset. O primeiro comando que voce tem que enviar tem a ver com a ROM do dispositivo, que seria onde fica armazenado o endereço unico dele. Se você so tiver um dispositivo conectado no barramento voce você pode ou pedir o seu endereço através do comando Read ROM [33h], mas dai você não mandara nenhuma mensagem nesse caso. Se voce Ja souber o endereço dele, voce deve mandar um Match ROM [55h] e logo em seguida os 64 bits de endereço. A partir dai o que voce mandar tem a ver com a memoria mesmo. Para finalizar com um dispositivo, voce pode sempe mandar um Skip ROM [CCh] que seria o comando para ele ignorar o endereço ja que so existe um dispositivo no bus e nunca existira outro. Se você tiver mais d eum dispositivo voce tem que usar o comando Seach ROM[F0h] para descobrir o endereço de cada dispositivo. Bom passado isso os comandos que voce enviar serão para acessar a memoria do dispositivo, e dai sim o comando Read Memory [F0h] serve para voce ler a memoria. Apos esse comando voce deve passar o endereço de inicio que voce quer ler a memoria. A partir dai a memoria ira mandar endereço por endereço ate voce mandar um reset. Para ler a memoria toda basta mandar a seguinte ordem:

CCh

F0h

00h

ler 32 vezes a entrada

Reset

Abs

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!