ATMega8 USART

Gast #4712814
Lesenswert?

Hallo zusammen

Ich habe das Problem das ich über die USART-Schnittstelle nicht an 
meinen Laptop senden kann.
Verbunden bin ich über einen ATMega8 an einen RS232-TTL-Wandler und 
einen Konsolenkabel auf USB am Laptop.
Die Fuses sind auf Default Value:
Int. RC Osc. 1MHz Startuptime 6 CK + 0ms.
( mir ist bewusst, dass der interne Oszillo sehr ungenau ist, jedoch 
müssten doch trotzdem Werte ungleich null ankommen )

Das Programm sendet ein 'x' als Zeichen und mein Terminal am PC empfängt 
entweder eine Nuller-Byte-Kette oder unzählig viele Nuller-Byte-Ketten
(ca. 200-1000)

Der Code ist aus dem "Wiki" von Mikrocontroller.net zusammengebastelt.

Vielleich könnt ihr mir weiterhelfen, danke :-)
Angehängte Dateien:
Gast #4712843
Lesenswert?

Hi dietrichl

Das nach einmal Senden, beendet wird ist gewollt, da das viel mehr ein 
Test sein soll für den nächsten Schritt.

Ich habe das Makro aus dem WIki herausgelösht und per Hand auf 1 Mhz 
definiert und zusätzlich noch eine Endlosschleife nach dem Senden von 
'x' hinzugefügt.

Dies spuckte mein Terminal (hterm 0.8.1 beta) aus:  ( siehe Anhang )
Angehängte Dateien:
Gast #4712854
Lesenswert?

HI

>Ich habe das Makro aus dem WIki herausgelösht und per Hand auf 1 Mhz
>definiert

Selbst bei einem quarzgenauen Takt würden 9600Bd bei 1MHz schon 7% 
Fehler ergeben. Da solltest du wenigstens auf 4800Bd runter gehen. Mich 
wundert egentlich, das

>#if ((BAUD_ERROR<990)||(BAUD_ERROR>1010))
>#error Systematische Fehler der BAudrate groesser 1% und damit zu hoch!
>#endif

keine Fehlermeldung abgibt.

MfG spess
#4712857
Lesenswert?

Pepper schrieb:
> Verbunden bin ich über einen ATMega8 an einen RS232-TTL-Wandler und
> einen Konsolenkabel auf USB am Laptop.

Du hast TTL-Pegel zwischen Wandler und ATmega? Stimmt die Polarität von 
TX? Und noch ganz dumme Frage: ist GND verbunden?

Aber mach noch vorher einen einfachen Test: Verbinde beim 
RS232-USB-Wandler  RxD mit TxD. Dann musst Du beim Senden von Zeichen 
das Echo auf dem Terminal sehen können. Dann weist Du, dass zumindest 
dieser Teil in Ordnung ist.

Gruß Dietrich
Gast #4712979
Lesenswert?

Ich habe mit
1
DDRD = 0xFF;
2
PORTD = (1<<PD1);
Die Ausgänge definiert.
Zusätzlich noch mit
1
UCSRB |= (1<<RXEN);
das Empfangen aktiviert

RXN und TXN hatte ich standardmäßig gekreuzt und
beim Echo kommen auch nur die Nullerbytes an.

Die Masse ist auch verlötet.

leider keine Veränderung beim Output.

Danke Euch allen :-)
#4712995
Lesenswert?

Pepper schrieb:
> RXN und TXN hatte ich standardmäßig gekreuzt und
> beim Echo kommen auch nur die Nullerbytes an.

Wie ist das zu verstehen?
So wie ich schrieb:

Dietrich L. schrieb:
> Aber mach noch vorher einen einfachen Test: Verbinde beim
> RS232-USB-Wandler  RxD mit TxD. Dann musst Du beim Senden von Zeichen
> das Echo auf dem Terminal sehen können. Dann weist Du, dass zumindest
> dieser Teil in Ordnung ist.

