PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART/RS232 Fehlersuche



Zilent
21.09.2005, 16:13
Ich hab mir laut dem Schaltplan von www.mikrocontroller.net einen Pegelwandler für die RS232 Schnittstelle gebaut und auch gleich mit dem Probeprogamm auf der gleichen Seite getestet - ohne Erfolg.

Da ich die Platine bereits kontrolliert habe, und das Programm funktionieren müsste, tue ich mir jetzt echt schwer mit der Fehlersuche. Wenn ich Hyperterminal öffne und laut Anleitung(mikrocontroller.net) einstelle, tut sich nichts, die Verbindung steht, die Zeit läuft, aber ich sehe nichts. Hin und wieder stockt der PC (und der Timer in Hyperterminal), aber Text erscheint keiner! Ich weiß nun nicht mehr, wie ich weiter machen soll bzw. wie ich welche Fehler ausschließen soll
Hoffe auf Hilfe!

Zilent

PicNick
21.09.2005, 16:17
Schau dir mal das Hyperterm an, ob du es richtig eingestellt hast
https://www.roboternetz.de/wiki/pmwiki.php?n=Main.TermHyper

Zilent
21.09.2005, 17:21
Danke für den Hinweis - leider negativ - genau die selben Einstellungen!

PicNick
21.09.2005, 18:18
Rx / Tx auf einer Seite mal vertauschen (auskreuzen) ?
Beim Max auf pin 2 u. 6 sollten ca +/- 8V zu messen sein ?

michaelb
21.09.2005, 18:25
Hallo,
mit Hyperterminal hat's bei mir noch nie funktioniert!
Ich benutze immer AVRTerm! => http://www.rowalt.de/mc/avr/toolsd.htm
Gruß Michi

DerWarze
21.09.2005, 18:39
hallo

Kann möglicherweise an den Kondensatoren liegen.
Es gibt verschieden MAX232 Typen die sich nur am angehängten Buchstaben unterscheiden und unterschiedliche KJondensatoren verlangen. MAX232A benötigt nur 0,1uF Kondensatoren. Für dem MAX Ohne A sind im Datenblatt 1uF angegeben. Der arbeitet aber auch mit 10uF ordentlich. 22uF wie in der Schaltung erscheint mir etwas viel.
Besser ist es auch das AVRTerm zu benutzen (gibts kostenlos im Net) es lässt sich enfach besser Einstellen as das olle Windows Prog.

viel Erfolg

Zilent
21.09.2005, 19:41
Das ging ja schnell!
Also das mit RX/TX auskreuzen hatte ich mir auch schon gedacht, aber wollte noch nicht die Platine "zerstören". Werde mal nachmessen und mir neue Kondensatoren besorgen - kann da leider erst Sonntag was neues sagen - falls es nichts gebracht hat, werd ich mich nochmal melden.
Habt Dank für eure schnelle Hilfe!

Zilent

PS: Müssen eigentlich Elko's verwendet werden, weil normale Kondensatoren hätte ich vorrätig!

bluelight_electronic
21.09.2005, 23:02
hehe was sind "normale" kondensatoren?

Es ist so der theoretische IDEALE C ist kapazitäts konstant / hält ne hohe spannung aus und is REIN Kapazitiv (das gibts nich (leider)) deswegen gibts unterschiedliche ...

z.b.

