Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Tiago Shimizu

DS2430A com PIC 16F877 em C

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, encontrei uma biblioteca (1wire.c) para fazer a comunicação 1-wire com memórias mas até agora tô tentando discubrir como faz pra usar! Algum tem algo mais?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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á.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O uso de uma memória EEPROM externa de 32 bytes com o PIC 16F877 é inútil, já que ele tem uma memória EEPROM interna de 256 bytes, e você não precisa se preucupar com a interface.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É que na realidade, só estou utilizando o 16F877 como uma interface com o computador e visto que tinha um sobrando utilizei ele!

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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?

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×