comunicación serie PIC a PIC

1

Necesito enviar toda la información del puerto de una foto a otra usando el puerto serial ..

actualmente utiliza una velocidad de transmisión de 9600 bps. en pic18f4550 corriendo a 20 mhz reloj.

He utilizado este código para enviar y recibir datos de un solo puerto.

enviar:

while(1)
{
    TXREG=PORTB;
    while(PIR1.TXIF==0);
    delay_ms(100);
} 

y recibe:

while(1) 
{
       while(PIR1.RCIF==0); 
       PORTB=RCREG;
}

en tx parte PORTB se establece como entrada y en RX PORTB se establece como salida.

Necesito enviar / recibir toda la información de los puertos ... ¿Cómo se puede hacer?

    
pregunta Suraj Bhawal

1 respuesta

2

Necesitas escribir un protocolo de transferencia simple.

Básicamente, debe encontrar una manera de que un PIC le diga al otro: "Este es el comienzo de los datos, aquí están los datos, y este es el final de los datos". Eso podría ser tan simple como iniciar y finalizar su flujo de datos con caracteres identificables, idealmente caracteres que nunca estarán en su flujo de datos, o más complejos, por lo que tiene un encabezado que describe los datos que están por llegar, y una suma de comprobación para garantizar que los datos se recibieron correctamente.

El método más comprensible (para nosotros) es enviar los datos como texto ASCII puro, tal vez en forma de una cadena hexadecimal. Entonces, para 4 puertos enviaría 8 caracteres 0-9A-F seguidos de un retorno de carro para marcar el final de los datos, digamos una secuencia como:

017F36AB<cr>
017F36AB<cr>
017F26AB<cr>
017F26AB<cr>
017FA6AB<cr>

etc.

Luego, depende de su PIC de recepción decodificar cada carácter en un valor de 4 bits y unir los pares de caracteres en un solo valor de 8 bits.

El método de recepción más simple sería definir una matriz que sea lo suficientemente grande como para recibir todos los caracteres (8 bytes en este caso). Cuando los personajes llegan, miras para ver si es un personaje. Si es así, entonces decodificas los caracteres en tu matriz. Si es 0-9 o A-F, luego desliza los caracteres en su matriz hacia abajo un espacio (perdiendo el más antiguo), y luego agrega el nuevo carácter a la parte superior de su matriz. Esto se denomina ventana deslizante , donde tiene una "ventana" de 8 bytes en el flujo de datos que está llegando y las "diapositivas" de datos más allá de la ventana.

Un arreglo más complejo sería como escribí para mi Biblioteca ICSC para Arduino que define una estación de envío y recepción (para permitir comunicación entre muchos chips), un comando, un bloque de datos de longitud variable y una suma de comprobación final. El formato del paquete que se me ocurrió es:

(Todos los valores son de 8 bits y los nombres simbólicos son valores estándar ASCII.)

Preámbulo:

 76543210
+--------+
| SOH    |
+--------+
| SOH    |
+--------+
| SOH    |
+--------+
| SOH    |
+--------+

Paquete:

 76543210
+--------+
| SOH    |
+--------+
| DestID |
+--------+
| OrigID |
+--------+
| Cmd    |
+--------+
| DatLen |
+--------+
| STX    |
+--------+
| Data 0 |
| Data 1 |
| ...    |
| Data N |
+--------+
| ETX    |
+--------+
| Cksum  |
+--------+
| EOT    |
+--------+

Checksum es la suma de todos los bytes entre (pero sin incluir) SOH y ETX, módulo 256.

La dirección de destino especial 0x00 es la transmisión. Todas las estaciones recibirán y actuar sobre los mensajes enviados a esta dirección.

Deben evitarse las direcciones que equivalen a los símbolos ASCII SOH, etc.

La recepción e identificación de paquetes se realiza a través de una ventana deslizante de 6 bytes que identifica El encabezado de un paquete. A medida que llegan los bytes entran en la parte superior de la ventana y se abren camino hacia el fondo a medida que llegan más bytes. Cuando el primero el byte de la ventana es SOH, el último byte es STX y el ID de Dest es 0x00 o el ID de la estación receptora, se supone que está llegando un paquete válido. Desde este punto en DatLen, los bytes se leen en el búfer de datos. Si los siguientes tres bytes no son iguales a ETX, la suma de comprobación válida y EOT, entonces la el paquete es rechazado De lo contrario, se ejecuta la función asociada con el comando.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas