loetstelle.net
Lötstelle Userforum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Datenübertragung von pc zu zwei Motorsteuerungen über MUC

 
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Mikrocontroller
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
truth



Anmeldungsdatum: 12.10.2012
Beiträge: 5

BeitragVerfasst am: Mo 12.Nov 2012 13:22:14    Titel: Datenübertragung von pc zu zwei Motorsteuerungen über MUC Bauteile finden Antworten mit Zitat

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.
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. Dh, die Motorsteuerungen bekommen nicht alle Befehle vom Atmega644p. 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 unten meinem Beitrag.
Bemerkung: Die Antworten von Motorsteuerungen auf Befehle wurden deaktiviert, so dass die keine Rückmeldungen an der Atmega644p senden muss.

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

Danke im Voraus.

Das C-Programm lautet:

Code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
//#define F_CPU 3686400UL
#include <util/delay.h>


#define FOSC 8000000 // Clock Speed
#define BAUD 115200UL

#define UBRR_VAL ((FOSC+BAUD*8)/(BAUD*16)-1)   // clever runden
///////////////////////////////////////////////////////////////////
#define usart_buffer_max_size 64u
#define usart_command_max_size 10

char usart_command[usart_command_max_size + 1] = {0};
char usart0_tx_buffer[usart_buffer_max_size];
char usart1_tx_buffer[usart_buffer_max_size];
volatile uint8_t usart_command_size = 0;
volatile uint8_t usart0_tx_buffer_size = 0;
volatile uint8_t usart0_tx_buffer_start = 0;
volatile uint8_t usart1_tx_buffer_size = 0;
volatile uint8_t usart1_tx_buffer_start = 0;
/////////////////////////////////////////////////////////////////////
volatile uint8_t command_ready = 0;

/////////////////////////////////////////////////////////////////////
// Configuration USART0, USART1 and setting Baudrate

void USART_Init(unsigned int ubrr)
{
  UBRR0H = (unsigned char)(ubrr>>8);
  UBRR0L = (unsigned char) ubrr;
  UBRR1H = (unsigned char)(ubrr>>8);
  UBRR1L = (unsigned char) ubrr;
  UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0);
  UCSR0C = (1<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00);
  UCSR1B = (1<<RXEN1) | (1<<TXEN1) | (0<<RXCIE1) | (0<<TXCIE1) | (0<<UDRIE1);
  UCSR1C = (1<<USBS1) | (1<<UCSZ11) | (1<<UCSZ10);
}

////////////////////////////////////////////////////////////////////////////////

// function receive USART0

unsigned char USART0_Receive (void)
{
    while(!(UCSR0A & (1<<RXC0)) ); // Wait for data to be received
   
     return UDR0; // Get and return received data from buffer
}


// function transmit USART0

void USART0_Transmit (unsigned char data0)
{
  while ( !(UCSR0A & (1<<UDRE0)) ); // Wait for empty transmit buffer 
 
   UDR0 = data0; // Put data into buffer, sends the data
}

// function receive USART1

unsigned char USART1_Receive (void)
{
  while(!(UCSR1A & (1<<RXC1)) );  // Wait for data to be received
   
   return UDR1; // Get and return received data from buffer
}

// function transmit USART1 

void USART1_Transmit (unsigned char data1)
{
  while ( !(UCSR1A & (1<<UDRE1)) ); // Wait for empty transmit buffer 
   
   UDR1 = data1; // Put data into buffer, sends the data 
}

/////////////////////////////////////////////////////////////////////

// Eingang vom Ringpuffer
void USART0_QueueIn(char c)
{
  int i;

  if (usart0_tx_buffer_size < usart_buffer_max_size)
  {
    i = (usart0_tx_buffer_size + usart0_tx_buffer_start) % usart_buffer_max_size;
    usart0_tx_buffer[i] = c;
    ++usart0_tx_buffer_size;
  }
}

// Ausgang vom Ringpuffer
char USART0_QueueOut(void)
{
  char c;

  if (usart0_tx_buffer_size == 0)
    return 0;
  c = usart0_tx_buffer[usart0_tx_buffer_start];
  --usart0_tx_buffer_size;
  usart0_tx_buffer_start = (usart0_tx_buffer_start + 1) % usart_buffer_max_size;
  return c;
}

