Reply by dibosco March 30, 20032003-03-30
I've spent almost two days trying to make the serial transmit
interrupts working without any success! So, after crawling up several
walls, I thought I'd see if anyone can point out what I'm doing wrong.

What I have always come across with UARTs in the past is a flag that
indicates whether the transmit data register is empty. This would
appear to be the TDRE flag. It would also appear that this initiates
an interrupt and I'm guessing that this is the Transmit Complete
interrupt; ie vector 50.

However, even though TDRE flag gets set, I am not getting an
interrupt to vector 50.

I've set GPR12 thus:

asm (bfset #$700,X:GPR12);

If I try the other transmit interrupt and set GPR12 as follows:

asm (bfset #$7000,X:GPR12);

The program just gets stuck forever going into vector 51's address.

I have the follwing routine for writing data to an output buffer or
directly to the SCI data register.

void SendByte(char SByte)
{

unsigned int temp;

temp = SCI0_SCISR;
if ((temp & 0x8000) == 0x8000) // Check to see if the transmitter is
empty
{
SCI0_SCIDR = SByte; // Clear the TDRE flag
}
else
{
scTxBuf[InPtr] = SByte; // Transmitter is full, fill up an output
buffer
InPtr ++;
if (InPtr == TXBUFLEN)
InPtr = 0;
}
}

The above routine fills and output buffer that should get emptied by
the Tx Interrupt below:

#pragma interrupt
void Tx0Int(void)
{

unsigned int temp;

if (InPtr != OutPtr) // See if there's anything to transmit
{
SCI0_SCIDR = scTxBuf[OutPtr];
OutPtr ++;
if (OutPtr == TXBUFLEN)
OutPtr = 0;
}

}

So, once a byte is transmitted, the interrupt routine is called and if
there's some data in the transmitter it gets sent.

The problem being, the interrupt never gets called! This is a
technique I've used for fifteen years on a variety of processors from
8032, through 68k, AVRs, 80C166 etc etc with no problem!

The crux of the matter would appear to be the damn interrupt n.ever
getting called.

For completeness, here's the UART initialisation:

void InitUART()
{
// 19k2 baud rate
SCI0_SCIBR = 130;

SCI0_SCICR = 0x0AC;

// UART 0 Rx int lowest priority
asm (bfset #$0010,X:GPR13);
// UART 0 Tx int lowest priority
asm (bfset #$700,X:GPR12);

}

Cheers,

Rob.