comunicar arduino con at89c52

hola soy nuevo en esto de arduino y no se si lo que les comentare es factible o estoy perdido en otra dimensión, resulta que tengo un circuito que es comandado por un at89c52 que se comunica mediante un cable con conector rj11 a otro circuito que utiliza un at87f52, la cosa es que estuve siguiendo las lineas y encontre con ambos at se comuican mediante la salida rx y tx respectivamente.

Lo que necesito saber es que mensajes se envian principalmente desde el at89c52, entonces se me ocurrio y necesito saber si es factible comunicar un arduino en su entrada rx (o asignar otro pin como rx) la salida tx del at89c52 para que reciba los mensajes y poder ver que mensaje es el que envia para poder despues probar el envio del mensaje por el puerto tx del arduino al rx del at87f52.

Espero me puedan ayudar ya que la idea principal es dejar de usar el at89c52 y reemplazarlo por un arduino.

Hi,
Seguro que se puede pero vaz a tener que hacer una routina para poder recibir la data.

Claro que puedes.
Es armar un monitor de protocolos o tramas.

Mira los ejemplos de comunicaciónes de Arduino.

Escribe un código que muestre todo lo que reciba y limita la presentación a digamos 80 columnas

Luego al observar las tramas podras identificar códigos ASCII o HEXA que te permitan cambiar de linea.
Dependerá de lo que intercambies esos dispositivos.

Debes compartir GND con ambos micros y solo RX como has dicho.

Hi,
Adjunto un link que explica como leer del puerto RX y las diferentes forma de leerlo. Espero que te sirva.

Bueno estuve siguiendo sus indicaciones y se unieron los pines rx de arduino con el tx del at89c52, además de unir el pin gnd del lado digital del arduino con el gnd del at89c52.

Luego cargue para capturar desde el puerto rx el siguiente codigo:

int incomingByte = 0;

void setup() {

Serial.begin(9600); // opens serial port, sets data rate to 9600 bps

}

void loop() {

if (Serial.available() > 0) {

incomingByte = Serial.read(); // read the incoming byte:

Serial.print(" I received:");

Serial.println(incomingByte);

}

}

y en el monitor serial al ejecutar una accion en el at89c52 se recibia por el rx del arduino lo siguente:

La duda es la siguiente, esos valores que se muestran los tengo que transformar en algo?, es decir si yo escribo en el monitor el valor 128 arduino manda por tx el valor 49 50 56 que no es lo mismo que el 128.

Hi,
Eso es correcto la infomacion la envia en ascll code.

Entonces para enviarla desde el programa del arduino al at87f52 tendria que colocar algo asi:

Serial.write("Ç");

que según el código ascii seria el 128.

como seria si tengo que enviar lo siguiente:

I received:128
I received:0
I received:128

Si me lo pudieran aclarar

puedes enviar

Serial.write(128);
Serial.write(0x80);
Serial.write("Ç");

Desde mi punto de vista si vas a ver tramas esto

if (Serial.available() > 0) {
  incomingByte = Serial.read(); // read the incoming byte:
  incomingByte = Serial.read(); // read the incoming byte:
  Serial.print(" I received:");
  Serial.println(incomingByte);
}

Es ridículo, por qué? Porque si tienes una trama de 10 lineas estarás intententado entender en 10 lineas que has recibido.
Lo que yo te dije antes era que leyeras lo que se recibe y lo presentes en formato Hexadecimal para comenzar y armando un panel de digamos 20 o 40 columnas

Algo asi

#define MAXCOL  40
int incomingByte = 0;

