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
Hallo David, mit dem internen Oszillator kannst Du 9600 BAUD leider vergessen Gruss Otto
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.
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
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
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
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
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?
Hallo David, was ist "komisches Zeug" - Du übergibst auch nichts an "data" oder liege ich da falsch? Gruss Otto
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
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
Als naechsten Schritt mit dem Scope die Bitlaenge ueberpruefen. 9600 Baud sind 104us pro bit
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
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
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
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
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.
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
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.
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
Oh, wieder einer, der die Warnmeldungen des Compilers einfach ignoriert... Ohrfeigen sollte man Dich!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.