www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik R8C UART Problem


Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat jemand Erfahrung mit einem R8C21258?

Ich versuche gerade über die UART1 und Funktranceiver zwei uC´s 
miteinander  reden zu lassen. Das Datenpaket (13Byte) kommt am 
empfangenden uC an allerdings bekomme ich es nicht in Variablen 
gespeichert. Um Daten zu empfangen muss das Bit te_u1c1 auf 1 gesetzt 
werden. Im Debugger seh ich aber, dass das Bit nicht gesetzt wird.

Kann mir jemand einen Tip geben was da zu tun ist oder ob ich mich 
einfach vom Debugger veräppeln lasse??

Danke und Grüße
han

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei te_u1c1 ist t ein T wie in Transmission d.h. Senden. Du musst beim 
Empfänger das re_u1c1 Bit (Enable Reception) auf 1 setzen.

Wie sieht der Codeteil in der UART-Empfängerroutine aus? Denkst du daran 
den RXError (u1rbh) auszulesen, damit ri_u1c1 gelöscht wird?

Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das T für transmit steht hab ich schon verstanden. Es steht aber im 
Datenblatt, dass dieses Bit auf 1 gesetzt werden soll.........
Hier mein Code:

Zuerst Variablendefinition (fehlt hier)

void read_from_uart(void)
{


  te_u1c1=1;
  re_u1c1=1;

  while(zaehler<13)
  {
   if (ri_u1c1==1) <-- Hier bleibt der Debugger stehen!
   {
    telegramm[zaehler] = u1rbl;
          RXError = u1rbh;
    zaehler++;
   }
  }

  re_u1c1=0;
  te_u1c1=0;
  zaehler=0;

}
void main(void)
{
      zaehler=0;
  u1brg=0x81;    // Bautrate einstellen 9600
  u1mr=0x05;    // 8Datenbits/Int.Clock/1Stopbit/NoParity
  u1c0=0x00;    // LSB zuerst??????Evt. umdrehen
  u1rrm_u1c1=0;  // kontinierlich empfangen aus
  u1pinsel=1;    // P6_6 undP6_7 arbeiten als Uart1

  while(1)
  {
  read_from_uart();
  }
}

Danke und Grüße
han

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Kommentar "<-- Hier bleibt der Debugger stehen!" verstehe ich nicht.

Kommt der Debugger, weil ein Programmabsturz passiert? Kommt der 
Debugger, weil du ein Trace auf ri_u1c1 sitzen hast? Kommt der Debugger, 
weil du einen Breakpoint gesetzt hast? Wenn ja - Wo sitzt dein 
Breakpoint und welche Werte haben die Variablen?

Wenn du dich wunderst, dass ri_u1c1 auf 1 bleibt; das wird erst 
automatisch gelöscht, wenn u1rbh ausgelesen wird.

Die Initialisierung sieht OK aus, bis auf
u1pinsel=1;   // P6_6 (=>TX) und P6_7 (=>RX) arbeiten als Uart1

Da müsste laut Hardwaremanual noch PD6_7 im PD6 Register auf 0 (d.h. als 
Inputpin)gesetzt werden. Und zwar als erster Punkt der UART 
Initialisierung. Wäre einen Versuch Wert.

Die Einlesefunktion würde ich eher so machen:
void read_from_uart(void)
{
  zaehler=0; // Initialisierung nicht so weit weg, beruhigt die Nerven ;-)
  while(zaehler<13)
  {
    /* Zeichen am Empfang (RX) abholen */
    /* Warten bis Empfangspuffer mit Bits voll ist */
    while(!ri_u1c1)
       ;

    /* dann Empfangspuffer auslesen */
    telegramm[zaehler] = u1rbl; // <-- hier BREAKPOINT setzen
    RXError = u1rbh;    // ggf. hier im Fehlerfall ein break und 
                        // später zaehler als Rückgabewert auswerten
    zaehler++;
  }
  telegramm[zaehler]=0; // Stringabschluss beruhigt die Nerven ;-)
}