also ganz ohne ATmega. Also nichts gekreuzt, sonder nur verbunden.

Dann fehlt noch:
spess53 schrieb:
> Da solltest du wenigstens auf 4800Bd runter gehen

Und wenn das alles nichts hilft, dann muss wohl ein Oszi her...

Gruß Dietrich
Gast #4713008
Lesenswert?

Ich kenne C nicht, was heißt

> Noch was: Du hast keine Endlosschleife im main(). Nach
> 1x Senden wird das Programm beendet.
?

Bleibt der uC stehen (rjmp pc), oder läuft er wieder in den Reset (rjmp 
0)?
Gast #4713028
Lesenswert?

Die Baud hatte ich ebenso auf 4800 heruntergesenkt, sowohl im Code als 
auch im Terminal. ( ganz vergessen zu erwähnen )

Ich habe gerade keine ungelöteten Verbindungsdrähte zur Hand und hab es 
mit einer Büroklammer auf gut Glück versucht.
Leider ohne Erfolg... Ich versuche es nachher noch einmal mit einer 
Verbindungsbrücke.

Ansonsten löte ich meinen 1MHz Quartzoszillator wieder an, welchen ich 
mir gekauft hatte als ich mich selbst ausgesperrt hatte.

Wie würdet ihr empfehlen die Fuses zu setzen ?

Und noch 2 zusätzliche Fragen:
F_CPU auf 1Mio ?
und auf welchen Wert die Baud ?
#4713764
Lesenswert?

... ich schick dir am Montag Beispielcode hier.... USART ist an sich 
sehr einfach. Wenn du allerdings nicht mal Drähte hast zu Basteln... von 
den Postings her.... könntest du auch ein Troll sein, für ATmega8 gibts 
Tonnen Beispielcide im Netz ... Fuses si setzen, dass Controller mit 8 
MHz int. Takt läuft, das reicht dann für 38400 Baud bei 
Zimmrrtemperatur....
Gast #4716277
Lesenswert?

Entschuldige, mir kam etwas unerwartetes und wichtiges dazwischen.

Ich hatte zu den Zeitpunkt keine Drähte an Ort und Stelle gehabt.
Nur einen auf der Platine verlöteten ATMega8, wo bereits alle Anschlüsse 
beschriftet sind ( vgl. Pongspiel-ATMega8 ).
Zusätzlich noch die Kabel, den TTL-USB-Wandler und meinen Laptop zum 
Testen.

Also Fuses auf:
Int. RC Osc. 8MHz Startuptime 6 CK + 0ms.
und 38400 BAUD

Meine Antwortszeiten sind montags sehr schlecht :-(

Ich melde mich zurück, sobald ich das probiert habe !
Gast #4716916
Lesenswert?

Dietrich L. schrieb:
> Dietrich L. schrieb:
>> Aber mach noch vorher einen einfachen Test: Verbinde beim
>> RS232-USB-Wandler  RxD mit TxD. Dann musst Du beim Senden von Zeichen
>> das Echo auf dem Terminal sehen können. Dann weist Du, dass zumindest
>> dieser Teil in Ordnung ist.
>
> also ganz ohne ATmega. Also nichts gekreuzt, sonder nur verbunden.

Ich habe das soeben getestet und es kommt kein Signal an.
( über ATMega kamen 0en an )
Kann ich nun den Schluss ziehen, dass der Wandler defekt ist ?
Könnt ihr mir einen empfehlen? Ich hatte einen von Pollin
Gast #4717889
Lesenswert?

Vielen Dank, Ralph S. :-)

Ich habe mir nun einen neuen Wandler bestellt.
Sobald ich den habe, versuche ich sowohl deinen Code als auch meinen 
suboptimalen.

Eher unwichtige Frage:
Ich verstehe nicht so recht, was ich mit der MAKEFILE machen soll und
wie ihr die BAUD-Rate berechnest.
#4718569
Lesenswert?

