Ausgabe eines Zeichens über UART funktioniert nicht

OP #602964
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
Angehängte Dateien:
#602966
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.
Gast #602968
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
OP #602972
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
Gast #602975
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
OP #603035
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
OP #603041
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
OP #603057
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
Gast #603078
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
OP #603539
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
OP #603743
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
Angehängte Dateien:
#603759
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.
OP #603813
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
OP #603874
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren