- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Datenübertragung von pc zu zwei Motorsteuerungen über der Atmega644p

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2012
    Beiträge
    26

    Datenübertragung von pc zu zwei Motorsteuerungen über der Atmega644p

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Guten Tag,

    ich versuche gerade Zeile pro Zeile Positionskoordinaten (X,Y) einer Textdatei von PC zu zwei identischen Motorsteuerungen über ein Mikrocontroller zu senden. Die PositionKoordinaten(X,Y) der Textdatei sind in ASCii und werden in dieser Form zu den zwei Motorsteuerungen gesendet. Der Atmega 644p hat zwei USARTS(USART0 und USART1). USART0(RS232) dient zum Empfangen die Positionskoordinaten, die vom PC gesendet wurde. Dann wird über USART1(RS485) die empfangenen Positionskoordinaten zu den beiden Motorsteuerungen gesendet. Das Programm zum Senden der Positionskoordinaten von PC zum Atmega 644p wurde in c++ geschrieben und liegt ganz unten meinem Beitrag.
    Die Positionskoordinaten, die von PC zu den beiden Motorsteuerungen über der Mikrocontroller gesendet werden, sind in folgender Form: "DX,YF".
    D ---> Anfang des Befehls
    X ---> Position auf die x-Achse in ASCii
    ',' ---> Trennzeichnen dient zur Unterscheidung von X und Y- Position
    Y ---> Position auf die y-Achse in ASCii
    F ---> Ende des Befehls.

    Wenn ich die Positionskoordinaten(X,Y) der Textdatei Zeile pro Zeile zum Atmega644p sende, läuft alles wunderbar.
    Aber wenn ich auf einmal alle Positionskoordinaten der Textdatei zum Atmega644p sende, wird nur ein, zwei oder drei Positionskoordinaten ausgeführt. Aber die Andere Positionskoordinaten(X,Y) werden nicht ausgeführt. Ich denke, etwas läuft bei meinem Atmega644p-Programm schief, vielleicht mein Empfangsinterrupt ISR(USART0_RX_vect). Ich komme einfach nicht klar. Mein Atmega644p-Programm liegt im Anhang.

    Ich wäre sehr dankbar, wenn jemand mir hilft.

    Danke im Voraus.

    c++ Programm (PC Programm):
    Code:
    #include <fstream>
    #include <string>
    #include <iostream>
    #include <sstream>
    
    #include <Windows.h>
    
    using namespace std;
    
    // Senden eines Befehls Charakter pro Charakter und man test das Empfangen eines  ACK
    static bool SendungBefehl(HANDLE h, const char *s)
    {
    	DWORD	dummy;
    	char	c;
    
    	// Wenn es seit dem letzten Befehl Antorten  zu lesen gab,
    	// Zu spät, alles muss gelöscht werden.
    	PurgeComm(h, PURGE_RXCLEAR);
    	for (int i = 0; s[i] != 0; ++i)
    	     if (!WriteFile(h, s + i, 1, &dummy, 0))
    		      cout << "Error de WriteFile" << endl;
                          return false;
    	     if (!ReadFile(h, &c, 1, &dummy, 0))
                    cout << "Erreur de ReadFile (time-out)" << endl;
    		return false;	// Time-out
    
            cout << "Réponse : " << (int)c << endl;
    	return c == '\x06';	// ACK
    }
    
    int main(void)
    {
    	ifstream file("koordinaten.txt", ios::in | ios::binary);
    	string line;
    
    	if (!file)
    	{
    		cout << "Error: Die Öffnung der Textdatein in Lesen-Modus ist unmöglich" << endl;
    		return 1;
    	}
    	// Öffnung des seriellen Ports COM1
    	HANDLE h = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    	if (h == INVALID_HANDLE_VALUE)
    	{
    		cout << "Error: Öffnung der seriellen Port ist unmöglich" << endl;
    		return 1;
    	}
    	DCB dcb = { 0 };
    	BOOL dcbOk = GetCommState(h, &dcb);
    	dcb.BaudRate = CBR_115200;
    	dcb.ByteSize = 8;
    	dcb.Parity = NOPARITY;
    	dcb.StopBits = TWOSTOPBITS;
    	dcbOk = SetCommState(h, &dcb);
    	COMMTIMEOUTS timeouts = { 0 };
    	timeouts.ReadIntervalTimeout = 100;
    	timeouts.ReadTotalTimeoutMultiplier = 100;
    	timeouts.ReadTotalTimeoutConstant = 100;
    	timeouts.WriteTotalTimeoutMultiplier = 100;
    	timeouts.WriteTotalTimeoutConstant = 100;
    	if (!SetCommTimeouts(h, &timeouts))
    	{
    		cout << "Erreur: SetCommTimeouts" << endl;
    		return 1;
    	}
    	// Lesen Zeile pro Zeile
    	while (getline(file, line))
    	{
    		int x;					// x, y von der Textdatei
    		int y;
    		int x_steps;			// x, y in Schrittmotor
    		int y_steps;
    		stringstream input;		// Eingangsfluß (Eine Zeile der Textdatei)
    		stringstream output;	// Ausgangsfluß (Ein Koordinatenpaar)
    
    		// Eine Zeile wird ein Eingangsfluß sein
    		input.str(line);
    		// Extraktion von X et du Y.
    		if (input.get() != 'X')
    			continue;
    		input >> x;
    		if (input.get() != 'Y')
    			continue;
    		input >> y;
    		// Konvertierung von Positionkoordinaten(X,Y) in Schrittmotor
    		
    		x_steps = x * 127 / 500;
    		y_steps = y * 127 / 500;
    		// Sendung der PositionsKoordinaten Zeile pro Zeile über der serielle Port (COM1)
    		output << 'D';
    		output << x_steps;
    		output << ',';
    		output << y_steps;
    		output << 'F';
    		cout << "Sendung von : " << output.str() << endl;
    		if (SendungBefehl(h, output.str().c_str()))
    			cout << "OK" << endl;
    		else
    			cout << "ERROR" << endl;
    	}
    	CloseHandle(h);
    	return 0;
    }
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich habe mir dein Programm nicht durchgeschaut, nach deiner Beschreibung gibt es zwei Möglichkeiten.
    Du hast einen Buffer-Überlauf oder eher das die 8MHz Takt nicht zu deinen 115200 Baud passen, das sind laut Tabelle 8,5% Fehler.
    7,3728MHz oder 11,0592 wären da die bessere Wahl.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2012
    Beiträge
    26
    Hallo Hubert.G

    Danke schön für deine Rückmeldung.
    ich habe gerade die Übertragungsrate und Fosc geändert. Jetzt habe ich laut der Tabelle des Datenblatts als Takt 7,3728MHz und 9600baud als baudrate ausgewählt. Das sind laut Tabelle des Datenblatts 0,0% Fehler. Trotzdem läuft mein Programm nicht.

    Wie du vorher vermutet hast, habe ich wahrscheinlich ein Pufferüberlauf !! Kannst du mir helfen den Pufferüberlauf zu lösen ?

    Danke im Voraus.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich nehme an du hast auch den Quarz getauscht.
    #define usart_buffer_max_size 256u
    Schreib das 256 anstelle des 64 hinein.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2012
    Beiträge
    26
    Ich habe den Quarz getauscht und habe im Programm 256 anstelle 64hinein geschrieben.
    Aber das Programm läuft immer nicht gut.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ist es besser geworden oder gleich geblieben. Sonst probiere mal 512, mehr wird dann schon kritisch wenn das Programm sonst noch was machen soll.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2012
    Beiträge
    26
    Das Problem ist gleich geblieben und nicht besser geworden. Ich probiere mit 512 und melde mich später.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich habe mir das Programm mal kurz angeschaut, da ist kein RX-Buffer vorhanden. Da musst du dein Programm anpassen oder die Geschwindigkeit noch mal verringern, wobei anpassen das bessere wäre.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.683
    ... Übertragungsrate und Fosc geändert ... als Takt 7,3728MHz ... ausgewählt ...
    Ich weiß nicht, ob ich Dich richtig verstehe - dann wärest Du reichlich falsch. Denn in Deinem code steht

    ... #define FOSC 8000000 // Clock Speed ...
    Die Taktangabe ist kein irgendwie wählbarer Wert, wählbar ist nur der Quarz mit der entsprechenden Taktrate - und GENAU DER Wert, der auf dem Quarz steht, wird (bis auf hier nicht zu beachtende Ausnahmen) in den Code geschrieben. Andernfalls gibts Fehler, weil der Compiler damit Setzwerte für die Datenübertragung ausrechnet, die für Deine Hardwareausrüstung garnicht zutreffen.

    Fazit: was am Quarz steht muss im Code auch reingeschrieben werden - sprich: der auf dem Quarz angegebene Taktwert muss in der Quelle genau wieder zu finden sein. Der Quarz ist aber wählbar . . .

    Zitat Zitat von jiodatsinga Beitrag anzeigen
    Ich habe den Quarz getauscht und ... Programm läuft immer nicht gut.
    Was steht den AKTUELL auf Deinem Quarz der in der Platine steckt und was hast Du als FOSC im Quelltext genannt?
    Ciao sagt der JoeamBerg

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2012
    Beiträge
    26
    Ich bedanke mich bei oberallgeier und Hubert.G für die Feedback

    Auf meinem Quarz, der in der Platine gesteckt wurde, steht Momentan 7,3728MHz und ich habe auch schon 7,3728MHz als Fosc im Quelltext geschrieben.

    Jetzt versuche ich gerade mein Programm anzupassen und werde auch die baudrate vom PC, Motorsteuerungen und der Mikrocontroller reduzieren.

    Soll Unbedingt der PC, Mikrocontroller und Motorsteuerungen das gleiche Baudrate haben? In der Grundeinstellung haben die Motorsteuerungen den Wert 115200 als Baudrate. Darum habe ich auch für den Mikrocontroller und PC 115200 als Baudrate ausgewählt. Soll Unbedingt der PC, Mikrocontroller und Motorsteuerungen das gleiche Baudrate haben? Ich werde den Wert 9600 als Baudrate für den PC, MiKrocontroller und Motorsteuerungen auswählen. Ich melde mich nachher.

    Danke nochmal

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Datenübertragung über Funk
    Von bmtil im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 0
    Letzter Beitrag: 19.09.2012, 13:35
  2. Datenübertragung von RP5 zum PC über IR
    Von Bigboy im Forum Robby CCRP5
    Antworten: 42
    Letzter Beitrag: 29.06.2008, 21:07
  3. Antworten: 21
    Letzter Beitrag: 12.02.2007, 14:41
  4. Datenübertragung über RXD und TXD
    Von Heideltrudel im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 25.05.2006, 12:38
  5. Datenübertragung über 27 MhZ
    Von Xtreme im Forum Elektronik
    Antworten: 25
    Letzter Beitrag: 22.08.2005, 10:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests