Forum: Mikrocontroller und Digitale Elektronik RS232 macht mich kirre


von Matthias V. (dermatze)


Lesenswert?

Hallo zusammen!
Ich habe gerade ein kleines Problem mit der Kommunikation PC-µC.

Ich verwende einen atmega8 & max232 und möchte Daten zum PC senden 
(funktioniert) und welche empfangen (klappt nicht...).
Ich verwende Bascom.

Zum Aufbau:
atmega8 mit 8.867238 MHz Quarz, Geschwindigkeit 2400 Baud (zum Testen)
max232 mit 5 1µF Elkos

max232....PC.....atmega
-----------------------
T1out.....Pin2
R1in......Pin3
R1out............RXD
T1in.............TXD

Die Masse vom RS232 (Pin5) liegt auf der Masse vom atmega.

--------------
\ 1 2 3 4 5 /
 \ 6 7 8 9 /
  ---------
Was funktioniert:
Senden vom µC an den PC - Klappte sofort
Senden vom PC zum PC mittels gebrücktem TxD RxD klappt auch.
2 LED´s, jeweils an R1out und T1in. Funktionieren, irritieren mich aber 
etwas. Beim Senden von µC blinkt RxD, beim Empfangen vom PC TxD.

Was nicht klappt:
Senden vom PC zum µC. Es wird nichts ausgewertet. Ich komme aber einfach 
nicht dahinter was fehlt.

Einstellung im Hyperterm:
2400 Baud, 1 Stop-Bit, keine Parität, keine Flußkontrolle

Habe sowohl den max als auch den atmega schon mal getauscht - ohne 
Erfolg.
Ich hoffe, ich habe nichts vergessen - bin neu in der Elektronik...

Hat jemand eine Idee, was ich vergessen haben könnte?

Vielen Dank
Matze

von Niels K. (niels-k)


Lesenswert?

Hi,

probiere bitte auf den internen Oszillator mit 1 Mhz umzustellen. Ich 
habe die Vermutung, das die Baudrate mit dem Takt nicht möglich ist.

Fusebits laut Abbildung.

Wie ist das Ergebnis jetzt?

Verwende eine andere Baudrate.

Verwende folgenden Programmteil

dim Eingabe as string*1
Eingabe=inkey()
print Eingabe;

Grüße

Niels

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Was gibst Du dem fuer Tips? UART und interner Oszi ist mal ueberhaupt 
keine gute Idee (zu ungenau).

Matthias: Schau mal ins Datenblatt unter UART, da sind Tabellen, welche 
Baudraten mit welchem Quarz welchen Fehler erzeugen.

von Matthias V. (dermatze)


Lesenswert?

Hallo Niels, Hallo Michael,
vielen Dank für eure Antworten!

Die Geschwindigkeit müsste eigentlich passen. Im Datenblatt steht 
natürlich nicht genau die Quarzgeschwindigkeit, aber laut "AVR baud rate 
calculator" sollte es gehen.
Calculated Baud code (UBR): 230
Real baud rate: 2399 baud
Baud rate error: 0%

Muss ich den UBR noch irgendwo eintragen?

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

OK vielleicht solltest Du erst mal Deinen Code posten (als Anhang bidde) 
;)
Wahrscheinlich ist es dann einfach nicht richtig initialisiert.

von Matthias V. (dermatze)


Lesenswert?

Das ist der erste Test, da ist nicht viel anzuhängen...

$regfile = "M8def.dat"
$crystal = 8867238
$baud = 2400

Dim A As Byte

Do
  Print "Hallo Welt! Taste druecken!"
A = Waitkey()
  Print "ASCII " ; A ; " empfangen!"
Loop
End

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

OK mit BASCOM kann ich Dir schon mal nicht helfen. Sonderlich sinnvoll 
sieht der Code allerdings nicht aus.

von Matthias V. (dermatze)


Lesenswert?

Der Sinn ist erstmal auch nur zu sehen, ob es funktioniert :-)

von Andreas K. (derandi)


Lesenswert?

Was passiert in "Waitkey()" ?

von derpeter (Gast)


Lesenswert?

Hi,

laß Dich von "linuxgeeks" nicht kirre machen, der code ist sinnvoll. Ist 
ja direkt aus der BASCOM Hilfe - und sollte fuktionieren. In der Hilfe 
ist alles sehr gut unter "Using the UART" beschrieben. Auch wie man 
sieht, ob der interne Oszillator eingeschaltet ist. Du kannst aber auch 
einfach mal versuchen mit $crystal = 8000000 zu compilieren ...

@ derandi
Was könnte bei Waitkey passieren? Warten auf einen Tastendruck?
Steht übrigens auch in der Hilfe.

Viel Glück, derpeter

von Niels K. (niels-k)


Lesenswert?

Beim waitkey() wartet Bascom so lange bis ein Zeichen empfangen wurde. 
In diesem Fall wird der ASCII Wert des Buchstabens ausgeben.

Soll der Buchstabe selbst ausgegeben werden, so wäre chr(A) zu 
schreiben.

Probiers mal hiermit:

$baud 2400
dim A as byte
Print "Hallo Welt! Taste druecken!"
Do
A = Waitkey()
  Print "ASCII " ; A ; " empfangen!"
Loop
End

Also den Waitkey() in die Schleife und den statischen Print raus.

Ist übrigens Quatsch von Linuxgeek. Der interne Oszillator ist auch 
nicht ungenauer als 3%. Daher probiere es mit 1 000 000 Hz. Bei 8 MHz 
sind 2400bps mit Bascom aber auch möglich.

