Hi Michi,
nachfolgend habe ich dir einige Teile aus meinem Programm
zusammengestellt.Buffer und Pointer bitte selbst erstellen.
Die Daten werden hier über eine RS485/RS422 empfangen/ gesendet.
Versuch dich mal einzuarbeiten, vielleicht hilft es dir weiter.
//
// 9600,n,8,1
//
void Init_SCI_0 (void)
{
int i;
cEmPtr = cEmBuffer;
cSePtr = cSeBuffer;
cEmMrk = 0;
cSeMrk = 0;
pd6_0 = 1; // p6_0 als Ausgang, wichtig fuer
Sendereinschaltung !
p6_0 = 0;
// Sleep=no, Parity=no, 1StopBit, IntClk, 8-Bit
// Setting UART0 transmit/receive mode register (UART mode)
u0mr = 0x05; // XXXX XXXX
// |||| |||+- uart mode
// |||| ||+-- uart mode
// |||| |+--- uart mode
// |||| | 000: Serial I/O disable
// |||| | 100: 7 bit data
// |||| | 101: 8 bit data
// |||| | 110: 9 bit data
// |||| +---- Internal/external clock select
bit
// |||| 0: Internal clock
// |||| 1: External clock
// |||+------ Stop bit length select bit
// ||| 0: One stop bit
// ||| 1: Two stop bit
// ||+------- Odd/even parity select bit
// || Valid when bit 6 = 1
// || 0: Odd parity
// || 1: Even parity
// |+-------- Parity enable bit
// | 0: Parity disabled
// | 1: Parity enabled
// +--------- Sleep select bit
// 0: Sleep mode deselected
// 1: Sleep mode selected
// Setting UART0 transmit/receive control register 0 (UART mode)
// CMOS, No CTS/RTS
u0c0 = 0x10; // 00XX XXXX
// |||| |||+- BRG count source select bit
// |||| ||+-- BRG count source select bit
// |||| || 00: f1 is selected
// |||| || 01: f8 is selected
// |||| || 10: f32 is selected
// |||| || 11: inhibited
// |||| |+--- /CTS//RTS function select
bit
// |||| | (Valid when bit 4 ='0')
// |||| | 0: /CTS function is selected
// |||| | 1: /RTS function is selected
// |||| +---- Transmit register empty flag
// |||| 0: Data present in transmit
register
// |||| (during transmission)
// |||| 1: No Data present in
transmit register
// |||| (transmission completed)
// |||+------ /CTS//RTS disable bit
// ||| 0: /CTS//RTS function
enabled
// ||| 1: /CTS//RTS function
disabled
// ||+------- Data output select bit
// || 0: TxD0 pin is CMOS output
// || 1: TxD0 pin is N-channel
open-drain
// || output
// |+-------- Must be fixed to '0'
// +--------- Must be fixed to '0'
// Setting UART0 transmit/receive control register 1 (UART mode)
u0c1 = 0x05;
//u0c1 = 0x01; // ---- X1X1
// |||+- TE Transmit enable bit
// ||| 0: Transmission disabled
// ||| 1: Transmission enabled
// ||+-- TI Transmit buffer empty flag
// || 0: Data present in transmit
buffer
register
// || 1: No data present in transmit
buffer
register
// |+--- RE Receive enable bit
// | 0: Reception disabled
// | 1: Reception enabled
// +---- RI Receive complete flag
// 0: No data present in
receive buffer
// 1: Data present in receive
buffer
// Setting UART0 transmit/receive control register 2 (UART mode)
ucon = 0x00; // -X0- ---X ????
// || +- UART0 transmit interrupt
cause select bit
// || 0: Transmit buffer empty
(TI=1)
// || 1: Transmission completed
(TXEPT=1)
// |+------- Must be fixed to '0'
// +-------- Separate /CTS//RTS bit
// 0: /CTS//RTS shared pin
// 1: /CTS//RTS separate pin
// Setting UART2 bit rate generator for 1200 baud (UART mode)
u0brg = 0x67; // REMARKS:
U0BRG=(Xin/(16*clock_select*Baud))-1
// For example:
// Xin = 16MHz
// clock_select = 1 (source=f8) <<== f8
beachten
// Baud = 1200 Baud rate
// => u0brg = 103d = 0x67 (actual baud = 1200)
// void setUART0Rxint(void)
s0ric = 0x01; // ---- XXXX
// ||||
// |||+-- Interupt priority level select
bit
// ||+--- Interupt priority level select
bit
// |+---- Interupt priority level select
bit
// | 000: Level 0 (interrupt disabled)
// | 001: Level 1
// | 010: Level 2
// | 011: Level 3
// | 100: Level 4
// | 101: Level 5
// | 110: Level 6
// | 111: Level 7
// +----- Interupt request bit
// 0: Interrupt not requested
// 1: Interrupt requested
}
// #############################################################
// Aufgerufen, durch Zeichenampfang an UART 0 (Party-Line RS485)
// #############################################################
void far INT_SCI_0_R (void)
{
unsigned char c;
ir_s0ric = 0;
if (u0c1 & 0x08) // check UART0 Receive Complete Flag
{ // if valid data is present
c = u0rbl;
if (cEmMrk == TRUE) // Wenn Mrk schon gesetzt ist dann raus,
return; // es koennte sich bei 2-Draht um eigene Daten
handeln !
if ( (cEmPtr < cEmBuffer) || (cEmPtr >= &cEmBuffer[LEN_EBUF]) )
cEmPtr = cEmBuffer;
switch (c)
{
case STX: cEtxMrk = FALSE;
cEmXor = 0;
cEmPtr = cEmBuffer;
*cEmPtr = c;
break;
case ETX: *cEmPtr = c;
cEtxMrk = TRUE;
break;
case EOT: *cEmPtr = c;
cEmMrk = TRUE;
break;
default: *cEmPtr = c;
if (!cEtxMrk)
cEmXor ^= c;
}//EndOfSwitch
cEmPtr++;
}
else // Falls Uebertragungsfehler
c = u0rbl;
} // EndOfInterrupt
void SendeRoutine (void)
{
//
// Wenn cSeMrk == 0 ist, steht nichts zu senden an
//
if ( cSeMrk == FALSE )
{
return; // SenderAus();
}
//
// Wenn cSeMrk == 1 ist, Daten aus Buffer senden
//
else if ( cSeMrk == 1 )
{
if (!(u0c1 & 0x02)) // Wait while data is present in
transmit
BUFFER
return;
if ((u0tbl = *cSePtr++) == EOT) // write new data to UART0 transmit
buffer
cSeMrk = 2;
return;
}
//
// Wenn cSeMrk == 2 ist, wurde das original EOT bereits uebergeben.
//
else if (cSeMrk == 2 )
{
if (!(u0c1 & 0x02)) // Wait while data is present in
transmit
BUFFER
return;
u0tbl = EOT;
cSeMrk = 3;
return;
}
//
// Wenn cSeMrk == 3 ist, wurde das original EOT bereit gesendet !
//
else if (cSeMrk == 3 )
{
if (!(u0c1 & 0x02)) // Wait while data is present in
transmit
BUFFER
return;
cSeMrk = 0;
cEmMrk = 0;
SenderAus();
}
}