Mein Konzept ist, dass ich zwei entworfene Boards habe, eines mit AT90USB1287, das andere mit ATmega32A, beide funktionieren ordnungsgemäß.
AT90USB1287 kommuniziert über USB mit dem PC. ATmega32A spricht mit dem PC über USART (RS232).
Jetzt habe ich die ATmega32A-Karte mit AT90USB1287 über UART-Kommunikation verbunden (RS232-Kabel durch Deaktivierung der Verbindung zum PC), da beide Karten mit einem PC zusammenarbeiten müssen. Der einfachste Weg ist eine UART-Verbindung zwischen diesen beiden.
Wenn ich Daten vom ATmega32A an den PC senden möchte, muss ich Daten vom ATmega32A an ATusb901287 abrufen und über USB an den PC senden.
Ich bin verwirrt, wie man Daten von ATmega32A zu AT90USB1287 bekommt. Ich habe Verbindungen gegeben wie 1. verbundener RxD-Pin, dh PD0, dh Pin 14 von ATMega32 mit TxD-Pin, dh PD3, dh Pin 28 von AT90USB1287 2. verbundener TxD-Pin, dh PD1, dh Pin 15 von ATMega32, mit RxD-Pin, dh, PD2 dh Pin 27 von AT90USB1287 3. USB-Pins von AT90USB1287 sind mit PC USB verbunden.
Aktualisiert
Ich habe die UART-Funktionalität für beide Controller implementiert.
Das Problem ist, dass ich den Befehl, den ich vom PC erhalten habe, nicht über USB an AT90USB1287 senden kann. Der Befehl befindet sich im USB-Empfangspuffer. Ich muss den Befehl mit UART von AT90usb1287 an einen anderen Mikrocontroller senden.
Aktualisiert2:
Ich habe ein weiteres Problem mit dieser Kommunikation zwischen zwei Mikrocontrollern, die USART verwenden. Ich habe den Schnittstellencode für beide Controller so.
Ich habe das erste Board mit dem Mikrocontroller AT90USB1287, der über USB mit dem PC verbunden ist. Ich habe mehrere Befehle wie diese "CMD", "TEMP" ... Wenn ich einen Befehl sende, gibt er die Antwort. Was perfekt funktioniert. Ich muss ein anderes Board, das einen ATmega32A-Mikrocontroller enthält, mit USART an dieses Board anschließen. Ich habe eine Verbindung hergestellt und die USART-Kommunikation in beiden Platinen implementiert, selbst die zweite Platine hat ein ähnliches Befehlsformat, und ich muss einen Befehl senden, um auch eine Antwort zu erhalten.
Um den Befehl vom PC an die zweite Platine zu senden, muss ich den Befehl zuerst über USB-Kommunikation an die AT90USB1287-Platine und von dort über USART an ATmega32A senden. Ich habe das getan und ich kann auch eine Antwort vom zweiten Board erhalten, aber ich habe ein Problem. Was mit meinem Code passiert, ist, dass jeder Befehl, den ich vom PC sende, an die zweite Platine gesendet wird. Ich muss mich ändern, da nur Befehle, die auf der zweiten Platine vorhanden sind, an die zweite Platine gesendet werden müssen.
Kann mir jemand vorschlagen, wie ich das Senden aller Befehle stoppen und nur die 5 Befehle senden kann, die sich auf das zweite Board beziehen? Bitte helfen Sie mir dabei.
Ich verstehe deine Verwirrung nicht. Sie möchten zwischen den beiden Controllern mit UART kommunizieren, dann benötigen beide natürlich UART-Fähigkeiten und Code dafür. Ihr Computer verfügt über Treiber und Software, um damit umzugehen, daher benötigt Ihr Mikrocontroller auch einen Treiber dafür.
Ihr ATmega32 benötigt UART TX-Funktionalität, während AT90USB1287 UART RX-Funktionalität benötigt. Nachdem Sie bereits TX und RX für Ihren ATmega32 geschrieben haben, sollte das Schreiben der UART RX-Routine für AT90 ein Kinderspiel sein. Sie könnten eine Art Bitwert hinzufügen, der identifiziert, dass der UART RX auf AT90 von Ihrem ATmega32 kommt, und ihn direkt an USB weiterleiten.
BEARBEITEN: Code von AVRFreaks , der für at90usb1287 geschrieben wurde
#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
}
}
Sie sollten den Inhalt des USB-Eingangspuffers lesen (z. B. im USB-RX-Interrupt) und seinen Inhalt in den UART-TX-Puffer kopieren. Und das ist es.
Sie haben bereits den gesamten Code zum Einrichten der UART-Ports. Sie müssen nur die Daten von einem RX-Puffer an den anderen TX-Puffer weitergeben.
Mit etwas Glue-Code in der Nähe (weil echte Dinge nie so einfach sind) sollte dies funktionieren.
verendra
chwi
verendra
chwi
chwi
verendra