So übertragen Sie mit UART Daten von einem Mikrocontroller auf einen anderen

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.

Antworten (2)

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 
   } 
}
Danke für deine Antwort, ja jetzt verstehe ich. Ich muss eine UART Rx-Routine und eine UART Tx-Routine für AT90USB1287 schreiben, um Daten an und von atmega32a zu empfangen und zu senden. Können Sie mir bei dieser Routine helfen?
Ich habe noch nie für genau diese Controller geschrieben, aber wenn Sie für einen AVR geschrieben haben, sollten Sie in der Lage sein, ganz einfach für einen anderen zu schreiben.
Hallo, ich habe Code für die UART-Funktionalität AT90USB1287 geschrieben. Das Problem ist, dass der Code, wie ich ihn ursprünglich gepostet habe, den Befehl vom PC zum AT90USB1287 über USB erhält. Jetzt möchte ich diesen Befehl über UART an ATmega32 senden. Bitte helfen Sie mir, wie ich das senden kann. Wenn Sie mehr Code benötigen, werde ich posten.
Sie müssen etwas über UART lesen. Es ist fast genau derselbe Code, ich kann nicht verstehen, warum dies Verwirrung stiften sollte, wenn Sie bereits eine UART-Routine verstanden und geschrieben haben. Ich habe keine Zeit, die Datenblätter zu lesen und die Routine für Sie zu schreiben. Ich beginne zu vermuten, dass Sie den Code nicht selbst geschrieben haben, wenn Sie nicht verstehen, wie das geht.
Bitte lesen und verstehen Sie UART, ich kann Ihr Problem nicht verstehen. Sie sagen, Sie wissen, wie man eine UART-Routine schreibt, aber in der Praxis machen Sie Dinge, die einfach keinen Sinn ergeben
Ich glaube du hast mein Problem nicht richtig verstanden. Ich habe richtig geschrieben und gearbeitet. Der erste Befehl kommt vom PC zum AT90USB, er befindet sich im read_buffer des AT90USB. Ich muss herausfinden, welches Element von read_buffer mein Befehl ist. Nehmen wir an, read_buffer[2] ist mein Befehl, dann weisen Sie read_buffer[2] UDR für die Übertragung an ATMega32A zu. Das ist also mein Problem Interlink zwischen USB zu UART. Wenn ich einen Befehl vom PC sende, kommt er zum USB-Puffer, aber ich kann diesen Puffer nicht Uart Tx zuweisen.

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.

Ich kann Ihnen nur das Grundkonzept hinter der Lösung Ihres Problems geben. Ich kann die Codierung nicht für Sie übernehmen. Aber es ist einfacher, Dinge umzusetzen, wenn Sie wissen, was Ihr Ziel ist.
Wahrscheinlich ist es etwas komplizierter, da nur einige Befehle/Nachrichten, die über USB vom PC ankommen, über die serielle Verbindung an den zweiten Mikrocontroller gesendet werden sollten, während andere für den lokalen Verbrauch im AT90 bestimmt sind.
@Blup1980 Ja, ich verstehe dein Konzept, ich habe versucht, "SerIn[RxCnt]" direkt UDR1 zuzuweisen. aber es funktioniert nicht. Bitte helfen Sie mir dabei. Ich kämpfe seit mehr als zwei Wochen mit diesem Problem. Ich bin neu in der Mikrocontroller-Programmierung. Dies ist das erste Mal, dass ich mit dieser Art von Situation konfrontiert bin.