// Eingang vom Ringpuffer
void USART1_QueueIn(char c)
{
  int i;

  if (usart1_tx_buffer_size < usart_buffer_max_size)
  {
    i = (usart1_tx_buffer_size + usart1_tx_buffer_start) % usart_buffer_max_size;
    usart1_tx_buffer[i] = c;
    ++usart1_tx_buffer_size;
  }
}

// Ausgang vom Ringpuffer
char USART1_QueueOut(void)
{
  char c;

  if (usart1_tx_buffer_size == 0)
    return 0;
  c = usart1_tx_buffer[usart1_tx_buffer_start];
  --usart1_tx_buffer_size;
  usart1_tx_buffer_start = (usart1_tx_buffer_start + 1) % usart_buffer_max_size;
  return c;
}

// Sendung einer Antwort über der Ringpuffer zum USART0
static void USART0_Send(const char *s)
{
  int i;
 
  for (i = 0; s[i] != 0; ++i)
    USART0_QueueIn(s[i]);
  if (usart0_tx_buffer_size > 0)
    UCSR0B |= 1 << UDRIE0;
}

// Sendung eines Befehls über der Ringpuffer zum USART1
static void USART1_Send(const char *s)
{
  int i;
 
  for (i = 0; s[i] != 0; ++i)
    USART1_QueueIn(s[i]);
  if (usart1_tx_buffer_size > 0)
    UCSR1B |= 1 << UDRIE1;
}


// Verarbeitung eines Befehls
static void ProcessCommand(void)
{
  int i;
  int x;
  int y;
  char x_moteur[12];
  char y_moteur[12];

 
  for (i = 0; i < usart_command_size; ++i)
    if (usart_command[i] == ',')
      break;

  if (i <= 0 || i >= usart_command_size - 1)
  {
    // Man hat kein Kommazeichen in Mitte des Strings gefunden -> Fehler
    USART0_Send("\x15");  // NAK, Sendung hat nicht geklappt.
    usart_command_size = 0;
    return;
  }
  // Ich wandle x und y in Integer um, um Berechnung durchzuführen, wenn es nötig ist
  // Extraktion von X und Y   
    usart_command[i] = 0;
    usart_command[usart_command_size] = 0;
    x = atoi(usart_command);
    y = atoi(usart_command + i + 1);
    usart_command_size = 0;
    itoa(x, x_moteur, 10);
    itoa(y, y_moteur, 10);

        // Sendung position x_moteur
   USART1_Send("#1s");
   USART1_Send(x_moteur);
   USART1_Send("\r");
   USART1_Send("#1A\r"); // Losfahren der Platine auf die x-Achse
 
   _delay_ms(5000); // Warten 5000ms --> 5s

       // Sendung position y_moteur
   USART1_Send("#2s");
   USART1_Send(y_moteur);
   USART1_Send("\r");
   USART1_Send("#2A\r"); // Losfahren der Platine auf die y-Achse
   
   _delay_ms(5000); // Warten 5000ms --> 5s

   USART0_Send("\x06"); // ACK --> Freigage: PC kann nächste Data senden.
 
  }

// Interruptsfunktion für das Empfangen von Byte
// Diese Funktion ist High, wenn RXCIE0 = 1 
ISR(USART0_RX_vect)
{
  char data;
  data = UDR0;

 // Verarbeitung des Befehls -->("D X,Y F")
    // X = x_moteur und Y = y_moteur
  if (data == 'F')
  {   
    command_ready = 1;     
   }

  else if (data == 'D')
  {
    // Erzeugung eines neuen Befehls
    usart_command_size = 0;
  }

  else
  {
    // Als man weder F, noch D empfängt, speichert man
    //die Koordinatenposition(X,Y) in einem Befehl
    if (usart_command_size < usart_command_max_size)
    {
      usart_command[usart_command_size] = data;
      ++usart_command_size;
    }
  }
}



// Interruptsfunktion für Byte-Übertragung
// Diese Funktion ist an, wenn UDRIE1 = 1
ISR(USART0_UDRE_vect)
{
  UDR0 = USART0_QueueOut();
  // Sendung stoppen, wenn es keine Daten mehr gibt zu senden
  if (usart0_tx_buffer_size == 0)
    UCSR0B &= ~(1 << UDRIE0);
}

// Interruptsfunktion für Byte-Übertragung
// Diese Funktion ist an, wenn UDRIE1 = 1
ISR(USART1_UDRE_vect)
{
  UDR1 = USART1_QueueOut();
  // Sendung stoppen, wenn es keine Daten mehr gibt zu senden
  if (usart1_tx_buffer_size == 0)
    UCSR1B &= ~(1 << UDRIE1);
}