void setup() {
  Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop()  {
  static int columna = 0;

  if (Serial.available() > 0) {
      incomingByte = Serial.read(); // read the incoming byte:
      Serial.print();
      Serial.print(incomingByte, HEX);
      if (columna++> MAXCOL) {
          columna = 0;
          Serial.println();
      }
  }  
}

ok no habia entendido, voy a aplicar el codigo que dejaste y publico los resultados.

Bueno realice la prueba con el codigo entregado por Brattain y como resultado al pulsal cada boton se obtuvieron valores como los siguientes:

808008080080
0808080
80080

Estos valores por el codigo de captura estarian en hexadecimal y me surge una nueva duda, como enviar dichos valores para que sean entendidos por el pic AT87F52.

Tu querías monitorear y ahora hablas de enviar códigos? Ya monitoreaste?

Hola, pero si lo coloque en el primer post

"Lo que necesito saber es que mensajes se envian principalmente desde el at89c52, entonces se me ocurrio y necesito saber si es factible comunicar un arduino en su entrada rx (o asignar otro pin como rx) la salida tx del at89c52 para que reciba los mensajes y poder ver que mensaje es el que envia para poder despues probar el envio del mensaje por el puerto tx del arduino al rx del at87f52."

La captura de los mensajes son para tener el codigo que le envia la botonera (at89c52) al equipo principal (at87f52) y poder eliminar la botonera para que sea un arduino quien comande ahora las acciones.

En resumen cada pulsador de la botonera genera un codigo como los que mostre más arriba que se capturaron como indicó surbyte, si no se pulsa nada en la botonera no entrega ningún codigo.

Lo que ahora no me queda claro es como llevar ese codigo para que el arduino lo comande. no se si lo tendría que replicar tal cual porque ese es el mensaje que envío la botonera o se debe hacer algo más.

Si fuera que tengo que enviar el mismo código como tendria que hacerlo, no se si debo convertirlo a binario y recien pasarlo al serial.write.

Por eso pedia de su ayuda para poder entender bien el proceso que tengo que realizar.

Lo que no sabemos es qué tanto has monitoreado? Por que todo lo que has leído parece ser 80hex?
A mi me parece que falta, pero solo lo supongo.

Hola surbyte, te cuento si no realizo ninguna acción en la botonera el serial del arduino no muestra nada, si preciono un boton X me muestrara el codigo coorespondiente a ese boton ej. 80080 y se quedara con eso, no mostrara nada más, porque se termino de precionar el boton.

Entonces que más podria monitorear como indicas si solo aparece codigo al precionar cada boton?

Cada boton tiene su código al precionar se envía y eso es todo el mensaje.

Para probar si es correcto el mensaje la unica forma seria enviarlo por el puerto tx, pero que tratamiento debo hacerle al codigo para enviarlo, usar serial.write o serial.print para que lo tome como hex y no como ascii?

Bueno justamente por eso.. cada boton tiene su código pero resulta que el FORO no esta observando que haces y si no lo compartes no nos enteramos.

Solo has puesto el código de 1 botón, entonces yo pensé que te faltaba monitoreor el resto, o que eso que monitereabas estaba inconcluso.

Si tienes 16 teclas, pues indicas los códigos de las 16 teclas.
Armas un código que las contenga y luego reproduces todo a ver si puedes emular el comportamiento.

Esa sería basicamente el camino que hay que seguir, cosa que esas haciendo pero bueno aca no se ve eso, se ve algo parcializado.

Te dejo desarrollar la idea.

Hi,
Sugerencia porque no tratas de usar la instruccion switch .. case. Ahi puedes poner todos tu switches , le assigna que hacer y cuando apriets un botn el te hara lo que tu defines. Veras que se se te hara mas facil.

surbyte Tienes toda la razón, disculpa por la omisión se me paso.

Una duda para enviar por ejemplo el código 0808080

funcionara hacerlo de la siguiente manera:

byte codigo[4] = {0x08,0x08,0x08,0x0};


void setup() {
  Serial.begin(9600);
}

void loop() {

// Se utiliza pin 1 (TX)

  Serial.write(codigo, 4);
}

tauro0221 efectivamente deberia usar lo que indicas, solo que antes que todo debo hacer que realice la acción desde el arduino, teniendo ya listo para un código el resto seria realizar la implementación que indicas que pondre al finalizar este proyecto.

Nunca use write de ese modo pero chequeando la información parece que funcionará.

Lo que yo haría es probar estas códigos que has detectado, reemplazando el elemento emisor actuar por el arduino y ver como se comporta el dispositivo. No digo nada que no sepas, es solo el plan de acción lógico.