www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART AT89C51ED2 RI geht nicht


Autor: Marko Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */
         }
  }
}

Autor: Ralf (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Du mußt den 8Bit-Modus nehmen.


Peter

Autor: Marko Wagner (Gast)
Datum:

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

Autor: Marko Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Ralf

Autor: Peter Dannegger (peda)
Datum:

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

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.