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 :-)
Der Interrupt hatte ich eigentlich vorher herausgelöscht... bitte nicht beachten. Ich hatte immer ohne diesen getestet.
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".
Noch was: Du hast keine Endlosschleife im main(). Nach 1x Senden wird das Programm beendet.
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 )
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.
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
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
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...
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 :-)
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
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)?
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!"
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 ?
Danke Dietrich. (schade, mit 'rjmp 0' hätte ich mir das Fehlverhalten irgendwie erklären können)
... 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....
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 !
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
Einfaches Programm fuer serielle Schnittstelle, ATmega8, interner Oszillator 8MHZ, Baudrate 38400 Bd. Viel Erfolg
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.
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.
PS: wie man die Baudrate berechnet steht in uart_init.... sollte eigentluch dort gut erkennbar sein.
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 !
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.
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 !
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 :-)
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
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
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 ?
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.
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
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 ?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.