R8C UART Problem

OP #664780
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
OP #664817
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
Persönliche Seite #664992
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
1
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:
1
void read_from_uart(void)
2
{
3
  zaehler=0; // Initialisierung nicht so weit weg, beruhigt die Nerven ;-)
4
  while(zaehler<13)
5
  {
6
    /* Zeichen am Empfang (RX) abholen */
7
    /* Warten bis Empfangspuffer mit Bits voll ist */
8
    while(!ri_u1c1)
9
       ;
10

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

20
void main(void)
21
{
22
  // Normale Initialisierung (Clock, Ports etc.)
23

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

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

37
  while(1)
38
  {
39
    read_from_uart();
40
  }
41
}


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
1
  {
2
     unsigned int dummy;
3
     dummy = u1rb;
4
     telegramm[zaehler] = (unsigned char) (dummy & 0x00FF); 
5
     RXError = (unsigned char) (dummy>>8);
6
  }
OP #666913
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
Persönliche Seite #666972
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren