Unusual USART behaviour on AVR AT90CAN128



Hi,

I have found some unusual USART behaviour when i was trying to send
characters from USART1 of my AT90CAN128 to the PC terminal. Below is
the code that i have been using for the same. The problem is, what i
am getting on my PC hyperterminal is some garbage. I did some
calculations and found that there was a difference of 128 between the
characters sent and the character received. For example, if i sent 0 i
received 128 and if i sent 10 i received 10+128 = 138.

The same code works well with the USART0. Also, i checked the
waveforms on my oscilloscope by probing on the controller pin(TXD1)
and on the transmit pins of MAX232 (before RS232). The patterns were
almost identical. What i was wondering is that whether my USART was
corrupt internally?

While on chip debugging with Atmel's JTAG ICE mkII, i found that the
USART's data register UDR1, in the IO register window, was still
showing zero even when i have put a breakpoint at the place where i
was assigning the data to the USART data register for transmitting.
Kindly, help me overcome this problem.

#include<avr/io.h>

#define F_CPU 16000000L // F_CPU = 16MHz
#define BAUD 9600 // Baudrate = 9600

void USART1_Init ()
{
/* Set baud rate */
UBRR1H = (unsigned char) (((F_CPU/(16L*BAUD))-1) >> 8);
UBRR1L = (unsigned char) ((F_CPU/(16L*BAUD))-1);

/* Set frame format: 8data, no parity & 1 stop bits */
UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1);

/* Enable transmitter and receiver */
UCSR1B = (0<<RXEN1) | (1<<TXEN1);
}

void USART1_Transmit(void )
{
while ( ! ( UCSR1A & (1<<UDRE1)))
;

UDR1 = trans_data ; // Place for breakpoint.
trans_data++;

if(trans_data >= 0x64)
trans_data = 0x00;
}


void main(void)
{

unsigned char trans_data = 0x00;

USART1_Init();

while(1)
USART1_Transmit();

}

.



Relevant Pages

  • Re: Please help with this.
    ... returns a CString. ... it also seems possible you will drop characters by ... >>> void CPSMDlg::OnOnCommMscomm1 ... >> // causes the OnComm event to NOT fire when a character is detected ...
    (microsoft.public.vc.mfc)
  • Re: without loop printing 1 to n
    ... int main ... void printrange ... from any other external name in the first six characters. ... underscore after the fifth character of this function name, ...
    (comp.lang.c)
  • Re: Seg fault + string manipulation
    ... int main (void) ... I think the printf version is stylistically ... only of printing characters and the control characters ...
    (comp.lang.c)
  • Re: sorting the input
    ... int pstrcmp(const void *p1, const void *p2) ... If the user enters the 1001 characters then program will crash or behave ...
    (comp.lang.c)