Forum: Mikrocontroller und Digitale Elektronik ATMega8 USART


von Pepper (Gast)


Angehängte Dateien:

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 :-)

von Pepper (Gast)


Lesenswert?

Der Interrupt hatte ich eigentlich vorher herausgelöscht... bitte nicht 
beachten.
Ich hatte immer ohne diesen getestet.

von Dietrich L. (dietrichl)


Lesenswert?

Ist F_CPU auch mit 1MHz definiert?
Wenn nicht, wird es im Programm auf 4MHz eingestellt.

Am besten wirf das "#ifndef F_CPU.." ganz raus und schreib direkt 
"#define F_CPU 1000000UL".

von Dietrich L. (dietrichl)


Lesenswert?

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

von Pepper (Gast)


Angehängte Dateien:

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 )

von Frederik H. (diveturtle93)


Lesenswert?

Morgen Pepper,

der TX Pin müsste noch als Ausgang definiert werden. War bei mir am 
Anfang auch das Problem das da nichts heraus kam.

von spess53 (Gast)


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

von Dietrich L. (dietrichl)


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

von Dietrich L. (dietrichl)


Lesenswert?

Frederik H. schrieb:
> der TX Pin müsste noch als Ausgang definiert werden.

Das muss nicht sein. Bei mir geht es ohne und es ist im Datenblatt auch 
nicht anders beschrieben.

> War bei mir am Anfang auch das Problem das da nichts heraus kam.

Dann muss das bei Dir ein anderer Effekt gewesen sein. Gut - schaden 
kann es nicht...

von Pepper (Gast)


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 :-)

von Dietrich L. (dietrichl)


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

von S. Landolt (Gast)


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)?

von Dietrich L. (dietrichl)


Lesenswert?

S. Landolt schrieb:
> 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)?

Beitrag "Re: Programme beenden!"

von Pepper (Gast)


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 ?

von S. Landolt (Gast)


Lesenswert?

Danke Dietrich.

(schade, mit 'rjmp 0' hätte ich mir das Fehlverhalten irgendwie erklären 
können)

von Ralph S. (jjflash)


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....

von Pepper (Gast)


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 !

von Pepper (Gast)


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

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Einfaches Programm fuer serielle Schnittstelle, ATmega8, interner 
Oszillator 8MHZ, Baudrate 38400 Bd.

Viel Erfolg

von Pepper (Gast)


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.

von Ralph S. (jjflash)


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.

von Ralph S. (jjflash)


Lesenswert?

PS: wie man die Baudrate berechnet steht in uart_init.... sollte 
eigentluch dort gut erkennbar sein.

von Pepper (Gast)


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 !

von Ralph S. (jjflash)


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.

von Pepper (Gast)


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 !

von Pepper (Gast)


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 :-)

von Holger L. (max5v)


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.

: Bearbeitet durch User
von spess53 (Gast)


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

von Pepper (Gast)


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 ?

von Karl M. (Gast)


Lesenswert?

Pepper schrieb:
> Geht das ganze auch, wenn ich das über einen Timer-Interrupt löse ?

Nein.

Die Fuse-Bits sind auch kein Hexenwerk, diese aus dem Datenblatt zu 
verstehen ist etwas schwierig, aber mit diesem Hilfsmittel:
http://www.engbedded.com/fusecalc/
kein Problem.

von spess53 (Gast)


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

von Pepper (Gast)


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 ?

von Pepper (Gast)


Lesenswert?

Pepper schrieb:
> 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".

Achso nun habe ich verstanden.
OCB gibt bei 8MHz 0x9F aus

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.