Forum: Mikrocontroller und Digitale Elektronik UART: Frame Error


von Pete K. (pete77)


Angehängte Dateien:

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)


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)


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)


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)


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)


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!!

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
Noch kein Account? Hier anmelden.