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.
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
}
}
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.
Verendra
chwi
Verendra
chwi
chwi
Verendra