void VorEinstellungMotor(void)
 {
   USART1_Send("#1|0\r"); // Deaktivierung von Antwort der Motorsteuerung Nr 1
   USART1_Send("#2|0\r"); // Deaktivierung von Antwort der Motorsteuerung Nr 2
   USART1_Send("#1D0\r"); // Festlegen der Position der Platine als Ursprung auf die x-Achse
   USART1_Send("#2D0\r"); // Festlegen der Position der Platine als Ursprung auf die y-Achse
   USART1_Send("#1p2\r"); // Modus: Absolut Positionierung --> p=2
   USART1_Send("#2p2\r"); // Modus: Absolut Positionierung --> p=2
           
 }
 

int main (void)
{
  USART_Init(UBRR_VAL); // Initialisierung von USART0 and USART1
  VorEinstellungMotor(); // Initialisierung Motorsteuerung
  sei(); // Aktierung Interruptsfunktion
 
 
  while (1) // Endlosschleife
  {
   if(command_ready)
    {
      ProcessCommand();
      command_ready = 0;
     
    }   
  }
 
}

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: Mo 12.Nov 2012 13:55:20    Titel: Bauteile finden Antworten mit Zitat

moin

Doppelpost ?

mal ganz allgemein Wink

Buffer zu klein
Übertragungsrate zu hoch
kein Handshake (RTS/CTS)

was machst du wenn mit 115kbaud dein Puffer von 64Byte überläuft ?

mfg

_________________
Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
truth



Anmeldungsdatum: 12.10.2012
Beiträge: 5

BeitragVerfasst am: Di 13.Nov 2012 14:31:04    Titel: Bauteile finden Antworten mit Zitat

Moin,

Zitat:
Übertragung zu hoch

Ich habe das Baudrate von PC und Mikrocontroller geändert.
Jetzt verwende ich den Wert 9600 als Baudrate

Code:
#define BAUD 9600UL


Zitat:
Buffer ist klein !!


Ich habe mein Buffer vergrößert.
Die Aktuelle Größe lautet:
Code:

#define usart_buffer_max_size 512u
#define usart_command_max_size 20


Zitat:
Was machst du beim Bufferüberlauf


Bei BufferÜberlauf setze ich der Index auf Null.
Code:

// Eingang vom Ringpuffer
void USART0_QueueIn(char c)
{
  int i;

  if (usart0_tx_buffer_size < usart_buffer_max_size)
  {
    i = (usart0_tx_buffer_size + usart0_tx_buffer_start) % usart_buffer_max_size;
    usart0_tx_buffer[i] = c;
    ++usart0_tx_buffer_size;
  }
  else
  {
    usart0_tx_buffer_size = 0;
  }
}

// Ausgang vom Ringpuffer
char USART0_QueueOut(void)
{
  char c;

  if (usart0_tx_buffer_size == 0)
    return 0;
  c = usart0_tx_buffer[usart0_tx_buffer_start];
  --usart0_tx_buffer_size;
  usart0_tx_buffer_start = (usart0_tx_buffer_start + 1) % usart_buffer_max_size;
  return c;
}




Zitat:
Kein Handschake (RTS/CTS)

Wie kann ich das in meinem PC-Code einsetzen ??

Danke im Voraus.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: Di 13.Nov 2012 20:21:23    Titel: Bauteile finden Antworten mit Zitat

moin
http://de.wikipedia.org/wiki/Datenflusssteuerung
zur Datenflusssteuerung allgemein.
ansonsten reicht es vielleicht die sendeseite anzuhalten wenn der empfangspuffer halb voll ist,ob das nun hardwaremaessig oder in software(steuerzeichen) erfolgt.
mfg
(sorry fuers kleinschreiben ,bin unterwegs)

_________________
Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
truth



Anmeldungsdatum: 12.10.2012
Beiträge: 5

BeitragVerfasst am: Di 13.Nov 2012 20:25:53    Titel: Bauteile finden Antworten mit Zitat

Danke schön für den Link.

Ich gucke nach.

MFG.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Anzeige






Verfasst am: Heute 04:31:43    Titel: Bauteile finden

Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Mikrocontroller Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen


Powered by phpBB 2.x © 2001, 2002 phpBB Group

Sie sind Besucher Nr. 1201437
©opyright by Markus Vohburger 2005 All Rights reserved