Gast
#351337
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 */
}
}
}