Serial communication of ATMega128

Hi all, Iam working on Atmega128 and STK500.Iam new to this. I need to transmit a character from controller.I have given the code below.

#include"iom128v.h" #include "io.h"

unsigned char data; unsigned int baud; unsigned int i; int transmit(unsigned char);

void USART0_Init( unsigned int baud) { UBRR0H=0x96; UBRR0L=0x00; UCSR0B=0x08; UCSR0C=0x06; } int transmit(unsigned char data) { PORTA=0x41; DDRA=0xFF; loop_until_bit_is_set(UCSR0A,UDRE); UDR0=data; return 0; } int main(void) { SREG=0x80; SPL=0x61; SPH=0x00; USART0_Init(9600); transmit('A'); return 0; } This code is working.PORTA outputs 41.Hyperterminal is not showing character A. Can anyone point out the mistake?


Reply to
Loading thread data ...

1) Are you sure you are outputting what you think? Look at the output on an oscilloscope - check the baud rate, number of stops and the parity (if used). 2) Are you sure hyperterminal is set up correctly with the right stop, start, baud etc? You are better off with Teraterm (free to download) because Hyperterminal is buggy. 3) Are you remembering to use an RS-232 level shifter and are not trying to drive the PC serial port with 5V and 0V? 4) Are you certain you have checked 1) and 2) as they are by far the most likely.
Reply to
Tom Lucas


I remmber having had a problem with the serial port and the Mega128 once. The SPI port for programming is on top of the Serial_0. Some external gates are necessary to resolve this conflict.


Ing.Buero R.Tschaggelar -
& commercial newsgroups -
Reply to
Rene Tschaggelar

Another thing to check is the state of the M103C fuse. It comes from the factory set to emulate the M103, and that often causes problems. Never used the M128 myself, though, so I'm not certain it's pertinent...



Reply to
Dave Hansen

Looks like your baud rate is programmed to the wrong value. UBBR0H should be the most significant byte of the divisor, and UBRR0L the least significant byte.

For example, if your CPU clock is 4 MHz, and your baudrate 9600, the divisor should be 4000000 / 16 / 9600 = 26.04, subtract one and round to get 25. Program 0 (MSB) into UBRR0H, and 25 (LSB) into UBRR0L.

I always use something like this (with FCLK defined to be CPU clock):

int ubrr = (FCLK / baud + 8) / 16 - 1;

UBRR0H = (ubrr > 8); UBRR0L = ubrr;

Reply to

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.