Ir ao conteúdo

DS2430A com PIC 16F877 em C


Tiago Shimizu

Posts recomendados

Postado

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.

  • 2 semanas depois...
Postado

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

Postado

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á.

Postado

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

Postado
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.
Postado

É, a parada é complicada mesmo... Peguei vários exemplos na internet de ligação1wire porém não consegui fazer a bendita ligação com o 16F877. E agora, quem poderá nos salvar? Espero que não seja o chapolin colorado! Hehehe.

Postado

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

Postado

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.

Postado

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

Postado
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.
Postado

ALgumas perguntas... voce consegue ver como esta o sinal da linha onewire no Poteus? Aparece alguma coisa escrita no LCD? Tente fazer por partes.. primeiro faça o LCD funcionar sozinho... depois coloque a memoria.

Postado

Então, consigo fazer o LCD iniciar e aparecer a mesnsagem que quiser. Depois tento comunicar com o DS2430 e ele me dá a mensagem de erro! Que não detecta o DS2430 no pino correspondente.

Postado

Bom, em fim consegui essa bendita comuinicação. Somente gostaria de apenas mais uma informação, tipo, no exemplo que passou mandou ler uma memória específica do DS2430. Teria como fazer uma leitura de todas as memórias dele simultaneamente e copialas para uma outra?

Postado

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.

Postado

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.

Postado

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

Postado

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?

Postado

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

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!