Cómo pasar datos de un microcontrolador a otro usando UART

Mi concepto es que tengo dos placas diseñadas, una con AT90USB1287, otra con ATmega32A, ambas funcionan correctamente.

AT90USB1287 está hablando con la PC a través de USB. ATmega32A está hablando con la PC a través de USART (RS232).

Ahora conecté la placa ATmega32A a AT90USB1287 usando la comunicación UART (cable RS232 al deshabilitar la conexión a la PC) porque ambas placas tienen que funcionar juntas con una PC. La forma más fácil es la conexión UART entre esos dos.

Si quiero enviar datos de ATmega32A a la PC, tengo que obtener datos de ATmega32A a ATusb901287 y enviarlos a la PC a través de USB.

Estoy confundido sobre cómo obtener datos de ATmega32A a AT90USB1287. He proporcionado conexiones como 1. pin RxD conectado, es decir, PD0, es decir, pin 14 de ATMega32 a pin TxD, es decir, PD3, es decir, pin 28 de AT90USB1287 2. pin TxD conectado, es decir, PD1, es decir, pin 15 de ATMega32 a pin RxD, es decir, PD2, es decir, pin 27 de AT90USB1287 3. Los pines USB de AT90USB1287 están conectados al USB de la PC.

Actualizado

He implementado la funcionalidad UART para ambos controladores.

El problema es que no puedo enviar el comando que obtuve de la PC a AT90USB1287 a través de USB. el comando estará en el búfer de recepción USB. Tengo que enviar el comando a otro microcontrolador usando UART de AT90usb1287.

Actualizado2:

Tengo un problema más con esta comunicación entre dos microcontroladores usando USART. Tengo el código de interfaz para ambos controladores como este.

Tengo la primera placa con microcontrolador AT90USB1287 que está conectado a la PC mediante USB, tengo varios comandos como este "CMD", "TEMP" ... Cuando envío el comando da la respuesta. Que está funcionando perfectamente. Tengo que conectar otra placa que contenga un microcontrolador ATmega32A a esta placa usando USART. Me conecté e implementé la comunicación USART en ambas placas, incluso la segunda placa también tiene un formato de comando similar y también necesito enviar un comando para obtener una respuesta.
Para enviar el comando desde la PC a la segunda placa, primero tengo que enviar el comando a la placa AT90USB1287 usando comunicación USB y de ahí a ATmega32A usando USART. Lo he hecho y también puedo obtener una respuesta de la segunda placa, pero tengo un problema. Lo que sucede con mi código es que cualquier comando que envíe desde la PC se envía a la segunda placa, necesito cambiar como solo los comandos que existen en la segunda placa deben enviarse a la segunda placa.

¿Alguien puede sugerirme cómo dejar de enviar todos los comandos y enviar solo esos 5 comandos relacionados con el segundo tablero? Por favor, ayúdame con esto.

Respuestas (2)

No entiendo tu confusión. Desea comunicarse entre los dos controladores con UART, entonces, por supuesto, ambos necesitan capacidades y código UART para esto. Su computadora tiene controladores y software para manejar esto, por lo que su microcontrolador también necesita un controlador para ello.

Su ATmega32 necesita la funcionalidad UART TX, mientras que AT90USB1287 necesita la funcionalidad UART RX. Habiendo escrito tanto TX como RX para su ATmega32, escribir la rutina UART RX para AT90 debería ser muy sencillo. Puede agregar un valor de bit de algún tipo, identificando que el UART RX en AT90 proviene de su ATmega32 y pasarlo directamente a USB.

EDITAR: Código de AVRFreaks que está escrito para at90usb1287

#include <avr/io.h> 
#include <util/delay.h> 

#define RXC      (RXC1) 
#define TXC      (RXC1) 
#define UCSRC    (UCSR1C) 
#define UCSRB    (UCSR1B) 
#define UCSRA    (UCSR1A) 
#define UDR      (UDR1) 
#define UBRRL    (UBRR1L) 
#define UBRRH    (UBRR1H) 
#define UBRR     (UBRR1) 
#define UDRE     (UDRE1) 
#define RXCIE    (RXCIE1) 
#define TXEN     (TXEN1) 
#define RXEN     (RXEN1) 
#define UCSZ0    (UCSZ10) 
#define UCSZ1    (UCSZ11) 
#define UMSEL0   (UMSEL10) 
#define UMSEL1   (UMSEL11) 

