Forum: Mikrocontroller und Digitale Elektronik Probleme mit USART bei m16c


von Joerg L. (joergml)


Lesenswert?

Hallo,
seit Tagen versuche ich es hin zu bekommen, daß ich einen seriellen
Datenstrom mit dem M30245F Controller (USBController von Glyn) einlesen
kann.
Ausprobiert habe ich jetzt die Sio3 und nun auch die Sio0.
Analog zu den Beispielen bzgl. Port intits und uart inits
versuche ich mit 9600 8N1 per Interrupt eine Folge von 7 Bytes
einzulesen. Sind die Zeichen eingelesen, schicke ich sie zur Kontrolle
wieder zurück per Interrupt.
Was passiert:
Schicke ich per Terminal Zeichen für Zeichen, bekomme ich den String
nach dem letzten korreckt zurück. (gut) aber ...
Schicke ich 7 Zeichen als Block, also zusammenhängend, bekomm ich das
erste Zeichen noch korreckt, aber dann nur müll. (schlecht)
Stelle ich das Terminal auf zwei Stopbits, dann klappt die Übertragung.

Stelle ich dann im Controller auch 2 Stopbits ein, dann klappts wieder
nicht...

Kann der m16c nicht aneinanderhängende Bytes verarbeiten ?

hier der code:
// Die Empfangsroutine -----------------
void UART3Receive(void){
    unsigned char i;
  while(ri_u3 == 0);
//  Serio3OutBuffer[7] = u3rbh;
  Serio3InBuffer[Serio3InPos] = u3rbl;
  Serio3InPos++;
  if(Serio3InPos==7) {
    Serio3InPos = 0;    //wieder auf start
       for (i=0; i<7; i++) {
       Serio3OutBuffer[i] = Serio3InBuffer[i];
    }
    Serio3OutBuffer[7] = 13; //return
    u3tbl = Serio3OutBuffer[0]; // erstes Zeichen senden
  }
}

// Inits aus dem Hauptprogamm
ich habe sio3 und sio0 gleichzeitig eingesetzt um zu prüfen, ob es auf
Sio0 anders ist... ist aber nicht. axo: baudrate hatte ich dann auf
4800 gesetzt, um zu gucken, ob es damit vielleicht besser geht.

    u3mr = 0x05;    /* set mode register */
    u3c0 = 0x18;     /* set control register  */
  u3brg = 0xcf;    /* set bit rate generator */
            /*  (16Mhz/16/9600)-1 */
    u3tb = 0;      /* clear transmit buffer */
//    u3tb = 0;      /* clear transmit buffer */


  u3irs = 0;      // enable transmit interrupt.....

  te_u3 = 1;      /* Enable UART3 transmit */
//  u3rrm = 1;      // Continous read
  re_u3 = 1;       /* Enable UART3 receive  */
    i = u3rb;    /* clear receive buffer by reading */
  s3tic = 0x02;    /* Enable UART3 send interrupt, */
            /*  priority level 4 */
  s3ric = 0x02;       // send intr auf prio2
//  u3tbl = 0x30;

    u0mr = 0x05;    /* set mode register */
    u0c0 = 0x18;     /* set control register  */
  u0brg = 0xcf;    /* set bit rate generator */
            /*  (16Mhz/16/9600)-1 */
    u0tb = 0;      /* clear transmit buffer */
  u0irs = 0;      // enable transmit interrupt.....

  te_u0 = 1;      /* Enable UART3 transmit */
//  u3rrm = 1;      // Continous read
  re_u0 = 1;       /* Enable UART3 receive  */
  i = u0rb;    /* clear receive buffer by reading */
  s0tic = 0x02;    /* Enable UART3 receive interrupt, */
            /*  priority level 4 */
  s0ric = 0x02;       // receive intr auf prio2

  asm("FSET I");
----------------------------------

von Joerg L. (joergml)


Lesenswert?

Juhu !
Ich war schneller...

Also zunächst ganz wichtig:
Wer mit den renesas Teilen programmiert, sollte sich die documentation
updates genau ansehen !!!

Das obige Problem ist gelöst:
Wenn man das UiMR register z.b. auf 8 bit setzt und die
Handshakeleitungen auf H-Pegel liegen, dann wird automatisch das UiERE
gesetzt und
(da muß mann erst drauf kommen....)
die Parität eingeschaltet !!!
auf diese Weise gehen dann im Betrieb bits im Paritätsbit flitzen
und man bekommt datensalat !!!

Es läuft im Moment richtig, ich habe nach dem Setzen der UiMR Register
jeweils das korespondierende UiERE bit gelöscht.

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.