Uart Problem mit ATMega8a

OP #4663567
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.
Angehängte Dateien:
Gast #4663579
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".
OP #4663601
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.
(Firma: Vescomp) #4663686
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.
Gast #4663724
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.
OP #4663751
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?
OP #4663778
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.
Gast #4663780
> 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.
OP #4663784
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.
Gast #4663786
Entschuldigung, mein zweiter Satz mit der 'nachträglichen Änderung' war 
unzutreffend, daran kann es dann nicht liegen. Jetzt weiß ich erstmal 
nicht weiter.
OP #4663794
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.
Gast #4663801
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?
#4663872
>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.
(Firma: Vescomp) #4663885
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.
OP #4664058
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.
Gast #4664104
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?
#4664255
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
OP #4664307
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
Gast #4664340
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.
(Firma: Vescomp) #4664345
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...
OP #4665493
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.