Ir ao conteúdo
  • Cadastre-se

PIC ler/modificar dados na eeprom de outro PIC


Posts recomendados

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 ?

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

 

 

Link para o comentário
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?

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...