Hallo Community, ich arbeite zur Zeit an einem Projekt, bei dem ein Teil des Programmes über UART Zahlen dynamisch einlesen soll und die Zahlenwerte in Array speichert. Am Anfang hat alles super geklappt (Communication über UART), als ich das Programm dann nach einer Änderung auf den uC geladen habe, hat nichts mehr geklappt. Seitdem kann ich nicht mehr über UART kommunizieren, das terminal empfängt entweder garnichts oder komische Zeichen die ich nicht gesendet habe. Der USB-TTL Converter wurde überprüft und der uC auch einmal gegen einen anderen vom selben Typ ausgetauscht. Es hat sich leider nichts getan. Ich bin mit meinem Latein am Ende, vllt könnt ihr mir weiterhelfen. Freue mich auf eure Antworten.
Ich sehe kein Setzen von USE_2X, und bezüglich 9600 Bd bei einem Systemtakt von 1 MHz ohne U2X mal ins Datenblatt schauen unter "Examples of Baud Rate Setting".
Ich habe den Code für die Initialisierung hier von der Seite und bisher hat das senden und empfangen prima geklappt. Es wird auserdem eine fertige Libery verwendet, wesshalb ich mir das Datenblatt disbezüglich nucht angesehn habe.
S. Landolt schrieb: > Ich sehe kein Setzen von USE_2X, und bezüglich 9600 Bd bei einem > Systemtakt von 1 MHz ohne U2X mal ins Datenblatt schauen unter > "Examples of Baud Rate Setting". Tobias K. schrieb: > Ich habe den Code für die Initialisierung hier von der Seite und bisher > hat das senden und empfangen prima geklappt. Es wird auserdem eine > fertige Libery verwendet, wesshalb ich mir das Datenblatt disbezüglich > nucht angesehn habe. Sollte man aber trotzdem tun. Ohne U2X in UCSRA ist dein Fehler bei 1MHz und 9600B satte -7%. Da deine Mega mit internem Quarz arbeitet, kann das noch bedeutend schlimmer ausfallen. Probiere es mit USE_2X.
S. Landolt schrieb: >> Mega mit internem Quarz > > ?? Mega mit internem RC-Oscilator für Korinthenkacker.
Marc V. schrieb:
> Mega mit internem RC-Oscilator für Korinthenkacker.
Aber, Sie haben doch sonst so viel Humor.
Paul B. schrieb: > S. Landolt schrieb: >> Aber, Sie haben doch sonst so viel Humor. > > Wann war das? > > MfG Paul Tja, Senilität fängt meistens mit Fragen wie: Wann war das ? Wer bist du überhaupt ? Wo bin ich ? und ähnlich...
Da Tobias K. wohl keine Lust, einfach mal diese simple Massnahme zu ergreifen, und sich sonst nichts tut, ein Gedicht von Franz Werfel, für alle Alten hier, zu denen wohl Paul Baumann und ich auch gehören: Auf den alten Stationen Auf den kleinen alten Stationen, Die mein eigner Zug schon längst verlassen, Ahn ich das Gedränge von Personen, Die am Bahntrakt auf die Abfahrt passen. Und ich möchte fast mich überheben Über sie, die warten am Geleise, Dass ich schon so weit auf meiner Reise Vorgedrungen bin im Rüttel-Leben, Dass ich kenne Brücken und Tunnelle, Meer- und See- und Fels- und Stadtkulissen, Dass mir gellen Aug und Ohr von Wissen, Jenen unbekannt an ihrer Stelle, Dass sie werden noch im Zeit-Zug sitzen, Stumpf am Fenster schauend Funkenspiele Und der tragischen Signale Blitzen, Wenn ich ausgestiegen längst am Ziele.
Tut mir Leid, dass ich mich erst jetzt melde. Ich habe, dass mit dem U2X auf 1 setzten probiert, dies hat jedoch am Ergebnis nichts geändert. Hoffe Ich habe es richtig gemacht: void init_uart(void) { UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; // evtl. verkuerzt falls Register aufeinanderfolgen (vgl. Datenblatt) UBRR = UBRR_VALUE; #if USE_2X UCSRA |= (1 << U2X); // U2X-Modus erforderlich #else UCSRA &= ~(1 << U2X); // U2X-Modus nicht erforderlich #endif UCSRA |= (1 << U2X); UCSRB = (1<<TXEN)|(1<<RXEN); // UART TX/RX einschalten UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1 } Was mich halt verwundert ist, dass das Programm schon geloffen ist und sinnvolles über UART ausgegeben hat. Ich habe eigendlich immer nur etwas an der Funktion uart_getdata, die mir die Zahlen auslesen soll, was geändert. Nachdem ich das Programm dann nach einer weiteren Änderung neu geladen habe (was ich geändert habe weiß ich nicht mehr), hat nichts mehr funktioniert. Woran kann das bloß liegen?
Das war vermutlich nicht richtig, Sie sollten USE_2X setzen, sonst wird UBRR falsch berechnet.
Allerdings sehe ich jetzt auch nicht, wo das UBRR_VALUE eigentlich berechnet wird.
S. Landolt schrieb: > Das war vermutlich nicht richtig, Sie sollten USE_2X setzen, sonst > wird > UBRR falsch berechnet. Wären Sie vllt so freundlich mir zu sagen wie ich es zu setzen habe, da ich dazu keine Infortmationen gefunden habe. Muss ich des im define machen da es ja ein Makro ist? Also #define USE_2X 1 Ich frage, weil ich es so ausprobiert habe und es wiederum nicht funktioniert. Vllt hilft es, wenn ich den uC abstecke und neu anstecke erhalte ich "[00]" im Terminalprogramm.
> Also #define USE_2X 1
Ich vermute genau so, allerdings sind meine C-Kenntnisse eher
rudimentär.
Und natürlich die nachträgliche Änderung "UCSRA |= (1 << U2X);"
rückgängig machen.
So wie ich das vestanden habe wird das durch ein Makro über die Baudrate berechent. (http://www.nongnu.org/avr-libc/user-manual/group__util__setbaud.html#ga0b029ff580b042a27aaac4bd2ec925e2 )
S. Landolt schrieb: > Und natürlich die nachträgliche Änderung "UCSRA |= (1 << U2X);" > rückgängig machen. Habe ich natürlich gemacht. Wie schon gesagt, was mich beschäftigt ist, dass das Programm schon ganz normale und sinnvolle Ausgaben im Terminal gemacht hat und ich an der Initialisierung oder dem Senden und empfangen nichts verändert habe.
Entschuldigung, mein zweiter Satz mit der 'nachträglichen Änderung' war unzutreffend, daran kann es dann nicht liegen. Jetzt weiß ich erstmal nicht weiter.
Schließ einen richtigen Quarz an, der interne Oszillator ist für UART nicht geeignet
Das Problem ist halt wirklich plötzlich aufgetaucht, nachdem es von Angang an funktioniert hat. Ausschließen konnte ich bisher den USB-TTL Konverter (wurde mit Bluetoothmodul getestet) und den uC, da ich einen weiteren Mega8a hatte, und es mit dem genausowenig funktioniert.
Zumindest eines wurde jetzt gelernt: funktionierende Programmversionen immer temporär speichern. Gibt es eine Möglichkeit, dass der C-Compiler den Wert von UBRR_VALUE anzeigt?
Walter S. schrieb: > Schließ einen richtigen Quarz an, Das habe ich auch schon versucht. Ext Quarz 3,6864 MHz, im define Wert geändert und Fuse auf ext. Crystal mit High Frequenz gestellt. Hat leider auch nicht geklappt
S. Landolt schrieb: > Gibt es eine Möglichkeit, dass der C-Compiler den Wert von UBRR_VALUE Mir wäre keine Möglichkeit bekannt (ich verwende AtmelStudio 7.0), außer vllt mit dem Simulator. Diesen habe ich jedoch noch nie verwendet und kenne mich damit nicht im Ansatzt aus.
Tobias K. schrieb: > Das Problem ist halt wirklich plötzlich aufgetaucht, nachdem es von > Angang an funktioniert hat. Das kann passieren wenn man U2X erst gesetzt und dann wieder zurückgesetzt hat. Probiere mal das angehängte HEX mit internem Oszillator, 1MHz und 9600B.
Ich habe das Programm auf den uC geladen, hat aber leider auch nicht funktioniert. Immer noch die selbe Ausgabe [00] einmalig.
Tobias K. schrieb: > Ich habe das Programm auf den uC geladen, hat aber leider auch nicht > funktioniert. Immer noch die selbe Ausgabe [00] einmalig. Mit 4800B und 19200B probiert ?
Tobias K. schrieb: > Jetzt schon, hat leider auch nichts gebracht Ich versuche irgendwo eine M8 auszugraben, um es zuerst hier auszuprobieren.
>Zumindest eines wurde jetzt gelernt: funktionierende Programmversionen >immer temporär speichern. Eine einfache Versionsverwaltung KOSTET NICHTS, ist EINFACH AUFZUSETZEN und EINFACH IN DER ANWENDUNG. Machst Du regelmäßig Sicherungen (ein einfacher Befehl und ein Kommentar zum aktuellen Status), so kannst Du auch jederzeit zu diesem - oder einem vorherigen - Punkt zurück. GIT ist im Freeware Bereich DIE Versionsverwaltung. Ich bevorzuge aber Mercurial. Ich hoffe nur, dass ich mit diesem Kommentar nicht eine endlose Diskussion über die bessere Versionsverwaltung losgetreten habe.
Marc V. schrieb: > Ich versuche irgendwo eine M8 auszugraben, um es zuerst hier > auszuprobieren. Ausgegraben, interner Oszillator, 1MHz und 9600B. Lock Fuse 0xFF, Low Fuse 0xE1, High Fuse 0xD9. Läuft wie es soll (ASCII 0x00 - 0xFF wird ausgegeben, mit 100ms Pause dazwischen). Sollte es bei dir mit selben Einstellungen nicht laufen, wurde ich als erstes USB-TTL Konverter in einen anderen Port umstecken und wenn es immer noch nicht läuft, auswecheln. Edit: Ich nehme an, dass die übrigen Verbindungen noch in Ordnung sind, da am Anfang doch irgendetwas ausgegeben wird.
:
Bearbeitet durch User
Ich denke irgendetwas läuft bei der programmierung des uC schief. Die Fuses sind genauso gesetzt wie bei dir. Am USB-TTL liegt es nicht, den habe ich getestet. Hier ist nichts falsch eingestellt, oder? (Anhang)
Tobias K. schrieb: > Hier ist nichts falsch eingestellt, oder? (Anhang) Nein. Genauso sieht es bei mir aus.
Tobias K. schrieb: > Am USB-TTL liegt es nicht, den > habe ich getestet. Wie getestet? Verkraftet das Teil die 3.3V Deines ATmega oder will es tatsächlich 5V TTL-Pegel sehen?
guest schrieb: > Wie getestet? Verkraftet das Teil die 3.3V Deines ATmega oder will es > tatsächlich 5V TTL-Pegel sehen? Es arbeitet mit 3,3V jedoch erkennt der uC die auch als high, an den Eingang der Wandlers habe ich einen Spannangsteiler gebaut. Getestet habe ich den Wandler indem ich einfach eines meiner Bluetoothmodule angeschlossen habe und dann damit Testnachrichten gesendet habe. Diese wurden alle im Terminal angezeigt.
@Tobias: Hast Du auch mal den µC getauscht? Vielleicht ist da was gestorben!?
Dietrich L. schrieb: > @Tobias: > Hast Du auch mal den µC getauscht? Vielleicht ist da was gestorben!? Tobias K. schrieb: > den uC, da ich einen weiteren Mega8a hatte, > und es mit dem genausowenig funktioniert.
Wenn sonst alles in Ordnung ist, bleibt ja nur noch die unmittelbare Umgebung des uC; auch wenn das jetzt unsäglich klingen mag, lässt sich denn eine LED zum Blinken bringen?
War die LED an PD1, also TxD, angeschlossen? Wenn nicht, nochmal so testen. Ist ein Oszilloskop vorhanden? Wenn ja, mit Marc V.s Programm TxD kontrollieren.
S. Landolt schrieb: > auch wenn das jetzt unsäglich klingen mag Auch wenn es von mir jetzt unsäglich klingen mag: a) Probiere mal ohne BOD. b) Geht MEGA => Bluetooth Verbindung ? c) Geht MEGA => andere MEGA Verbindung ? d) Geht MEGA => Irgendwas Verbindung ? e) Logic Analyzer vorhanden ?
Tobias K. schrieb: > Also eine LED lässt sich zum Blinken bringen. > Ich weiß jetzt wirklich nicht weiter. Hast Du einen Oszi? Dann mess mal an der TxD-Leitung vom µC bis zum USB-TTL-Converter. Vielleicht hast Du Kontaktprobleme/Leitungsunterbrechungen? Auch eine fehlende oder schlechte GND-Verbindung µC <-> USB-TTL-Converter <-> PC (Leitungsbruch?) kann diese Wirkung haben. Gruß Dietrich
So TX Pin (PD1) mit Led überprüft => ok an uC bluetoothmodul angeschlossen => keine Sinnvolle Ausgabe uC an PC über TTL angeschlossen => keine sinnvolle ausgabe Ausgabe: [00]ø8[0E]À8þÀ8[00]øø was nach Programm gesendet werden soll: test Oszilloskop vorhanden, Logic Analyser nicht
Kleines Programm schreiben, welches dasselbe Zeichen ständig ausgibt, evtl. im 0.5 ms-Abstand, und mit dem Oszilloskop das Signal auf seinem Weg kontrollieren.
Tobias K. schrieb: > So TX Pin (PD1) mit Led überprüft => ok Sagt nicht viel über UART. > an uC bluetoothmodul angeschlossen => keine Sinnvolle Ausgabe Sagt sehr viel über UART. > uC an PC über TTL angeschlossen => keine sinnvolle ausgabe Mit 3V3 geht sowas bestimmt nicht, ich hoffe, dass du RxD nicht angeschlossen hast. > Ausgabe: [00]ø8[0E]À8þÀ8[00]øø was nach Programm gesendet werden soll: > test Dein uC sendet mit Baud / 2, probiere 4800B oder, falls du die Möglichkeit hast, Baudrate am PC in 500-er Schritten ändern. > Oszilloskop vorhanden, Logic Analyser nicht Dann messe mal...
:
Bearbeitet durch User
Marc V. schrieb: > Dein uC sendet mit Baud / 2, probiere 4800B oder habe ich probiert. Es kommt immer noch nichtssinnvolles
Dietrich L. schrieb: > Auch eine fehlende oder schlechte GND-Verbindung µC <-> > USB-TTL-Converter <-> PC (Leitungsbruch?) kann diese Wirkung haben. Hast Du den GND mal durchgemessen (Ohmmeter)?
So ich kann das Problem jetzt schon sehr einengen. Es kann eigendlich nur sein das mit der Software (Atmelstudio) etwas nicht stimmt oder der Programmer kaputt ist. Ich habe den uC bei einem Freund mit demselben Programm bespielt und er funktioniert einwandfrei, bei ihm und bei mir am PC über UART. Das einzig komische ist, dass ich zuhause zum Test ein LED blink programm daraufgespielt habe und das hat der uC richtig wiedergegeben. Was kann ich noch machen?
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.