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

0

Mi concepto es que tengo dos tableros diseñados, uno con AT90USB1287 y otro con ATmega32A, ambos funcionan correctamente.

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

Ahora he conectado la placa ATmega32A a AT90USB1287 mediante la comunicación UART (cable RS232 al deshabilitar la conexión a la PC) porque ambas placas tienen que trabajar 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 PC significa que tengo que obtener datos de ATmega32A a ATusb901287 y enviarlos a PC a través de USB.

Estoy confundiendo cómo obtener datos de ATmega32A a AT90USB1287. He dado conexiones como 1. conectó el pin RxD, es decir, PD0, es decir, el pin 14 de ATMega32 al pin TxD, es decir, PD3, es decir, el pin 28 de AT90USB1287 2. conectó el pin TxD, es decir, PD1, es decir, el pin 15 de ATMega32 a RxD, es decir, PD2 es decir, el pin 27 de AT90USB1287 3. Las clavijas USB de AT90USB1287 están conectadas al PC USB.

  

Actualizado

He implementado la funcionalidad UART para ambos controladores.

El problema es que no puedo enviar el comando que recibí de la PC al 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 mediante UART de AT90usb1287.

  

Actualizado2:

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

Tengo la primera placa con el 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 utilizando USART. Me conecté e implementé la comunicación USART en ambas placas, incluso la segunda placa también tiene el mismo tipo de formato de comando y también necesito enviar un comando para obtener respuesta.
Para enviar el comando desde la PC a la segunda placa, primero tengo que enviar el comando a la placa AT90USB1287 mediante comunicación USB y de ahí a ATmega32A mediante USART. Lo he hecho y también puedo obtener respuesta de la segunda placa, pero tengo un problema. Lo que sucede con mi código es cualquier comando que envíe desde la PC que está enviando a la segunda placa, necesito cambiar, ya que solo los comandos que existen en la segunda placa deben enviarse a la segunda placa.

¿Alguien puede sugerirme que deje de enviar todos los comandos y envíe solo los 5 comandos relacionados con la segunda placa? Por favor, ayúdame con esto.

    
pregunta verendra

2 respuestas

1

No entiendo tu confusión. Desea comunicarse entre los dos controladores con UART, luego, por supuesto, ambos necesitan capacidades UART y código para esto. Su computadora tiene controladores y software para lidiar con 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. Después de haber escrito tanto TX como RX para su ATmega32, escribir la rutina UART RX para AT90 debería ser un problema. Podría 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 eso es 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 
   } 
}
    
respondido por el chwi
0

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

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

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

    
respondido por el Blup1980

Lea otras preguntas en las etiquetas