Forum: Mikrocontroller und Digitale Elektronik Problem mit Max323


von Klaus (Gast)


Lesenswert?

Hallo,

ich hoffe, daß mir hier jemand weiterhelfen kann.

ich habe auf einer seperaten Platine (Lochraster) einen Pegelwandler mit 
einem Max3232 aufgebaut mit fünf 100nF Kondensatoren (keine Elkos, einer 
ist ein Stützkondensator).

Als Zuleitung zum PC habe ich ein ca. 1.20m langes Flachbandkabel 
genommen, daß per Klemm-Schneide Technik auf der einen Seite einen 9 
Pol. Stecker (female) hat, auf der anderen Seite so ne 2x5 polige 
Buchse, die ich auf eine Stiftleiste draufstecken kann.

Zur Mikrocontroller-Platine verbinde ich den Pegelwandler über ein ca. 
15cm langes Flachbandkabel.

Der Mikrocontroller (Mega128L) wird mit 7.3728MHz getaktet.

1. Das erste Problem tritt auf, wenn ich nur den Pegelwandler über das 
1.20m Kabel mit dem PC verbinde und ihn an 3.5V hänge. Wenn ich ein 
Terminalprogramm starte und mit einer Hand den Pegelwandler "streichel", 
dann empfängt er hunderte von 0x00 ...
Ist der Aufbau so kritisch? Muß ich da was spezielle beachten?
Der Pegelwandler ist auf der Lochrasterplatine mit Kupferlackdraht 
"gefädelt". Könnte das daran liegen?

2. Wenn ich den Pegelwandler mit dem 15cm Kabel mit dem Mikrocontroller 
verbinde und was sende, dann empfange ich ebenfalls nur 0x00. Baudrate 
habe ich auf 2400 eingestellt und kein Handshake. Steckerbelegungen 
stimmen 100%. Das habe ich mindestens 100 mal nachgeprüft.

Ich habe die ganze Nacht experimentiert und bin jetzt mit meinem latein 
am Ende. Bin für jeden Tip dankbar.

Hier der Source, den ich zum senden verwende:

typedef unsigned char BYTE;
#define UART1_BAUDRATE 2400
#define UART1_UBR (AVR_CLK/(16*UART1_BAUDRATE)-1)

int main(int argc, char* argv[])
{
  usart1_init();
  while(1){
    usart1_sendByte('K');
  }
  }
  return 0;
}

void usart1_init(){

  //Baud Rate setzen
  UBRR1H = (BYTE)(UART1_UBR>>8);
  UBRR1L = (BYTE)(UART1_UBR);

  //Frame Format setzen
  //1 StartBit, 8 DatenBits, keine Parität 1 StopBit
  UCSR1C = (3<<UCSZ10);

  //Receiver und Transmitter einschalten
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);

}

void usart1_sendByte(BYTE data){
  //Warte bis Transmit Buffer leer ist
  while ( !( UCSR1A & (1<<UDRE1) ) );

  //Data in den Buffer schreiben (startet die Übertragung)
  UDR1 = data;
}

Gruß,
 Klaus

von Klaus (Gast)


Lesenswert?

Ups, das sollte MAX3232CPE heissen.
Ist schon spät :-)

Gute Nacht,

Klaus

von Klaus (Gast)


Lesenswert?

Sorry, noch ein kleiner Nachtrag:

ich habe mein programm so modifiziert, daß er erstmal 4 LEDs der Reihe 
nach eingeschaltet werden, bevor er in die Endlosschleife übergeht, um 
zu senden.

Solange noch nichts gesendet wird steht das Terminalprogram still, 
sobald gesendet wird erhalte ich nur 0x00.
Das heisst irgendwas funktioniert, aber was anderes wiederum nicht :-)

Achso...Ich benutze nicht wirklich ein Terminalprogramm, sonder ein 
tool, daß sich "UART Monitor nennt". Aber das ist ja egal...

Wenn ich das 1.20 Kabel mit ein paar Drähten zu einem zu einem 
"Loopback"-Kabel mache, dann sehe ich das was ich sende sofort. Das 
heisst. Kabel ist i.O. und ich weiss wo Pin 2+3 liegen :-)

Masse ist auch vorhanden.

Gruß,
 Klaus

von Peter D. (peda)


Lesenswert?

Die RS-232-Pegel sind gegen Streicheln immun.

Die MAX232-Anschlüsse zum 128-er dürften aber CMOS-Characteristik haben.

D.h. wenn Dein 128 im Reset ist bzw. der TXD Pin nicht als Output 
arbeitet, dann kannst Du mit Sicherheit Pulse in diese hochohmige 
Leitung reinstreicheln.

Häng doch mal ne Pull-Up z.B. 1kOhm mit ran, dann sollte das behoben 
sein.


Peter

von Klaus (Gast)


Lesenswert?

Hallo Peter,

erstmal danke für deine Antwort.
Die Sache ist aber so, daß ich dieses Streichel-Problem habe, obwohl der 
MAX3232 nicht mit dem 128´er verbunden ist. Das heisst der Max ist nur 
mit dem PC verbunden.

Ich habe heute nacht auch erst das Forum hier durchsucht, bevor ich 
meine Frage gepostet habe, aber anscheinend bin ich der einzige mit 
einem derartigen Problem.

Ich werde das mit dem Pullup trotzdem mal probieren.

Gruß,
 Klaus

von Wolfram (Gast)


Lesenswert?

Hallo Klaus
Wenn die Eingänge des MAX3232 nicht verbunden sind also freiliegen sind 
sie auf unbestimmten Potential(irgendwo zwischen 0 und 5V)wenn du 
streichelst verändertst du das Potential und wenn da LOW oder HIGH 
erkannt wird geht das auch entsprechend raus.Sobald die Leitung auf LOW 
geht wird das als Startbit angesehen.Das du lauter nullen bekommst liegt 
wahrscheinlich an deinem Terminalproggi das die die Framingerrors nicht 
anzeigt.Ein Pullup löst das Problem.
Sobald der Mikrocontroller aus dem Reset ist ist das Problem auch gelöst 
es sei denn die PIN's sind Hochohmig geschaltet.

CU Wolfram



CU Wolfram

von Klaus (Gast)


Lesenswert?

Hallo,

vielen Dank für die Tips bezüglich des "Streichelns" ;-)

Den anderen Fehler habe ich mittlerweile auch gefunden.
Mein Terminalprogramm empfängt jetzt alles was ich sende und keine 0x00 
weit und breit :-)

Der Fehler lag daran, daß ich vergessen habe die usart1_sendByte() 
Prozedur als Prototyp zu deklarieren. avr-gcc hat mir das aber 
komischerweise nicht als Fehler angezeigt, sondern nur als warning. 
Nachdem ich den Prototyp deklariert habe, lief es auf Anhieb.

Das war ne schwere Geburt, aber die Hauptsache ist, daß es jetzt läuft.

Vielen Dank nochmal für euere Antworten.

Schönen Tag noch,

Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.