#define FRAMING_ERROR (1<<FE1) 
#define PARITY_ERROR (1<<UPE1) 
#define DATA_OVERRUN (1<<DOR1) 
#define DATA_REGISTER_EMPTY (1<<UDRE1) 
#define RX_COMPLETE (1<<RXC1) 

#define FOSC 16000000 

typedef unsigned char       Uchar; 
typedef unsigned long int   Uint32; 

#define Wait_USART_Ready() while (!(UCSR1A & (1<<UDRE1))) 

#define lowByte(w) ((uint8_t) ((w) & 0xff)) 
#define highByte(w) ((uint8_t) ((w) >> 8)) 

int main(void) 
{ 
/* Disable clock division */ 
clock_prescale_set(clock_div_1); 
   UBRRH = (Uchar)((((Uint32)FOSC)/((Uint32)USART_BAUDRATE*16)-1)>>8); 
   UBRRL = (Uchar)(((Uint32)FOSC)/((Uint32)USART_BAUDRATE*16)-1) & 0x0ff; 

   UCSRB |= (1 << RXEN) | (1 << TXEN); 
   UCSRC |= (1 << UCSZ1) | (1 << UCSZ0); 

   char ReceivedByte; 
   for (;;) // Loop forever 
   { 
      while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR 
      ReceivedByte = UDR; // Fetch the received byte value into the variable "ByteReceived" 

      while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it 
      UDR = ReceivedByte; // Echo back the received byte back to the computer 
   } 
}
Gracias por tu respuesta, sí, ahora entiendo. Necesito escribir la rutina UART Rx y la rutina UART Tx para AT90USB1287 para recibir y enviar datos hacia y desde atmega32a. ¿Me pueden ayudar con esa rutina?
No he escrito para esos controladores exactos antes, pero si ha escrito para un AVR, debería poder escribir para otro con bastante facilidad.
Hola, he escrito un código para la funcionalidad UART AT90USB1287. El problema es que el código que publiqué originalmente está recibiendo el comando de la PC a AT90USB1287 a través de USB. Ahora quiero enviar ese comando a ATmega32 a través de UART. Por favor, ayúdame a enviar eso. Si necesita más código, lo publicaré.
Necesitas leer algo sobre UART. Es casi exactamente el mismo código, no puedo entender por qué esto debería causar confusión si ya entendiste y escribiste una rutina UART. No tengo tiempo para leer las hojas de datos y escribir la rutina para usted. Estoy empezando a sospechar que no ha escrito el código usted mismo si no puede entender cómo hacerlo.
Lea y comprenda UART, no puedo entender su problema. Dices que sabes cómo escribir una rutina UART, pero en la práctica haces cosas que simplemente no tienen sentido
Creo que no entendiste bien mi problema. He escrito y funcionando correctamente. El primer comando proviene de la PC a AT90USB, estará en el búfer de lectura de AT90USB. tengo que averiguar qué elemento de read_buffer es mi comando. Digamos, read_buffer[2] es mi comando, luego asigne read_buffer[2] a UDR para la transmisión a ATMega32A como. Entonces ese es mi problema. Interconexión entre USb y UART. cuando envío un comando desde la PC, llega al búfer USB, pero no puedo asignar ese búfer a Uart Tx.

debe leer el contenido del búfer de entrada USB (en la interrupción USB rx, por ejemplo) y copiar su contenido en el búfer UART TX. Y eso es.

Ya tienes todo el código para configurar los puertos UART. Solo tiene que pasar los datos de un búfer RX a otro búfer TX.

Con algo de código adhesivo (porque las cosas reales nunca son tan fáciles), esto debería funcionar.

Solo puedo darle el concepto básico detrás de la solución de su problema. No puedo hacer la codificación por ti. Pero es más fácil implementar cosas cuando sabes cuál es tu objetivo.
Probablemente sea un poco más complicado, ya que solo algunos comandos/mensajes que lleguen a través del USB desde la PC deben enviarse uno a través del enlace serial al segundo microcontrolador, mientras que otros estarían destinados al consumo local en el AT90.
@Blup1980 Sí, entiendo su concepto, he intentado asignar directamente "SerIn[RxCnt]" a UDR1. pero no funciona. Por favor, ayúdame con esto. Estoy luchando más de dos semanas con este problema. Soy nuevo en la programación de microcontroladores. Esta es la primera vez que me enfrento a este tipo de situación.