PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Verbindung (UART) von mehreren ATmega32



baumagnat
07.01.2010, 19:03
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.


// 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;

}

//================================================== ===========================

Jaecko
10.01.2010, 17:48
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.

baumagnat
11.01.2010, 05:12
Das Problem war der Pegel. Das nur einer sendet löse ich über ein zusätzliches Signal.
Besten Dank!