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

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
sergiohardware

PIC ler/modificar dados na eeprom de outro PIC

Recommended Posts

Prezados, tenho um 16f628a (pinos 7 e 8 RX TX) que se comunica com um 12f675 (neste emulando uma comunicação serial). Na eeprom deste 12f675 tenho um número 1234. Como seria no CCS 5.015 um código em que o 628a pudesse ler o 1234, alterá-lo 4321, e regravá-lo por cima na eeprom do mesmo 12f675 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O certo seria mesmo fazer isso, mas na verdade não fiz nada ainda, queria só ver como seria um código que fizesse + - isso, que aí eu prosseguiria avançando no que tenho em mente. Preciso só de uma 'direção'. Qual comando usar ? como seria a estrutura, etc ? ...grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém tem algum palpite sobre como um 16f628a poderia ler/alterar dado na eeprom de um 12f675 estando os dois ligados com 2 fios (comunicação serial).?

 

Como poderia ser um código c no CCS 5.015 ? ...só pra dar um 'norte' para que eu possa ajustar meu pensamento.

 

valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta algo como um protocolo qualquer. Por partes. P.ex. leiamos a eeprom do 675

-o 675 fica esperando um comando de leitura L e endereço E

for(;;)

{

if (getc())=='L')

{

while (getc()!=E); \\espera endereço

putc(eepromread(E));

}

}

-o 628 envia L e quer saber o que tem no E

putc('L');

getc(E);

 

É só um micro_start. Tem maneiras mais inteligentes e seguras pra tal façanha. Espero que abra portas e sua mente.

A propósito, já fez um pisca led? Nada melhor que ele pra iniciar a dominação do micro_mundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa. Mas a dificuldade maior reside em ler o dado vindo do 675 e armazená-lo em uma variável int16 dentro do 16f628a para daí tratá-lo como eu quiser. No exemplo acima, como seria esta parte no 628a ?.

 

Depois disso este post acaba.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então não há dificuldade alguma.

Anallise isto...
 

unsigned int _INT16
putc('L');//ler
_INT16=getc(E);//1o byte vai ser meu...
_INT16<<=8; //...MSB
_INT16=getc(E+1);//e o 2o no LSB

Perceba que tens que ter 2 bytes de eeprom em 2 endereços sequenciais pra formar um int16.

 

Penso que não há nescessidade de fechar. Pode ser que precise de + luz. (p.ex. pra escrever um int16 no 675)

 

adicionado 13 minutos depois

Ah sim... supõe-se que o argumento E da getc() será usado como endereço da eeprom_read() no 675. Portanto, deves criar sua própria getc(unsigned char).... cara tá ficando confuso kk... Mas a essência pra ler 1 int: leia 1 byte nele, desloque 8x pra esquerda, faça um OR com próxima leitura. Talvez isto te baste temporariamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal. O que esta acontecendo é que estamos utilizando um pic 16f628a enviando a letra 'C'. Se este 'C' corresponder ao que está no 12f675, este 12f675 retorna para o 16f628 um "0" como confirmação e logo em seguinda o que esta nas variaveis a,b,c e d atraves do comando printf. Este dados "saem" do 12f675. Não estamos conseguindo capturar estes dados no 16f628 e armazena-los em um int16.

 

segue o que temos no 12f

 

char dado[9];
int i;
int a=9,b=9,c=9,d=9;
int confirma=0;

void serial(){

 gets(dado);

 if(dado[0]=='C' ) {     
 
  x[0]="0";
  }
  for(i=0;i<2;i++){
  delay_ms(250);
  putc(x);}
 printf("%1u""%1u""%1u""%1u",a,b,c,d);
}

duvidas.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso pessoal, o colega dvd_junio e eu estamos buscando a informação que nos falta para prosseguirmos. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

talvez...

 

Eu faria tudo com putc() e getc() no campo dos bytes mesmo sem o guloso printf(). De fato nem isso. Acessaria direto o hw do mc..., getc() trava o processamento esperando chegar algo. Mas esquece isso por hora.

 

Vejamos se entendi seu protocolo... No 675:

unsigned char a,b;//c,d nem precisa
//...
a=eeprom_read(x);
b=eeprom_read(x+1);
//...
if (getc()=='C')
{
putc('0');
putc(a);putc(b);//putc(c);putc(d);...// pra variável int nem precisa de c e d ok?
}
//...

no 628:

unsigned int d;
//...
putc('C');
//...
if (getc()=='0')
{
d=getc();
d<<=8;
d|=getc();
}

pronto: d é o conteúdo de 2 bytes da eeprom do 675

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não deu certo. Continua na mesma. 16f envia o 'C', o 12f decodifica e retorna o '0'. Qualquer valor forçado, por exemplo se eu declarar que a=1 , quando executo o putc(a), a serial não envia o '1' conforme declarado anteriormente. Só sai o putc('0');

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok. Tem que achar a origem do problema.  Faça rotinas das quais você sabe o que vai sair delas e observe o terminal. P.ex.

putc(1);putc(2);putc(3);putc(4);
putc('A');putc('B');putc('C');putc('D');

ou

for(;;) putc(a++);

Configure corretamente o terminal para ascii ou hex e, claro, seu correto baud rate

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo que coloco entre aspas simples ''  no putc sai corretamente do micro e é mostrado no terminal virtual. Por exemplo:

putc('z') -> sai e e mostrado no terminal a letra z

putc('i') -> sai e e mostrado no terminal  a letra i

putc('p') -> sai e e mostrado no terminal a letra p

putc('3') -> sai e e mostrado no terminal o numero 3

 

Como fazer para sair no putc o valor de uma variavel declarada?

Por exemplo:

x= 8

putc(x)

 

Fazer este 8 sair e ser mostrado no virtual terminal?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

progresso...

 

Seu terminal está configurado pra mostrar asc-ii. Tenta:

x=8

putc(x+'  ');//ou

putc(x+0x30);

Lembrando que é só pra você ver no terminal. Pra transmitir de um mc a outro não precisa  (e nem deve) colocar +0x30

você pode também configurar seu terminal para ver em decimal (ou hex). Isto é o + correto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Recapitulando: No pic 12F675 estou enviando um int16 pela serial e desejo "representar" este mesmo int16 no pic 16F628a.

Consegui separar esta int16 em dois bytes enviando cada byte por vez como pode ser visto na imagem abaixo. O valor que esta na int16 é o numero 6453. Mostro atraves do print na simulação do proteus este valor ja  variavel kw1 e ele "saindo" pelo tx como mostrado no virtual terminal  (6453 dec = 198F hex).  Não tô conseguindo direcionar estes dados em uma variavel no pic16F.  Estou usando o compilador CCS. 

pic.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Podem fechar o topico. Consegui. Para "quebrar" o int16 no 12F e envia-lo pela serial usei a funçao make8 e para "juntar" o int16 no 16F usei a funçao make16 do compilador CCS.

 

 

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

×