-         

Ergebnis 1 bis 3 von 3

Thema: Serielle Verbindung (UART) von mehreren ATmega32

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2009
    Ort
    Frankfurt
    Beiträge
    21

    Serielle Verbindung (UART) von mehreren ATmega32

    Anzeige

    Hallo an alle,

    da mir das letzte Mal so genial schnell geholfen wurde, kommt Ihr mit diesem Problem bestimmt auch klar.

    Ich möchte einige mega32 miteinander seriell verbinden. Das Prinzip soll folgendes werden, es gibt einen Master und mehrere Slaves. Der Master soll von den Slaves empfangen, auswerten und an alle zurücksenden. Dazu habe ich mal wieder meine Schul-Techniker-Unterlagen rausgeräumt und siehe da ich hatte noch so einiges als Backup.
    Die Kommunikation eines mega32 (soll der Master werden) mit Hyperterminal hat auch sofort hingehauen. Auf meiner alten Laborplatine ist ja zum Glück ein MAX232 verbaut. Jetzt hab ich mir gedacht...alles klar ...Signale PD0 und PD1 verdreht an den Slave mega32 verbinden und die Sache rutscht...aber nichts geht.
    Wie kann das sein???
    Hab ich was vergessen???
    Denkfehler???

    Vielen Dank für eure Hilfe


    Ich schick mal zur Sicherheit die UART-Headerdatei mit. Diese ist vieleicht auch für Andere von Nutzen.
    Code:
    // UART.H													  09.02.05
    //
    // AVR-GCC		Version: 3.4.1
    // AVR-LIBC		Version: 1.0.4
    //
    // Header-Datei für die Serielle Schnittstelle des ATMEGA32
    //=============================================================================
    
    //-----------------------------------------------------------------------------
    // Definitionen von Ports, Datenrichtung und CPU-Takt (Bei Bedarf abändern)
    //-----------------------------------------------------------------------------
    
    #define	CPU_UART			11059200				// Taktfrequenz der CPU in Hz
    
    //-----------------------------------------------------------------------------
    // Funktionsprototypen
    //-----------------------------------------------------------------------------
    
    void com_init(unsigned short);				// Serielle Schnittstelle initialisieren
    void com_send(unsigned char);					// einzelnes Zeichen senden
    void com_send_string(unsigned char[]);		// Zeichenkette senden
    unsigned char com_empf(void);					// einzelnes Zeichen empfangen
    unsigned char com_empf_error(void);			// auf Empfangsfehler überprüfen
    
    //-----------------------------------------------------------------------------
    // Initialisieren der Seriellen Schnittstelle
    // Übergabeparameter: gewünschte Baudrate
    //-----------------------------------------------------------------------------
    
    void com_init(unsigned short baudrate)
    {
    	UCSRB = 0x18;											// Receiver Enable und Transmiter Enable Bit setzen
    
    	UBRRL = (CPU_UART / (baudrate * 16l) - 1);	// Baudrate einstellen
    	UBRRH = ((CPU_UART / (baudrate * 16l) - 1) >> 8);
    
    }
    
    //-----------------------------------------------------------------------------
    // Einzelnes Zeichen Senden
    //-----------------------------------------------------------------------------
    
    void com_send(unsigned char zeichen)
    {
    	while ((UCSRA & 0x20) == 0x00) {}		// Wenn Sendedatenregister leer...
    	UDR = zeichen;									// schiebe Zeichen in Senderegister
    
    }
    
    //-----------------------------------------------------------------------------
    // Zeichenkette Senden
    //-----------------------------------------------------------------------------
    
    void com_send_string(unsigned char *string)
    {
    	while ((UCSRA & 0x20) == 0x00) {}		// Wenn Sendedatenregister leer...
    	while (*string)								// und Sendetext vorhanden...
    	com_send (*string++);						// schiebe Zeichen in Senderegister
    
    }
    
    //-----------------------------------------------------------------------------
    // Einzelnes Zeichen Empfangen
    //-----------------------------------------------------------------------------
    
    unsigned char com_empf(void)
    {
    	unsigned char zeichen = 0x00;
    
    	if ((UCSRA & 0x80) == 0x80)				// Wenn Zeichen Empfangen wurde...
    	{
    		zeichen = UDR;								// Zeichen aus Empfangsdatenregister in Variable einlesen
    	}
    
    	return zeichen;
    
    }
    
    //-----------------------------------------------------------------------------
    // Auf Empfangsfehler überprüfen
    //-----------------------------------------------------------------------------
    
    unsigned char com_empf_error(void)
    {
    	unsigned char fehler = 0x00;
    
    	// Fehlerüberprüfung:
    
    	if ((UCSRA & 0x10) == 0x10) fehler = 0x01;	// Frame Error (falsches Stoppbit)
    	if ((UCSRA & 0x08) == 0x08) fehler = 0x01;	// Data OverRun (Empfangspuffer)
    	if ((UCSRA & 0x04) == 0x04) fehler = 0x01;	// Parity Error (Paritätsfehler)
    
    	return fehler;
    
    }
    
    //=============================================================================

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Da wär jetzt ein Schaltplan interessant, wie die Dinger genau verbunden sind.
    Rx vom einen an Tx vom andern AVR?

    Gleich noch als Info: UART ist nicht geeignet für mehr als 2 Teilnehmer.
    Mehrere Empfänger geht, aber Senden kann nur einer. Versucht das ein zweiter, gibts nen kurzen.
    #ifndef MfG
    #define MfG

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2009
    Ort
    Frankfurt
    Beiträge
    21
    Das Problem war der Pegel. Das nur einer sendet löse ich über ein zusätzliches Signal.
    Besten Dank!

Berechtigungen

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