mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit USART bei m16c


Autor: Joerg Longwitz (joergml)
Datum:

Bewertung
0 lesenswert
nicht 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");
----------------------------------

Autor: Joerg Longwitz (joergml)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.