Hmmmmm, zum einen glaube ich fast nicht, dass dein Wandler defekt ist. 
Zum Überprüfen des Wandlers brauchst du keinen Mikrocintroller. Du 
brückst lediglich Rxd mit Txd. Wenn du einen Wandler mit einstellbarer 
Spannung hast, mußt du auch noch die Versorgungsspannung einstellen.

Hmmmmm, wenn du nicht weißt für was ein Makefile ist, ist das 
suboptimal. Das Makefile ist dafür da, eie .c Datei zu übersetzen, das 
ist immer dann notwendig, wenn man außerhalb einer IDE ein Programm 
erstellt. Dann gibt man auf der Eingabeaufforderung nur noch ... make 
... ein und das Programm wir übersetzt. Hier ist dann notwendug, dass 
AVR-GCC und das Programm make (bei Linux standardmäßig installiert) 
vorhanden ist.

Ein Makefile beschreibt, wie ein Programm zu übersetzen ist, welches 
Zielsystem vereendet wird und welcher Compiler zu benutzen ist.

Hmmmmm, vllt. solltest du dich grundsätzlich einmal mit 
Prigrammerstellung beschäftigen.... und wenn du im Embedded Bereich 
etwas machst wäre es nützluch bestimmte Dinge zur Hand zu haben: 
Lötkolben, Steckbrett, Kabel, Widerstände, Kondensatiren, Spulen, Dioden 
etc.
Gast #4718606
Lesenswert?

Danke für dein Engagement :-)

Ich denke nicht, dass eine Spannung einstellbar war.

Aber ich würde mich freuen wenn du das mal nachgucken könntest :-)
( bei meinem sind die Kondensatoren etwas schief und die eine oder 
andere Feststellschraube etwas zu fest durch gezogen, von daher bestellt 
ist er sowieso )
http://www.pollin.de/shop/dt/MzY5OTgxOTk-/Bauelemente_Bauteile/Bausaetze_Module/Bausaetze/Bausatz_RS232_TTL_Wandler.html

Ich hatte RxD und TxD innerhalb vom Wandler ohne mC gekreuzt bei meinem 
Test und es kam kein Signal.
Im nach Hinein frage ich mich, ob die Masse nicht gefehlt hatte.

Wünsche dir noch einen schönen Abend !
#4718618
Lesenswert?

Hm, ich dachte, du hattest gleich ein USB zu TTL Serial Kabel. Bei dem 
Wandler von Pollin müsste nur der TxD mit dem RxD verbunden eerden. Wenn 
du dann ein Terminalprogramm aufmachst, egal welche Baudrate, müsstest 
du auf diesem Terminalprogramm "schreiben" können: D.h. jeden Buchstaben 
den du drückst, erscheint als Echo auf dem Bildschirm.
Gast #4723782
Lesenswert?

Hallo zusammen

Ich hatte mir einen neuen von Pollin bestellt und war etwas betrübt, 
dass ich mir den selbst zusammenlöten musste :) Im Nachhinein hat das 
mir echt Spaß gemacht, obwohl bei einigen Lötpunkten noch so Würste 
entstanden sind.

Jedenfalls habe ich nun wieder Senden und Empfangen kurzgeschlossen und 
bekomme nun mein Eingangssignal einwandfrei zurück.
Ich freue mich so, dass das jetzt endlich klappt.

Nun kann ich mir nicht mehr vorstellen, dass das mitn USART nicht klappt 
und werde das nun morgen noch einmal probieren.

Ich danke Euch allen vielmals für die Unterstützung !

Euch allen noch ein wunderschönen Sonntag !
Gast #4724869
Lesenswert?

Hallo zusammen

Unglücklicherweise funktioniert es immer noch nicht. Weder mit meinem 
noch mit Ralphs Code.
Bei Ralphs Code bekomme ich falsche Zeichen in der Form zurück:
und jemand aus dem Forum meinte mal, dass sowas immer ein Fehler mit 
Baudrate/mC Frequenz ist.
Derzeit habe ich wie von Ralph empfohlen:

