Forum: Mikrocontroller und Digitale Elektronik UART: Frame Error


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Pete K. (pete77)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe eine Lochrasterplatine mit einm ESP8266, der mir auf ein 
Atmega168 ein RX-Signal senden soll. Baudrate: 115200, Benutzung der 
FleuryLib.

Ich bekomme aber immer FrameErrors beim Empfang.

ESP ist mit 3V29 und m168 mit 4V98 angeschlossen (gemessen). High Signal 
sollte der m168 bei 3V erkennen.

Ich habe mal den Takt auf PB0 rausgegeben, siehe Screenshot anbei. Sieht 
erst einmal gut aus, oder?

2 Kerkos an VCC/AVCC/GND sind vorhanden, weitere uF nach dem LDO. Das 
Oszi sagt Vpp=160mV.

Die Leitungslänge des TX Signals beträgt ca. 10cm.
F_CPU ist 73728000UL entsprechend des Quarz Wertes.

Als Ausgabe auf dem Display sehe ich eine 4608, was 0x1200 ist und den 
FrameError beschreibt.
1
const uint32_t BAUD = 115200;
2
int main(void) {
3
  unsigned int readint;
4
5
  _delay_ms(300);  
6
7
  uart_init(UART_BAUD_SELECT(BAUD, F_CPU));  // receive from ESP8266
8
  sei();
9
10
  i2c_init();
11
12
  ssd1306_init();
13
14
  ssd1306_clear();
15
16
17
  for (;;) {
18
19
    readint = uart_getc();
20
    if ((readint & UART_FRAME_ERROR) || (readint & UART_OVERRUN_ERROR)
21
        || (readint & UART_BUFFER_OVERFLOW)) {
22
23
      ssd1306_setpos(80, 7);
24
      ssd1306_string("     ");
25
      ssd1306_setpos(80, 7);
26
      ssd1306_numdec(readint & 0xFF00);
27
    } else if (readint & UART_NO_DATA) {
28
    } else {
29
      switch ((unsigned char) readint) {
30
      case '\n':
31
        break;
32
      case '\r':
33
        line[ind] = 0; // end of string
34
        ind = 0;
35
        parse(line);
36
        break;
37
      default: // put the received char in line
38
        if (ind > BUFLEN - 1)
39
          break; // small memory so small buffer
40
        line[ind++] = (unsigned char) readint;
41
      }
42
43
    }
44
45
  }
46
47
  return 0;
48
}

Hat jemand eine Idee?

von Rainer B. (katastrophenheinz)


Bewertung
0 lesenswert
nicht lesenswert
Woher weisst du, das 0x1200 "FrameError" bedeutet?
Poste mal die uart.h, oder das, worin UART_FRAME_ERROR, 
UART_OVERRUN_ERROR bzw. UART_BUFFER_OVERFLOW definiert sind. Für mich 
liest sich der Rückgabewert von 0x1200 so, als ob mehr als ein Fehlerbit 
gesetzt ist.
Könnte ja auch ein BUFFER_OVERFLOW sein, der darauf zurückzuführen ist, 
dass die UART schon munter empfängt & überläuft, während du noch 
initialisierst.

von Pandur S. (jetztnicht)


Bewertung
0 lesenswert
nicht lesenswert
einen Frame Error gibt's wenn die Baudrate daneben ist. Die Baudrate 
muss auf besser 2% stimmen. Dh bei den AVR : ohne Quarz ist nichts. Der 
interne OSC reicht nicht. Allenfalls einen Keramikresonator, wenn's denn 
auc cents ankommt. Einen Quarz gibt's fuer 20 cents. Ein 
Keramikresonator fuer vielleicht ein Drittel.

: Bearbeitet durch User
von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Die Leitungslänge des TX Signals beträgt ca. 10cm.
> F_CPU ist 73728000UL entsprechend des Quarz Wertes.

Das sind 73MHz, also Faktor 10 falsch. Nimm mal eine Null weg und 
probiere nochmal.

Ach ja: Fuses korrekt?

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
0 lesenswert
nicht lesenswert
Rainer B. schrieb:
> Woher weisst du, das 0x1200 "FrameError" bedeutet?

 Das ist FrameError | U2Xn.
 Warum DoubleSpeed ?

 Weil dein Oszi schon an PB2 dranhangt:
1
#define cb(reg, bit)    reg &= ~(1<<bit) //bit löschen
2
#define sb(reg, bit)    reg |= (1<<bit) //bit setzen
3
#define rb(reg, bit)    reg & (1<<bit) //bit lesen
4
   while(1){
5
        if(rb(PIND, 0))  {
6
           sb(PORTB, 2);
7
        } else {
8
           cb(PORTB, 2);
9
        }
10
   }

 Und falls du einen USB to UART TTL Module hast, kannst den an
 PB.2 dranhangen und sehen was beim PC ankommt.

 P.S.
 Nach Reset sendet ESP mit irgendeiner komischen Baudrate, so um die
 75KB - paar Sekunden abwarten, dann kommt es mit 115KB...

: Bearbeitet durch User
von Pete K. (pete77)


Bewertung
0 lesenswert
nicht lesenswert
Jim M. schrieb:
> Das sind 73MHz, also Faktor 10 falsch. Nimm mal eine Null weg und
> probiere nochmal.

Hi Jim, danke für den Hinweis. Wen man sonst immer nur 8, 16 odeer 20 
Mhz verwendet, kann man das schon einmal übersehen :-) (Wald, Bäume, 
Brett-vorm-Kopf, etc)

Danke an alle, jetzt scheint es zu funktioneren!!

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]
  • [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.