Forum: Mikrocontroller und Digitale Elektronik UART AT89C51ED2 RI geht nicht


von Marko Wagner (Gast)


Lesenswert?

Hallo zusammen,
ich möchte ein paar ASCII-Zeichen zwischen PC und AT89C51ED2
übertragen. Dazu hab ich eine Schaltung mit Pegelwandler, die soweit
funtkioniert. Ich kann Daten senden und mir über Hyperterminal oder
Procomm anschauen. Wenn ich jedoch Daten empfangen möchte, löst mein RI
nicht aus, obwohl ich die Daten vom PC am Oszi feststellen kann. Unten
ist mein C-Quellcode. Ich compiliere mit Keil. Leider kenn ich mich
nicht mit dem Adress-Mode aus. Könnte da mein Fehler liege?

Gruß Marko



/* @section  I N C L U D E S */
#include "reg_c51.h"

char uart_data=0x00;
char exemple_send_data=0x55;
char TxOK=0;
/**
 * FUNCTION_PURPOSE: This file set up uart in mode 3 (9 bits uart)
with
 * timer 1 in baud rate generator mode.
 * FUNCTION_INPUTS: P3.2(INT0)
 * FUNCTION_OUTPUTS: void */
void main (void)
{
  SCON = 0xF0;            /* uart in mode 3 (9 bit), REN=1 */
   SADDR=0x01;                  /* local address */
   SADEN=0xFF;                  /* address mask */
  TMOD = TMOD | 0x20 ;         /* Timer 1 in mode 2 */
  TH1  = 0xFD;                 /* 9600 Bds at 11.059MHz */
  TL1  = 0xFD;               /* 9600 Bds at 11.059MHz */
  ES = 1;                  /* Enable serial interrupt */
  EA = 1;                 /* Enable global interrupt */
   TR1 = 1;                     /* Timer 1 run */

   while(1)                     /* endless */
   {
   P1_3=1;
   while(P3_2);                 /* wait P3_2(INT0)=0 */
   while(!P3_2);                /* wait P3_2(INT0)=1 */

     TB8 = 1;                   /* address mode */
     TxOK=1;                    /* set software flag */
     SBUF = 0x30;               /* send slave adress */
     while(TxOK);               /* wait the stop bit transmition */

     TB8 = 0;                   /* data mode */
     TxOK=1;                    /* set software flag */

   exemple_send_data=uart_data; /* copy received data to send data */
     SBUF = exemple_send_data;  /* send data */
     while(TxOK);               /* wait the stop bit transmition */
   }
}

/**
 * FUNCTION_PURPOSE: serial interrupt.
 * FUNCTION_INPUTS: P3.0(RXD) serial input
 * FUNCTION_OUTPUTS: none
 */
void serial_IT(void) interrupt 4
{
  if (TI == 1)
  {                         /* if reception occur */
      TI=0;                  /* clear transmition flag for next
transmition */
      TxOK=0;                  /* clear software transmition flag */
   }

  if (RI == 1)
  {                         /* if reception occur */
     RI = 0;                  /* clear reception flag for next reception
*/
     P1_3=0;
      if(RB8) SM2=0;            /* go into data mode */
      else
         {
         uart_data = SBUF;      /* Read receive data */
         SM2=1;                 /* return into address mode after
receive data */
         }
  }
}

von Ralf (Gast)


Lesenswert?

Warum arbeitest du im Multiprozessor-Modus? Lass das SM2-Flag weg.
Das macht nur Sinn wenn du wirklich mit mehreren Teilnehmern
kommunizierst!!!

Du bleibst im DATA-Mode und gut ist.
Mit der Variante kannst du erstmal prüfen, ob die Kommunikation
überhaupt geht...
Wo hast du mit dem Oszi gemessen, auf der RS232- oder auf der TTL-Seite
des Pegelwandlers?

Ralf

von Peter D. (peda)


Lesenswert?

Kein Wunder, daß Du nichts empfängst, der PC kann doch keine
9Datenbits.

Du mußt den 8Bit-Modus nehmen.


Peter

von Marko Wagner (Gast)


Lesenswert?

Hi Peter,

es geht doch. Ich muss das SM2 bit im SCON-Register auf LOW setzen,
dann wird das Signal generiert, welches SBUF und RB8 lädt, was dazu
führt das das RI-Flag gesetzt wird und ich meine Daten vom PC erhalte,
auch wenn er mir nur 8 Datenbits sendet. Sollte ich mit einem zweiten
Controller kommunizieren, könnte das 9.Datenbit dasselbe erzeugen wie
SM2.

Nun kann ich zwar nicht im Adressmode arbeiten, werde mir eine eine
Routine in C-Builder oder Labview schreiben, die das unterstützt.

Trotzdem Danke für die Antwort.

Gruß Marko

von Marko Wagner (Gast)


Lesenswert?

Danke Ralf

von Peter D. (peda)


Lesenswert?

@Marco,

> es geht doch.

Nein.

Es geht nur dann, wenn Du schummelst, also den PC noch ein Parity oder
2.Stopbit anhängen läßt oder zwischen den einzelnen Bytes eine Pause
von einer Bitzeit läßt.
Ansonsten gibts Byte-Salat, weil Du das nächste Starbit für das letzte
Stopbit hältst.
Derartige Schummeleien gehen außerdem nur bei abgeschalteter FIFO.

Aber warum sich derartige Umstände machen, statt gleich den richtigen
Modus zu nehmen ???



> Nun kann ich zwar nicht im Adressmode arbeiten, werde mir eine eine
> Routine in C-Builder oder Labview schreiben, die das unterstützt.

Eine Sisyphus-Arbeit also (kann nie fertig werden).


Peter

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.