Forum: Mikrocontroller und Digitale Elektronik Ausgabe eines Zeichens über UART funktioniert nicht


von David V. (vergossen)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Ich bin hier ganz neu und stelle deshalb wohl für euch noch etwas dumme 
Fragen, also nicht lachen ;-)
Ich habe mir ein Board aufgebaut mit einem ATmega128. Dort habe ich die 
serielle schnittstelle programmiert und will zu Testzwecken erstmal nur 
ein simples zeichen auf die schnittstelle ausgeben. Um die Zeichen 
darstellen zu können verwende ich meinen laptop und das windowsprogramm 
hyperterminal. Dort suche ich mit den richtigen com-port und stelle die 
baudrate auf 9600 ein. Flusssteuerung schalte ich aus. Aber momentan 
gibt das hyperterminal garnichts aus und vorher hat es nur wirre zeichen 
ausgegeben . zudem kamen die zeichen nicht flüssig rüber sondern 
unregelmäßig.

Kann es auch sein, dass ein hardwareproblem vorliegt?

Ich programmiere das ganze mit dem AVR-Studio.

Wäre sehr nett, wenn mir jemand helfen könnte.

Viele Grüße,
vergossen

von Otto (Gast)


Lesenswert?

Hallo David,

mit dem internen Oszillator kannst Du 9600 BAUD leider vergessen

Gruss Otto

von Karl H. (kbuchegg)


Lesenswert?

1
  while(1)
2
  {
3
  USART_Init(MEIN_UBRR);
4
  USART_Transmit(data);
5
  //PORTA = data;  //gibt Inhalt von data auf PORTA aus
6
  }

Nimm den USART_Init aus der while Schleife raus.

* Initialisierungen werden nur einmal gemacht und nicht ständig
* Dein UART wird sich schön bedanken, wenn er gerade mitten
  in der Übertragung ist und du an den Konfigurationsregistern
  drehst.

von Marius (Gast)


Lesenswert?

Moin,
meine zauber-ATMEGA können das ;-)
Eine Kleinigkeit an deinem Code ist mir beim Überfliegen aufgefallen, 
die Initialisierung kann vor die Endlosschleife. Einmal reicht voll und 
ganz.

Hast Du die Fusebits richtig gesetzt?

Gruß Marius

von David V. (vergossen)


Lesenswert?

Hallo !

Danke für die schnelle Antwort!

Nach deinem Tipp habe ich den Controller auf 1200 baud  runtergesetzt 
und nun kommen die wirren zeichen zumindest schon mal flüssig aus der 
schnittstelle. Leider kommt nur nicht viel vernünftiges an. Kann ich 
eigentlich einfach 'a' angeben, wenn ich ein a ausgeben lassen will? Ich 
habe alles probiert 'a' oder  0x61 oder auch 97 aber immer kommt wirres 
zeugs oder garnichts auf den bildschirm.

Noch eine Frage nebenbei: Du sagtest eben, dass der interne oszillator 
9600 baud nicht kann. Aber ich habe einen externen quatz, der 16mhz hat. 
Wie hängt das eigentlich zusamen?

Aber wie gesagt, mein hauptproblem ist, dass wirre zeichen kommen und 
nicht sauber die zeichen die ich will.

gruß,
Vergossen

von David V. (vergossen)


Lesenswert?

Mit den Fusebits kenne ich mich nicht aus

von Otto (Gast)


Lesenswert?

Hallo David,

bitte beachte zuerst die Hinweise von Karl heinz Buchegger und Marius.

Wenn Du einen Quarz einsetzt und die Fuses nicht änderst, läuft der 
Controller weiter mit dem internen Oszillator.

Gruss Otto

von Otto (Gast)


Lesenswert?

Fusebits - siehe Tutorium

von Otto (Gast)


Lesenswert?


von David V. (vergossen)


Lesenswert?

Nach all den Tipps kommt immer noch komisches zeug aus der 
schnittstelle. Also ich habe die initialisierung vor die whileschleife 
gezogen. Hat leider nicht geholfen. Dennoch danke für den Tipp.
Bitte gebt mir noch mehr Tipps :-)
Vergossen

von David V. (vergossen)


Lesenswert?

Das AVR Studio hat ja automatisch ein Fuse vorgeschlagen. Und zwar wurde 
für den Quartz das unterste Fuse gesetzt, was in der liste möglich ist.
Was sagt ihr dazu?

von Otto (Gast)


Lesenswert?

ext. crystal high freq 4ms ?

Otto

von Otto (Gast)


Lesenswert?

Hallo David,

was ist "komisches Zeug" - Du übergibst auch nichts an "data" oder liege 
ich da falsch?

Gruss Otto

von David V. (vergossen)


Lesenswert?

Hallo Otto,
nein, da liegts du falsch. Hier uint8_t data = 100; übergebe ich etwas 
an Data. Da habe ich auch schon sehr viel ausprobiert. also mit hex, alz 
zeichen, usw.


Otto wrote:
> Hallo David,
>
> was ist "komisches Zeug" - Du übergibst auch nichts an "data" oder liege
> ich da falsch?
>
> Gruss Otto

von David V. (vergossen)


Lesenswert?

HAllo Otto,

mein AVR stellt automatisch folgende Fusebit ein:
Ext. Crystal/Resonator High Freq., Startuptime 16CK+64ms, [CKSEL=1111 
SUT=11]
Ist das ok so? Oder soll ich das ändern?
Viele Grüße,
David

Ps: Mensch, ihr helft aber wirklich gern. Sowas habe ich in noch keinem 
anderen Forum erlebt.

Otto wrote:
> ext. crystal high freq 4ms ?
>
> Otto

von Nullpointer (Gast)


Lesenswert?

Als naechsten Schritt mit dem Scope die Bitlaenge ueberpruefen. 9600 
Baud sind 104us pro bit

von David V. (vergossen)


Lesenswert?

Hi Nullpointer!

Habe 1200Baud eingestellt. Wie berechnet man das mit den µs? Also da ich 
heute nicht mehr dazu komme, werde ich morgen mit dem Oszilloskop 
messen. Werde mich melden. Aber bitte gebt mir mal weiter Tipps. Wo an 
welcher Stelle und an welchen Pin muss ich die Bitlänge prüfen?

David

Nullpointer wrote:
> Als naechsten Schritt mit dem Scope die Bitlaenge ueberpruefen. 9600
> Baud sind 104us pro bit

von Otto (Gast)


Lesenswert?

Hallo David,

Fusebit:   sollte so funktionieren

Bitlaenge: messen am TxD - Pin 1200 BAUD sind 1/8 von 9600 BAUD
           -> 104µs x 8 = 832µs

           oder:

           1200 BAUD = 1200 bit/s

           -> Länge eines Bit 1 / 1200

Gruss Otto

von David V. (vergossen)


Lesenswert?

Das Oszilloskop zeigt an Pin TXD ein Rechteckmuster. Klar. Ich vermute 
die Positiven Flanken sind dann die Bits (etwa 5 Volt). Null volt wird 
wohl die null sein und positiv ist 1. Und die Dauer eines Peaks ist 
970ns. von Peakende zu Peakende  messe ich 10,1µs. Aber bei 1200 Baud 
müsste das doch laut Otto 833µs sein. Da steckt ja der Faktor 1000 
zwischen!! Woran liegt das denn nun? TXD1(PIN 28 am atmega128 geht bei 
mir auf T1in vom Max232. dort ist das pin11. Das Muster ist absolut 
regelmäßig. und am Ausgang t1out (pin 14 des max232) kommt ein 
regelmäßiges Signal raus, was ein wenig so aussieht alsob das 
eingangssignal invertiert wäre. Also etwa 10µs breite positive Peaks und 
ganz kurze negative Peaks, die nach unten hin spizt zusammenlaufen und 
nicht rechteckförmig sind. KEine Ahnung, woran das liegt.Ich werde heute 
nachmittag mal Abblockkondensatoren am Max232 machen, damit die 
versorgungsspannung etwas HF-freier ist.


Viele Grüße,
David

von David V. (vergossen)


Angehängte Dateien:

Lesenswert?

Wenn ich in meine while(1)-Schleife eine 5 als Wert eintrage und mir Pin 
10 des Max232 (T2in) anschaue, dann bekomme ich eine folge von 
verzerrten rechtecken, die eine peakbreite von 1µs haben
mit 833µs ist leider nichts zu finden. Ich habe nun auch die 
Betriebsspannung mit einem 100nF-Abblockkondensator abgeblockt.
Das System ist auf 1200 Baud eingestellt. Als Anhang habe ich noch mal 
die neueste Version des Progrämmchens angehängt, was leider noch nicht 
richtig funktioniert.

David

von Johannes M. (johnny-m)


Lesenswert?

Versuchs mal mit
1
#define FOSZ 16000000UL
und
1
#define MEIN_UBRR (FOSZ/(16*BAUD))-1
Bei solchen Formeln kann man nicht davon ausgehen, dass die (wie man es 
gewohnt ist) von links nach rechts verarbeitet werden. Deshalb: Immer 
eindeutig klammern und keine Sachen, die undefinierte Ergebnisse liefern 
können! Deine Formel funktioniert nämlich nur dann, wenn der 
Präprozessor Schrittweise von links nach rechts arbeitet.

von David V. (vergossen)


Lesenswert?

HI !
Danke für den Tipp. Aber leider funktioniert die Ausgabe immer noch 
nicht. Ich kann mir in der Mainschleife den Inhalt von UBRR auf einen 
mit Leuchtdioden beschalteten Port A ausgeben. Der wert stimmt.

Was nun total merkwürdig ist, ist die Tatsache, dass ich gerstern in der 
Funktion void USART_Init(ubrr)noch UBRR1H und UBRR1L auf dem Port 
ausgeben konnte. Dies funktionierte gestern so: PORTA = UBRR1H und PORTA 
= UBRR1L. Daskomische ist: Heute geht es nicht mehr, obwohl ich doch 
nichts relevantes geändert habe. Also langsam habe ich die Vermutung, 
dass es ein Hardwareproblem ist.

DAvid

von David V. (vergossen)


Lesenswert?

Also scheint der PORT UBRR1 nicht setzbar zu sein. Vielleicht ist da das 
Problem? Aber obwohl das ja gestern funktionierte funzte die ausgabe ja 
trotzdem nicht.

von David V. (vergossen)


Lesenswert?

Hallo !

So ich habe das Problem gelöst. Es funktionierte zum einen nicht weil 
mein Funktionsheader wie folgt aussah: void USART_Init(ubrr) und da ubrr 
nirgendwo definiert wurde funktionierte das wohl so nicht. Mit folgenden 
Funktionskopf funktioniert es: void USART_Init(uint16_t ubrr).

Danke für die rege Anteilnahme an meinem Problem. Ich werde sicher noch 
den einen oder anderen Thread hier eröffnen. Will nämlich einen Wert mit 
dem AD-Wandler messen und dann nachher auf SD-Karte speichern. Mal sehen 
ob ich das schaffe, wenn ich hier schon so lange gebraucht habe. Aber 
vielleicht gibt es ja für die SD-Sache ein fertiges Library. Das wäre 
mir am liebsten. Zum Schreiben eines neuen Dateisystems habe ich nämlich 
keine Zeit.

Vielen vielen Danek und viele Grüße,

David

von Johannes M. (johnny-m)


Lesenswert?

Oh, wieder einer, der die Warnmeldungen des Compilers einfach 
ignoriert... Ohrfeigen sollte man Dich!

von David V. (vergossen)


Lesenswert?

Schäm
Danke an alle !!!
David

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.