von Bensch (Gast)


Lesenswert?

> Ist übrigens Quatsch von Linuxgeek. Der interne Oszillator ist auch
nicht ungenauer als 3%.

Ja. wenn man ihn kalibriert- kann man im DB nachlesen.
Der Tipp, eine UART mit internem Oszlllator zu betreiben, schreit 
geradezu nach Wiedereinführung der Prügelstrafe...

von Matthias V. (dermatze)


Lesenswert?

@derpeter:
Auf 8Mhz kommt nur Kauderwelsch am PC an.

@Niels:
Keine Änderung - WaitKey war aber auch schon in der Schleife.

Ich habe den Quarz auch nur drauf, weil ich jedes Risiko umschiffen 
wollte. Und da der Weg µC->PC klappt mmüsste es ja auch eigentlich 
gehen...
Ich verstehe das einfach nicht. Hab mir jetzt auch schon zig Anleitungen 
angesehen - aber die machen eigentlich nichts anders.

Brauch die eingehende Leitung vielleicht noch einen Pullup, oder muss 
ich noch irgendwas zusätzlich am RS232 beschalten?

von Rene B. (themason) Benutzerseite


Lesenswert?

hast du mal den max232 getauscht ?
oder versuch mal ttl-seitig rxd-txd zu verbinden (ohne gestecktem 
atmega).
vllt das der max232 einen weg hat.

ansonsten wüsst ich nur noch einen weg : mal in assembler ausprobieren 
ob sich da was empfangen lässt. vllt hat bascom ja ein problem. kenn 
mich mit bascom nicht aus. programmiere nur in c.

von Niels K. (niels-k)


Lesenswert?

Schau Dir mal den Pegelwandler von Pollin an. Da ist ein Schaltplan. Mit 
dem geht es immer.

von Matthias V. (dermatze)


Lesenswert?

@rene:
>hast du mal den max232 getauscht ?
Hab ich getauscht. Ich habe meine LED´s auch hinter dem max gesteckt.

>oder versuch mal ttl-seitig rxd-txd zu verbinden (ohne gestecktem atmega).
Hab ich zu Anfang schon getestet. Das geht

@Niels:
>Schau Dir mal den Pegelwandler von Pollin an. Da ist ein Schaltplan. Mit dem geht 
es immer.
Ok - das mache ich, aber mit dem max232 soll es doch auch funktionieren. 
Soviel Pech, dass mehrere, mittlerweile 3, max232 einen Weg haben geht 
doch nicht, oder?

von Uwe (Gast)


Lesenswert?

Hi!
Von Bascom habe ich keine Ahnung, aber RX/TX lassen sich im µC 
abschalten,
nicht das du Rx noch irgendwie freigeben musst(RXE=1).
>Print "Hallo Welt! Taste druecken!" könnte ja Tx einschalten.

Viel Erfolg, Uwe

von Matthias V. (dermatze)


Lesenswert?

Hmmm. Die Idee werde ich mal nachprüfen. Hab davon aber noch nichts 
gelesen...

von Matthias V. (dermatze)


Lesenswert?

Alle Aufregung ist umsonst, wenn der Fehler 30cm vor dem Steckbord 
sitzt. Hab rxd in int0 gesteckt, und das einfach nicht gesehen.
Jetzt funktioniert´s natürlich... Und wieder ein 3/4 Tag verschenkt.

Vielen Dank an alle, die drüber nachgedacht haben.

Gruß
Matze

von oldmax (Gast)


Lesenswert?

Hi
Also, soweit ich es auf die Schnelle beurteilen kann, ich glaub, da ist 
ein Denkfehler. erst der µC, dann der Max und dann der PC. Nun die 
Frage, µC mit oder ohne externen Quarz. Ohne hat er nur 1 MHz, und da 
ist er sehr ungenau. Hohe Baudraten kannst du dann vergessen. Es gibt 
hier ein Tutorial, ist zwar in Assembler geschrieben, aber mit AVR 
Studio ist es kein Problem, nachzuarbeiten. Ich mag auch mehr den 
Assembler....
So, nun noch ein paar kurze Infos zur Hardware:
µC hat Tx ( Sendeleitung) und die sollte am Max auf Pin (oh Gott, auf 
meinem Schreibtisch sieht's mal wieder aus..) also Pin 10 und der kommt 
auf Pin 7 wieder raus. Ebenso sollte alternativ TX an Pin 11 und pin 14 
wieder raus gehen. Der Ausgang (also 7 oder 14) geht dann auf 2 vom 
RS232 Stecker (weiblich). RX vom µC (Empfangen) geht auf Pin 12  (raus) 
und kommt auf Pin 13 rein oder alternativ auf Pin 8 (raus) und auf Pin 9 
rein. Also, Pin 13 oder Pin 8 kommt am RS232 Stecker auf Pin 3. Nun die 
Verbindungsleitung zum PC. Diese muß 2 und 3 kreuzen, denn was am µC TX 
ist, ist am PC RX und RX am µC ist TX am PC. Nicht vergessen, Pin 5 auf 
Masse zu legen. So sollte es dann auch funktionieren.
µC TX---MAX Pin 11 in --- MAX out pin 14 -- RS232 Pin 2 --RS 232 Pin 3 
PC
µC RX---MAX Pin 12 out --- MAX in Pin 13 -- RS232 Pin 3 --RS 232 Pin 2 
PC
Gnd --------------------------------------- RS232 Pin 5 --RS 232 Pin 5 
PC

Viel Spass
oldmax

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.