USART problem...

Go To Last Post
12 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

hello everyone, btw i have a problem on USART programming...i have no idea about why this program doesn't want to display setence "neXTGen USART transmit test.......complete "
on hyperterminal.....

do u know how to solve it??

/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : neXTGen
Version : 1.0
Date    : 8/5/2010
Author  : E-1
Company : E-1 Corp.
Comments : 
???


Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 11.059200 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 128
*****************************************************/

#include 

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm
#include 
#include 
#include 
#include 

//USART definition :
#define RXEN 4
#define TXEN 3
#define USBS 3
#define UCSZ0 1
#define UDRE 5
#define TXC 6
#define RXC 7
#define fosc 11059200 // Clock Speed
#define baud 19200
#define UBRR (fosc/16*baud)-1


//koneksi USART
//-------------------------------------------------------------------
void USART_init (unsigned int baudrate) 
{
 /*   
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x23;
*/
//baud rate
UBRRH = (unsigned char)(baudrate>>8);
UBRRL = (unsigned char)(baudrate);
UCSRA=0x00;
//tx-rx
 UCSRB=(1<<RXEN)|(1<<TXEN);
 //frame : 8 bit, 1 stop bit, no parity
 UCSRC = (0<<USBS)|(3<<UCSZ0);
}  
 
void USART_transmit(unsigned char value)
 {
while ( !( UCSRA & (1<<UDRE)) ) ;
UDR = value;

}

unsigned char USART_Receive( void )
{

while ( !(UCSRA & (1<<RXC)) );

return UDR;
}
//------------------------------------------------------------

void main(void)
{
// Declare your local variables here

USART_init(UBRR);
printf("neXTGen USART transmit test.......complete ");



//-------------------------------------------------------------------------------------------------
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=P State1=P State0=P 
PORTB=0x07;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x30;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1382.400 kHz
// Mode: Ph. correct PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

 /* from wizard-------------------------------------------------- 
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 19200
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x23;
 printf("test");
*/
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);
//--------------------------------------------------------------------------------------------------------------


while (1)
      {
      // Place your code here

      };
}
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

You printf the message before you've initialized the usart!

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0
#define fosc 11059200 // Clock Speed 

Most likely thing is this is not true.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

@clawson
actually that is the oscillator that i use for my mcu anyway....but i dont know if it is the problem or not....

btw i really appreciate it if there is someone who can make any corrections to my program so that it can work well.....thx...

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

What do you actually want to do?

You have initialised UCSRC incorrectly. CodeVision initialises the UART itself, but you commented it out.

/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : neXTGen
Version : 1.0
Date    : 8/5/2010
Author  : E-1
Company : E-1 Corp.
Comments :
???


Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 11.059200 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 128
*****************************************************/

#include 

// Alphanumeric LCD Module functions
#asm
    .equ __lcd_port = 0x1B	;PORTA
#endasm

#include 
#include 
#include 
#include 

//------------------------------------------------------------

void main(void)
{
    // Declare your local variables here

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 19200
    UCSRA = 0x00;
    UCSRB = 0x18;
    UCSRC = 0x86;
    UBRRH = 0x00;
    UBRRL = 0x23;

    printf("neXTGen USART transmit test.......complete ");

    // LCD module initialization
    lcd_init(16);
    lcd_putsf("Your LCD is ok");
    //--------------------------------------------------------------------------------------------------------------


    while (1) {
        // Place your code here

    };
}

The Wizard does all sorts of hard work for you. However since most of the initialisation is the power-up default values, I have removed it for clarity.

Are you sure you have a mega8535 ?
Are you really sure your AVR is running at 11.059MHz ?
Are you really sure that your LCD is wired correctly to PORTA ?
Is Hyperterminal set to 19200 baud ?

David.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

david.prentice wrote:
What do you actually want to do?

You have initialised UCSRC incorrectly. CodeVision initialises the UART itself, but you commented it out.

/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : neXTGen
Version : 1.0
Date    : 8/5/2010
Author  : E-1
Company : E-1 Corp.
Comments :
???


Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 11.059200 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 128
*****************************************************/

#include 

// Alphanumeric LCD Module functions
#asm
    .equ __lcd_port = 0x1B	;PORTA
#endasm

#include 
#include 
#include 
#include 

//------------------------------------------------------------

void main(void)
{
    // Declare your local variables here

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 19200
    UCSRA = 0x00;
    UCSRB = 0x18;
    UCSRC = 0x86;
    UBRRH = 0x00;
    UBRRL = 0x23;

    printf("neXTGen USART transmit test.......complete ");

    // LCD module initialization
    lcd_init(16);
    lcd_putsf("Your LCD is ok");
    //--------------------------------------------------------------------------------------------------------------


    while (1) {
        // Place your code here

    };
}

The Wizard does all sorts of hard work for you. However since most of the initialisation is the power-up default values, I have removed it for clarity.

Are you sure you have a mega8535 ?
Are you really sure your AVR is running at 11.059MHz ?
Are you really sure that your LCD is wired correctly to PORTA ?
Is Hyperterminal set to 19200 baud ?

David.

btw, it actually works if i use the code generated by codevision, but i don't know how to use it for transmit and receive data with that code, so i prefer using manual code i get from datasheet,,,maybe i ll be grateful if u can solve my problem that way....:)

*or maybe teach me how to use USART-generated code from codevision i just know how to initialize it :p

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Quote:

btw, it actually works if i use the code generated by codevision,

Ummm--why not just use that code from CodeVision?

The only thing is that using printf() masks a bit of constructing the string and putchar(). As you can see, the code is nothing but basic setup of the USART registers. You can compare and contrast to your datasheet code if you like--it is 5 lines. (Didja see the notes in the datasheet about examples being generic and not necessarily correct for your chip model?)

For a more generic example, try

    while (1) {

        putchar ('U');
        delay_ms (234); //optional
    }

and then proceed to do a string, and then ...

You can put lipstick on a pig, but it is still a pig.

I've never met a pig I didn't like, as long as you have some salt and pepper.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Read any C textbook. You use the functions like putchar() and printf(), getchar(), gets(), scanf().

IMHO, I would only use getchar() as an input function.

In other words you can use the UART very easily for input and output.

If you are mostly using the LCD, you can make putchar() write to the LCD. Obviously you cannot input from the LCD.

David.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

thx for the advice....
perhaps i will need some tutorial about how to use USART on microcontroller....
but do u know where i can get some tutorial about it? :)

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

In the tutorial forum??

John Samperi

Ampertronics Pty. Ltd.

www.ampertronics.com.au

* Electronic Design * Custom Products * Contract Assembly

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

There are tutorials on this very forum.

IMHO, you are better advised to just read a C textbook. Learn how to use printf() and putchar().
Learn how to show "Hello World" on Hyperterminal.

Most GCC tutorials like to complicate things. In your case, the initialisation is already done for you. You can use the regular putchar() straightaway. Please do not mix them up with any other USART functions.

At a later stage, you might ask the CodeWizard to write 'interrupt driven USART functions'.
You will be able to use putchar(), printf() etc in exactly the same way.

David.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Your formula is wrong.

#define UBRR (fosc/16*baud)-1

Should be

#define UBRR (fosc/(16*baud))-1