void main(void)
{
  // Normale Initialisierung (Clock, Ports etc.)

  // UART Initialisierung
  u1brg=0x81;   // Bautrate einstellen 9600
  u1mr=0x05;    // 8Datenbits/Int.Clock/1Stopbit/NoParity
  u1c0=0x00;    // LSB zuerst?????? 
                // Ja, ist bei UART normal
                // http://www.mikrocontroller.net/articles/UART
  u1rrm_u1c1=0; // kontinierlich empfangen aus
  u1pinsel=1;   // P6_6 undP6_7 arbeiten als Uart1

  // UART Einschalten
  te_u1c1=1;    // UART-Sender ein (aber derzeit unbenutzt)
  re_u1c1=1;    // UART-Empfänger ein

  while(1)
  {
    read_from_uart();
  }
}


Im Hardwaremanual steht übrigens eine Notiz drin, dass man u1rb als 
16-Bit Register auslesen soll. Bisher hatte ich aber noch keine Probleme 
mit zwei getrennten 8-Bit Zugriffen (allerdings war das ein R8C/13)

Die Alternative sähe so aus
  {
     unsigned int dummy;
     dummy = u1rb;
     telegramm[zaehler] = (unsigned char) (dummy & 0x00FF); 
     RXError = (unsigned char) (dummy>>8);
  }

Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

Danke für Deine Antwort.

Der Debugger bleibt stehen ist eigentlich falsch ausgedrückt. Eigentlich 
bleibt das Programm stehen. Aber nicht weil es abstürzt oder so , 
sondern weil das ri_u1c1 -Flag nicht auf "1" gesetzt wird obwohl ich 
Daten an die UART sende (Timing stimmt, hab ich alles nachgemessen).
Ich habe mir eigentlich gedacht, dass ich den Empfänger mit Debbuger 
laufen lasse (Run), dann an der Stelle die Du markiert hattest einen 
Breakpoint setze (telegramm[zaehler] = u1rbl; // <-- hier BREAKPOINT 
setzen) dann die Daten sende. Nun sollte eigentlich das Programm am 
Breakpoint halten. Das tut es aber nicht. Wenn ich dann den Debugger 
anhalte steht er in der Zeile: while(!ri_u1c1).

Uart1 Pin RxD und TxD hatte ich in einem anderen File, welches mit 
compiliert wird auf "0" gesetzt.

Ich werde jetzt Deine Lösung genau anschauen und das ganze nochmals 
probieren.

Danke und Grüße
han

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Debugger nimmt du?

Wenn es einer der "normalen" On-Chip-Debugger (FoUSB/UART-Debugger, E8 
Emulator Debugger) ist, kannst du auf die Register und TXD1/RXD1 von 
UART1 nicht zugreifen. Beim E8 steht im User Manual: "UART1 is used by 
the E8 emulator. Do not use UART1 in the user program.". Was passiert, 
wenn du dein Programm auf UART0 abänderst?

Den "exotischen" Emulator Debugger PC7501, der den kompletten µC 
emuliert, wirst du IMHO nicht haben, oder?

Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Danke für die Antwort.

Ich hab den E8 und werde mal auf UART0 umschalten.......

Danke und Grüße
han

Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

so wie es aussieht funktionert es nun. Hab auf UART0 umgeschaltet. Ich 
möchte aber auch noch die UART1 ohne E8 testen......

Grüße und Danke
han

Autor: Tippgeber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass dein Progrämmelchen auf einem R8C1B laufen.
Da kann man beim Debuggen mit dem E8 auch beide serielle Schnittstellen 
benutzen.
Steht zwar in der Doku anders drin, funktioniert aber.

Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es bei der UART1 noch was besonderes zu beachten?? Was muss ich mit 
dem Pin 6_5 machen soll ich den als Input schalten und auf "0" legen?

Was ist ein R8C1B??

Grüße

Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok habs. UART1 läuft auch........

Aber trotzdem was ist R8C1B??

Grüße

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber trotzdem was ist R8C1B??

Ein lax geschriebener µC aus der R8C/1B Gruppe

http://www.renesas.com/fmwk.jsp?cnt=r8c1b_root.jsp...

Autor: Stephan "t" (han)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja ok, wusste nicht, dass es unter diesem Begriff ein Controller 
gibt.

Grüße
han

Autor: Tippgeber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm,

R5F211B4 um es mal umständlich auszudrücken.

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.