Baud 38400UL
F_CPU 8000000UL

Mittels dem Makro von meinem Code, welcher dafür sorgt, dass der Fehler 
nicht 1% übersteigt, meldet hierbei eine hohe Fehlerrate und selbst 8Mhz 
und 4800 werde mir noch als zu hohe Fehlerrate angegeben.

Ich denke, ich werde nachher dennoch noch einmal über das Board schauen 
und Unfeinheiten so weit es geht beseitigen.

Falls noch jemand eine Idee hat, würde ich mich freuen :-)
#4724882
Lesenswert?

Pepper schrieb:
> Also Fuses auf:
> Int. RC Osc. 8MHz Startuptime 6 CK + 0ms.

Hätte eine Vermutung:

Das Zeichen wird nahezu unmittelbar nach dem Start gesendet, eventuell 
ist zu dem Zeitpunkt der RC Oszilator noch gar nicht eingeschwungen.
Demnach könntest du einfach mal die startup Einstellungen mit 6 CK + 
64ms versuchen.

http://www.engbedded.com/fusecalc/

Im Datenblatt kann man unter:
"USART"
"Examples of Baud Rate Setting"
ab Seite 156 übrigens Frequenzen mit den dazugehörigen Baudraten sowie 
Fehlertoleranzen sehen.
Gast #4724889
Lesenswert?

Hi

>Baud 38400UL
>F_CPU 8000000UL

>Mittels dem Makro von meinem Code, welcher dafür sorgt, dass der Fehler
>nicht 1% übersteigt, meldet hierbei eine hohe Fehlerrate und selbst 8Mhz
>und 4800 werde mir noch als zu hohe Fehlerrate angegeben.

Kommt der Takt immer noch vom internen RC-Oszillator?

MfG Spess
Gast #4724904
Lesenswert?

spess53 schrieb:
> Kommt der Takt immer noch vom internen RC-Oszillator?
>
> MfG Spess

Ja. Du meinst das ist der Fehler ?

Ich habe noch ein 32768 Hz Quartz und ein 1MHz Quartzoszillator da.

Nebenfrage:
Ungern würde ich die Fuses umstellen.
Geht das ganze auch, wenn ich das über einen Timer-Interrupt löse ?
Gast #4724953
Lesenswert?

Hi

>Ja. Du meinst das ist der Fehler ?

Ja das halte ich für sehr wahrscheinlich. Der interne RC-Oszillator ist 
nicht sonderlich Frequenzgenau und außerdem Temperatur- und 
Versorgungsspannungsabhängig.

Kannst du mit deinem Programmer die Calibration Byte deines ATMega 
auslesen?

Wenn ja, dann lies das Byte für 8MHz aus und lade damit am 
Programmanfang das OSCCAL Register. Wenn das nicht langt, dann besorge 
dir einen Baudraten-Quarz mit passenden Kondensatoren oder, wenn es für 
dich leichter ist, einen entsprechenden Quarzoszillator.

MfG Spess
Gast #4724998
Lesenswert?

spess53 schrieb:
> Kannst du mit deinem Programmer die Calibration Byte deines ATMega
> auslesen?
>
> Wenn ja, dann lies das Byte für 8MHz aus und lade damit am
> Programmanfang das OSCCAL Register. Wenn das nicht langt, dann besorge
> dir einen Baudraten-Quarz mit passenden Kondensatoren oder, wenn es für
> dich leichter ist, einen entsprechenden Quarzoszillator.
>
> MfG Spess

Puuuh.
Ich nutze AVR Studio 4 und wenn ich im Menü mit dem ATMega verbinde ( 
gibt es einen Reiter mit OCB. Hier ist nichts ausgewählt. Sozusagen der 
Status auf "Select Frequency".

Die von mir erwähnten sind nicht zu empfehlen, da Sie nicht dem Muster 
1,8432 MHz, 3,6864 MHz von 
https://www.mikrocontroller.net/articles/Baudratenquarz entsprechen, 
oder ?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren