Forum: Mikrocontroller und Digitale Elektronik Uart Problem mit ATMega8a


von Tobias K. (tobias-k)


Angehängte Dateien:

Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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

von Tobias K. (tobias-k)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> Mega mit internem Quarz

??

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

S. Landolt schrieb:
>> Mega mit internem Quarz
>
> ??

 Mega mit internem RC-Oscilator für Korinthenkacker.

von S. Landolt (Gast)


Lesenswert?

Marc V. schrieb:
> Mega mit internem RC-Oscilator für Korinthenkacker.
Aber, Sie haben doch sonst so viel Humor.

von Paul B. (paul_baumann)


Lesenswert?

S. Landolt schrieb:
> Aber, Sie haben doch sonst so viel Humor.

Wann war das?

MfG Paul

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

von Paul B. (paul_baumann)


Lesenswert?

:)))

Da kotzt Du nicht -da mußt Du durch!

MfG Paul

von S. Landolt (Gast)


Lesenswert?

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.

von Tobias K. (tobias-k)


Lesenswert?

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?

von S. Landolt (Gast)


Lesenswert?

Das war vermutlich nicht richtig, Sie sollten USE_2X setzen, sonst wird 
UBRR falsch berechnet.

von S. Landolt (Gast)


Lesenswert?

Allerdings sehe ich jetzt auch nicht, wo das UBRR_VALUE eigentlich 
berechnet wird.

von Tobias K. (tobias-k)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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

von Tobias K. (tobias-k)


Lesenswert?

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 
)

von Tobias K. (tobias-k)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

Entschuldigung, mein zweiter Satz mit der 'nachträglichen Änderung' war 
unzutreffend, daran kann es dann nicht liegen. Jetzt weiß ich erstmal 
nicht weiter.

von Walter S. (avatar)


Lesenswert?

Schließ einen richtigen Quarz an,
der interne Oszillator ist für UART nicht geeignet

von Tobias K. (tobias-k)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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?

von Tobias K. (tobias-k)


Lesenswert?

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

von Tobias K. (tobias-k)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

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.

von Tobias K. (tobias-k)


Lesenswert?

Ich habe das Programm auf den uC geladen, hat aber leider auch nicht 
funktioniert. Immer noch die selbe Ausgabe [00] einmalig.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ?

von Tobias K. (tobias-k)


Lesenswert?

Jetzt schon, hat leider auch nichts gebracht

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Tobias K. schrieb:
> Jetzt schon, hat leider auch nichts gebracht

 Ich versuche irgendwo eine M8 auszugraben, um es zuerst hier
 auszuprobieren.

von Sebastian S. (amateur)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Tobias K. (tobias-k)


Angehängte Dateien:

Lesenswert?

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)

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

Lesenswert?

Tobias K. schrieb:
> Hier ist nichts falsch eingestellt, oder? (Anhang)

 Nein.
 Genauso sieht es bei mir aus.

von guest (Gast)


Lesenswert?

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?

von Tobias K. (tobias-k)


Lesenswert?

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.

von Dietrich L. (dietrichl)


Lesenswert?

@Tobias:
Hast Du auch mal den µC getauscht? Vielleicht ist da was gestorben!?

von Tobias K. (tobias-k)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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?

von Tobias K. (tobias-k)


Lesenswert?

Also eine LED lässt sich zum Blinken bringen.
Ich weiß jetzt wirklich nicht weiter.

von S. Landolt (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 ?

von Dietrich L. (dietrichl)


Lesenswert?

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

von Tobias K. (tobias-k)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Tobias K. (tobias-k)


Lesenswert?

Marc V. schrieb:
> Dein uC sendet mit Baud / 2, probiere 4800B oder

habe ich probiert. Es kommt immer noch nichtssinnvolles

von Dietrich L. (dietrichl)


Lesenswert?

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

von Tobias K. (tobias-k)


Lesenswert?

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
Noch kein Account? Hier anmelden.