www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was bedeutet UART Frame Error genau?


Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich arbeite immer noch an meiner GPS- Geschwindigkeitmessung 
(Beitrag "GPS Empfänger an ATmega8").
Inzwischen kommt auf dem Display dauernd ein E, und am Anfang ein UART 
Frame Error. Was bedeutet das genau?
Kann das daran liegen, dass ich einen 4Mhz Quarzoszillator verwende, bei 
9600 Baud?
Den µC habe ich auf external clock, startup time 0ms gefused. Ist das 
Ok?

Ach ja: Ich verwende einen Mega8, C, und die UART- lib von Peter Fleury.

Ich hoffe ihr könnt mir helfen....
Gruß, Steffen

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den Stop-Bits, der Datenlänge (6-9Bits) und / oder der Parität haut 
etwas nicht hin. Oder Du hast Dich tatsächlich bei der Baudrate 
verrechnet. 4Mhz und 9600 Baud ist kein Problem, der Fehler wäre nur 
0.2%.
Ich tippe mal auf ein falsch initialisiertes UART Controllregister.

Autor: Mensch_Z (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das abBILD deiner Bits passt nicht in den vorgeshenen ''bilderRAHMEN''

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei der Fleury-lib reicht doch:
#define UART_BAUD_RATE   9600
...
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 

zum initialisieren, oder?
Ich glaube man muss 8 Datenbits, ein Stopbit, und keine Parität 
einstellen, und das ist doch in der Fleury-lib schon voreingestellt, 
oder?

Kann es dann daran liegen, dass ich das ganze auf einem 
Reicheltsteckbrett aufgebaut habe, und deswegen die Baudraten nicht 
klappen?
Ach ja: der Oszillator sitzt auch nicht direkt nebem dem µC, und ist mit 
einem etwa 7cm langen isolierten Drahtsück mit diesem verbunden.


Gruß, Steffen

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann es dann daran liegen, dass ich das ganze auf einem
>Reicheltsteckbrett aufgebaut habe, und deswegen die Baudraten nicht
>klappen?

Normal nicht - wenn alle Bauteile fest sitzen und keine Drahtbrücke 
fehlt / zuviel ist. Womit programmierst Du (Software, Programmiergerät)? 
Hast Du F_CPU richtig definiert?

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Programmieren verwende ich USBprog, und AVR Studio, als Software. 
F_CPU, habe ich meiner Ansicht nach überall richtig definiert.
Drahtbrücken sind eigentlich keine zu viel, und es fehlen auch keine, 
also angeschlossen müsste alles richtig sein.

Wenn ich wie gesagt, den PC zwischen µC und GPS- Empfäger hände, kommt 
am PC alles richtig an...
Ich werde jetztmal den GPS- Empfänger komplett weglassen, und direkt vom 
PC Sachen zum µC schicken, mal schauen, ob das funktioniert....

Gruß, Steffen

PS: @travelrec: Ich habe dir eine Mail geschrieben, bzgl. deiner 
Schutzschaltung mit den Widerständen für den Dragon - hast du die 
bekommen?

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe etwas sehr interessantes herausgefunden: Ich hab nun einfch mal 
in meinen Code geschrieben, dass der Mega8 immer ein Zeichen empfangen 
soll, das am Display ausgeben, und über den UART zurückschicken. Nun hab 
ich also mein Terminalprogramm am Pc aufmemacht (HTerm), alles 
ordentlich verbunden, und mal ein Zeichen (l) an den Mege8 geschickt.
Und was passiert? Er zeigt mir auf dem Display das große E an, dass er 
schon immer angezeigt hat, und sendet mir dieses auch über den UART 
zurück.
Der Mega8 empfängt also immer nur ein E, egal was der GPS- Empfänger 
sendet...
Woran kann das liegen?
Ich hab nochmal meinen Code angehängt.

Gruß, Steffen

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen O. wrote:

> Was bedeutet das genau?

Dass zum erwarteten Zeitpunkt kein Stopbit zu finden war.  Nach dem
Startbit (Wechsel des Pegels vom aktiven zum inaktiven Zustand)
tastet die UART n-mal (n = Zeichenlänge in Bits) die Datenbits ab,
bei der nachfolgenden Abtastung eine Bitperiode danach erwartet sie
ein Stopbit in Form eines aktiven Pegels.  Ergibt diese Abtastung
einen inaktiven Pegel, hast du einen framing error.

Konnte man bei RS-232 für ein out-of-band-signalling benutzen, das
sogenannte "serial break": man hat einfach für eine bestimmte Zeit
(relativ unkritisch, deutlich mehr als 10 Bitzeiten) den Pegel auf
inaktiv gezogen.  Mit entsprechendem Pulling an den Eingängen ergibt
auch das Abschalten eines seriellen Terminals einen BREAK.

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für deine Erklärungen!!!
Und das beudeutet, dass, wenn der GPS Empfänger an meinem Mega8 hängt, 
kein Stopbit übertragen wird?

Wenn ich ihn den Mega8 aber am PC hängen habe, kommt der Frame Error 
nicht, aber der ATmega8 gibt, egal welches Zeichen ich per UART sende, 
auf dem LCD, und am UART ein großes E aus. Wodurch lässt sich das 
erklären?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen O. wrote:

> Und das beudeutet, dass, wenn der GPS Empfänger an meinem Mega8 hängt,
> kein Stopbit übertragen wird?

Naja, der wird das Stopbit schon richtig übertragen, aber die
Abtastung deines ATmega8 läuft in der Zeit so weit aus dem Ruder,
dass er das Stopbit nicht zu dem Zeitpunkt sieht, da er es erwartet.
Das riecht alles nach Taktfrequenzproblemen.

Da du einen ATmega8 hast (und keinen ATmega88), hast du noch kein
CKOUT, mit dem du den internen Takt überprüfen kannst.  Ein einfacher
Trick ist aber, einen Timer im CTC-Modus zu betreiben und auf "toggle
OCx on compare match" zu stellen.  Das entsprechende OCRx setzt du
auf 0, den Vorteiler auf 1:1, dann hast du am OCx-Ausgang genau die
halbe CPU-Frequenz, die du dann messen kannst.

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, habe nun mal direkt nach dem Quarzoszillator mit meinem Oszilloskop 
gemessen, und da wurde mir eine fast saubere Rechteckschwingung(?) 
angezeigt. Der Oszillator funktioniert also....

Wie du das mit dem Timer meinst, habe ich nicht verstanden, könntest du 
eventuell ein Codebeispiel posten?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

Autor: Kopfschüttel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oje....
Und sowas nennt sich "derelektroniker"

Puhh...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen O. wrote:

> Ok, habe nun mal direkt nach dem Quarzoszillator mit meinem Oszilloskop
> gemessen, und da wurde mir eine fast saubere Rechteckschwingung(?)
> angezeigt. Der Oszillator funktioniert also....

Das bedeutet noch lange nicht, dass der Controller sich auch für
diesen Takt interessiert...  (Du schreibst ,Quarzoszillator', daher
nehme ich mal an, du hast einen externen Oszillator und nicht nur
einen Quarz direkt am Controller.)

> Wie du das mit dem Timer meinst, habe ich nicht verstanden, könntest du
> eventuell ein Codebeispiel posten?

Naja, richtig ,auf Lager' habe ich die nicht, das bisschen hacke ich
immer live zusammen.  OK, dann mach ich mal deine Hausaufgaben:
#include <avr/io.h>

int
main(void)
{
  TCCR2 = _BV(WGM21) | _BV(COM20) | _BV(CS20);
  OCR2 = 0;
  DDRB = _BV(3);
  for (;;) /* wait */;
  return 0;
}

Das sollte an PB3 den halben CPU-Takt ausgeben.

Autor: Steffen O. (derelektroniker) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> Steffen O. wrote:
>
>> Ok, habe nun mal direkt nach dem Quarzoszillator mit meinem Oszilloskop
>> gemessen, und da wurde mir eine fast saubere Rechteckschwingung(?)
>> angezeigt. Der Oszillator funktioniert also....
>
> Das bedeutet noch lange nicht, dass der Controller sich auch für
> diesen Takt interessiert...  (Du schreibst ,Quarzoszillator', daher
> nehme ich mal an, du hast einen externen Oszillator und nicht nur
> einen Quarz direkt am Controller.)
 Ja, genau, ich habe einen externen Oszillator 
(http://www.reichelt.de/?;ACTION=3;LA=4;GROUP=B42;G...)

>> Wie du das mit dem Timer meinst, habe ich nicht verstanden, könntest du
>> eventuell ein Codebeispiel posten?
>
> Naja, richtig ,auf Lager' habe ich die nicht, das bisschen hacke ich
> immer live zusammen.  OK, dann mach ich mal deine Hausaufgaben:
Danke ;-)

>
> #include <avr/io.h>
> 
> int
> main(void)
> {
>   TCCR2 = _BV(WGM21) | _BV(COM20) | _BV(CS20);
>   OCR2 = 0;
>   DDRB = _BV(3);
>   for (;;) /* wait */;
>   return 0;
> }
> 
>
> Das sollte an PB3 den halben CPU-Takt ausgeben.

Ja, macht der Code auch. An PB3 liegt der halbe Takt an, wie den, den 
ich am Oszillator messe, also der CPU- Takt.

Der Takt scheint also zu stimmen, woran kanns dann noch liegen? Soll ich 
nun mal einen Baudratenquarz kaufen, und mal so einen testen?

Vielen Dank schon einmal im Voraus.
Gruß, Steffen

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>An PB3 liegt der halbe Takt an, wie den, den
>ich am Oszillator messe, also der CPU- Takt

Und mit welcher Frequenz? Was sagt der Oszi bezüglich der Zeit?

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.