mikrocontroller.net

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


Autor: David V. (vergossen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo David,

mit dem internen Oszillator kannst Du 9600 BAUD leider vergessen

Gruss Otto

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  while(1)
  {
  USART_Init(MEIN_UBRR);
  USART_Transmit(data);
  //PORTA = data;  //gibt Inhalt von data auf PORTA aus
  }

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.

Autor: Marius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den Fusebits kenne ich mich nicht aus

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fusebits - siehe Tutorium

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ext. crystal high freq 4ms ?

Otto

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo David,

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

Gruss Otto

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nullpointer (Gast)
Datum:

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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David V. (vergossen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit
#define FOSZ 16000000UL
und
#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.

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: David V. (vergossen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schäm
Danke an alle !!!
David

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.