www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik R8C UART Problem

Autor: Stephan "t" (han)
Datum: 28.09.2007 14:39

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 "stefb" B. (stefan) Benutzerseite
Datum: 28.09.2007 15:05

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: 28.09.2007 15:14

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 "stefb" B. (stefan) Benutzerseite
Datum: 28.09.2007 19:11

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: 02.10.2007 08:53

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 "stefb" B. (stefan) Benutzerseite
Datum: 02.10.2007 10:16

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: 04.10.2007 12:33

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: 04.10.2007 14:02

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: 04.10.2007 14:11

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: 04.10.2007 14:38

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: 04.10.2007 14:51

Ok habs. UART1 läuft auch........

Aber trotzdem was ist R8C1B??

Grüße
Autor: Stefan "stefb" B. (stefan) Benutzerseite
Datum: 04.10.2007 15:10

> 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: 04.10.2007 15:13

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

Grüße
han
Autor: Tippgeber (Gast)
Datum: 04.10.2007 15:29

Hmm,

R5F211B4 um es mal umständlich auszudrücken.

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net