Elko = + Sau hohe kapazitäten bei recht hohen Spannungen - induktiv und ändert die Kapazität, fast alle Gepolt (gibt ausnahmen aber sehr selten)
Tantal = naja ich sag ma ich mag se nich :P (erstens von früher weils se fast immer zerissen hat und nie eine Kapazitätstreue hatten ... (heut is das anders) Kennzeichnung ist + (zumindest fast immer es sei den die Hersteller verpennen es oder halten sich nich an normen (hat ich leider auch schon öffters) das Positive an den dingern die haben auch Recht hohe kapazitäten bei relativ hohen Spannungen und sind kaum Induktiv negativ eben die Polung wo man nich immer 100% sicher sein kann was wo is, und sie sind relativ Teuer
FoKo = + meist SEHR hohe Spannungen (100V aufwerts...) normal Ungepolt ,teils aber auch Induktiv
Keko = + recht Kapazitäts Stabiel (die neuen) und fast nur Kapazitiv sowie ungepolt dafür is da das minus eher kleine Kapazitäten mit kleineren Spannungsfestigkeiten.Zudem der hohe preis bei hohen kapazitäten.

hab hier z.b. kekos mit 10µF und 10V in 0603er bauform... joar mit ner toleranz von +20-10% kostet halt ein stück ca 0.50€ (gut ich hab hier ne 2000er Rolle ^^) aber ... genauso 1µF mit 50V 1206 ... gut sie werden billiger aber im mom.. schwer zu bekommen (für leute die nun nicht auf großhändler zugreifen können) bzw sehr teuer.

ich beforzuge für FAST alles kekos (hab hier tonnen rumliegen ^^) und Vermeide alles andere so gut es geht ...gibt immer ausnahemen und Grenzen .. aber ...

man muss wissen was die dinger für vor und nachteile ham und dann kannst se richtig Einsetzen. Für z.b. Block C's oder die Stütz C's von strom/spannungs - treibern oder pegelwandlern würd ich Kekos vorziehen sind schnell und ...ich mag se einfach gern ^^

ich hoff ich konnt dir da bissl helfen mit...

Zilent
22.09.2005, 11:51
Nun die Vor- bzw. Nachteile der einzelnen Ausführungen hab ich schon intus - ich wollte nur fragen ob eben die Kondensatoren in diesem speziellen Fall unumgänglicher Weise Elkos sein müssen (aus welchem Grund auch immer) oder ob sie aus reinen Kosten/Kapazitäts-Gründen gewählt worden sind!

Lektor
04.10.2005, 18:04
So dann mache ich hier mal weiter, denn ich habe auch Probleme.
Habe einen MAX202 von Reichelt auf meinem Steckbrett aufgebaut (da 232 auch nicht gut gelaufen ist) und habe Kerko 100N Kondensatoren verwendet. Steckerbelegung müßte auch stimmen. Wieviele Adern müssen denn vom Stecker an die Schaltung? 3 oder? TXD RXD und GND.
HTerm empfängt auch was, aber nur Müll. Ist auch richtig eingestellt Com1 9600 Baud.

Der Code ist von Mikrocontroller.net. gehe davon aus das er richtig ist. Stimmt die Formel zur UBRR Berechnung? Habe von 4MHz auf 8MHz gewechselt. In PonyProg sind ausser chksel 2 alle von 0 bis 3 angekreuzt ( entspricht 8MHz soweit ich weiss)


.include "m8def.inc"

.def temp = r16
.equ CLOCK = 8000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1

; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp

; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp

sbi UCSRB,TXEN ; TX aktivieren

loop: ldi temp, 'T'
rcall serout ; Unterprogramm aufrufen
ldi temp, 'e'
rcall serout ; Unterprogramm aufrufen
ldi temp, 's'
rcall serout ; ...
ldi temp, 't'
rcall serout
ldi temp, '!'
rcall serout
ldi temp, 10
rcall serout
ldi temp, 13
rcall serout
rjmp loop

serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm



Woran könnte es liegen?

PicNick
04.10.2005, 18:13
Beim GCC muss man da ein "L" machen, vielleicht hilfts auch dem Assembler
CLOCK/(BAUD*16 L )-1

Lektor
04.10.2005, 19:22
ne, leider, da beschwert sich AVR Studio

michaelb
04.10.2005, 19:32
Hi,
das mit dem Datensalat kenn ich!!
Probier mal:
-Auf Connect klicken
-Und dann den µC resetten!
Damit Hterm von Anfang an deine Daten empfängt! Weil manchmal passiert es wenn man auf Connect klickt das Programm mittendrin im Ablauf ist und Hterm deine Bytes faalsch ausliest!
Gruß Michi

Lektor
04.10.2005, 20:04
ne, hat leider nicht funktioniert. Habe zwar keinen Resettaster aber ich habe mal die Spannung weggenommen und erst wieder aufgelegt, als ich auf connect geklickt habe.
Werde erstmal den Code so umschreiben, dass er nach jedem Senden ca. 1 sek Pause macht, damit man jeden Zyklus besser unterscheiden kann. Mit 9600Baud ist HTerm nur noch am scrollen ;)
kann ja gerne mal posten, was mir HTerm anzeigt, aber das wird wohl auch nicht weiterhelfen.

NACHTRAG: Habe jetzt erstmal einen 1 Sek. Sendetakt eingestellt und es werden tatsächlich 7 Zeichen gesendet.
ASCI ÔÙ.WI¨ø
HEX D4 D9 2E 57 49 A8 F8
Decimal 212 217 046 087 073 168 248
Binär 11010100 11011001 00101110 01010111 01001001 10101000 11111000

theoretisch müßte bei ASCI "TEST!" stehen. Die gesendeten "10" "13" dienen wohl der Flusssteuerung.
Vielleicht habt ihr ja einen Tipp.

PicNick
05.10.2005, 06:39
Das ist ziemlich deutlich ein Baudratenproblem. Welche Zahl stellt der Assembler nun in das Register ?
Und trotzdem die Frage, auch wenn's nervt: Oszillator/Fuses sind ok ?

Lektor
05.10.2005, 09:57
ahhh, wieder der Zufall der weitergeholfen hat. Habe ja das Tutorial von Mikrocontroller.net genommen und auch so die Einstellungen bei HTerm vorgenommen. Habe dann im Assembler mal nachgezählt und da 7 Zeichen gesendet werden habe ich mal in HTerm Data auf 7 anstatt auf 8 gesetzt und es funktioniert. Nur weiss ich nicht genau warum, wenn ich noch paar Zeichen einfüge es immernoch nur mit Data 7 funktioniert. Wahrscheinlich ist etwas im Code falsch, dass er nur 7 Datenbits sendet. Aber ich bin froh das es jetzt erstmal soweit funktioniert. Dann kann es ja nicht an der Schaltung liegen und ich kann sie mal schön auf Platine ätzen, damit ich wieder mehr Platz auf meiner Steckplatine habe.

Zilent
06.12.2005, 18:46
Is zwar schon ein weilchen her, aber habs frustriert gelassen, da ich einfach nicht dahinter kam (zusätzlich hatte ich sowieso recht viel um die ohren). Hab aber jetzt gerade noch einmal mit Multimeter gemessen:

Pin 2 hat 1,6V
Pin 6 hat 0,8V

Weiß wer wo es da hakt??

Grüße Andreas

DerWarze
06.12.2005, 20:03
Hallo

Hatte ein ähnliches Problem beim STK500 mit dem dort ausgetauschten MAX202. Es lässt auf ein Problem mit der Belastung der Ladungspumpen im MAX Chip schließen. Es sollten am MAX die erzeugte Hilfsspannungen nicht zur Versorgung von anderen Schltungsteilen verwendet werden ( was auf dem STK500 leider so ist und mitunter Probleme macht). Offenbar funktioniert das mur mit dem MAX202CSE (aber nur mit 10µF Kondensatoren obwohl das Datenblatt 0,1µF angibt) nicht aber mit dem MAX202ECSE oder dem MAX232xxx . Beim MAX232 gibt es veschieden Typen die einmal 10µF Kondis wollen andere (Suffix A)wollen 0,1µ also ziemlich Verwirrend die MAX Typen.
Teste doch mal den MAX außerhalb der Schaltung und ohne Ansteuerung mit verschiedenen Kondensatoren und miss die Spannungen es sollten ca. -8V und +8V ( auf ein-zwei Volt kommt es nicht so an es müssen aber eine negative und positive Spannung über 5V zu messen sein ) an den Pins (2,6)liegen. Wenns so funktioniert muß irgendwo in Deiner Schaltung eine unzulässige Belastung des MAX Chips vorliegen.

Zilent
13.12.2005, 21:31
Also eigentlich ist der MAX232 total unbelastet - er wurde auf einer eigenen Platine mit Stecker aufgebaut, da sind eigentlich nur die Kondensatoren drauf!

albundy
14.12.2005, 10:20
Hallo Lektor,

ich habe das Problem auch schon gehabt und die Lösung ist eigentlich ganz simpel.
Beim interne RC-Oszillator wird bei einem Reset, das OSCCAL Byte für 1 MHz geladen, egal was du eingestellt hast.
Damit ist bei 8 MHz der Oszillator für die USART zu ungenau.
Du mußt also in deinem Programm als erstes das OSCCAL Byte für 8 MHZ ändern.
Laut Datenblatt bei 5V -> OSCCAL=$A9.