Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

string.h in C for AVR: error saying too long character const

Status
Not open for further replies.

Rooftop

Full Member level 2
Joined
Oct 28, 2004
Messages
134
Helped
4
Reputation
8
Reaction score
2
Trophy points
1,298
Activity points
1,241
i2c_init() atmega8535

hi all, i have a little problem here with some code using C for AVR

#include<string.h>
char mychar[30];
strcpy(mychar,'LOOONG CHARACTER');

it said some error like character constant is too long. I'm using Codevision, please help me because when i am using Keill(for 8051) it works well although i need to change ' to " . Please help me, because this is my first project using AVR ATMEGA8535.

when i using

#include<string.h>
char mychar[30];
strcpy(mychar,'LO');

it works.Please tell me how to do it for more than two characters


Really thanks

Best regards
 

string.h in C for AVR

Try this...

const char hello[] = "Hello World";

instead of copying the string to the array, do it directly!!
 

    Rooftop

    Points: 2
    Helpful Answer Positive Rating
Re: string.h in C for AVR

it still didn't works...

i just want to make a string as passing parameter but it looks like it didn't work as i expected although i can do that in keil.
this is my default code:

Chip type : ATmega8535
Program type : Application
Clock frequency : 11,059200 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*********************************************/

#include <mega8535.h>
#include <string.h>

// I2C Bus functions
#asm
.equ __i2c_port=0x15
.equ __sda_bit=0
.equ __scl_bit=1
#endasm
#include <i2c.h>
#include <string.h>

// Declare your global variables here
#define RS PORTA.1
#define RW PORTA.3
#define EN PORTA.5
#define DATA PORTB
#define Busy PINB.7

void send(void);
void wait_LCD(void);
void clear_LCD(void);
void LCD_init(void);
void print_LCD(void);


void send()
{
EN = 1;
EN = 0;
}


void clear_LCD()
{
RS = 0;
DATA = 0x01;
send();
wait_LCD();
}


void wait_LCD()
{
do
{
EN = 0;
RS = 0;
RW = 1;
DDRB.7 = 0;
EN = 1;
}while(Busy);
EN = 0;
RW = 0;
DDRB.7 = 1;

}


void LCD_init()
{
RS = 0;
DATA = 0x38;
send();
wait_LCD();
RS = 0;
DATA = 0x0E;
send();
wait_LCD();
RS = 0;
DATA = 0x06;
send();
wait_LCD();
}

void print_LCD()
{
RS = 1;
DATA = 'I';
send();
wait_LCD();
}

void main(void)
{

// Declare your local variables here

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

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

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

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

// 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: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=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;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();
LCD_init();
clear_LCD();

while (1)
{
// Place your code here
print_LCD();
};
}

this code is working...
and when i want to change the print_LCD() to be:

void print_LCD(char mychar[]);
void print_LCD(char mychar[])
{
unsigned int i;
RS = 1;
for(i=0;i<=strlen(mychar)-1;i++)
{
DATA = mychar;
send();
wait_LCD();
}
}

and change the main program a little:

char mychar[20];
strcpy(mychar,'HELLO WORLD');
while(1)
{
print_LCD(mychar);
}


it gives me the error what i mention above. Thanks for your answer and please... i still need your help.

Best Regards
 

Re: string.h in C for AVR

strcpy(mychar,'LOOONG CHARACTER');
That's wrong, because strcpy expects a string. Use "LOOONG CHARACTER" instead.
It's also wrong because 'LOOONG CHARACTER' is an illegal length character constant.

strcpy(mychar,'HELLO WORLD');
Same problem. Use "HELLO WORLD" instead.

strcpy(mychar,'LO');
Same problem. Use "LO" instead.
'LO' is a legal character constant, so your compiler didn't emit an error message, but you are still passing the wrong thing to strcpy.

Your long source code is hard to read. Please edit your message and insert [code] ..... [/code] tags around it so we can see your indenting.
 

    Rooftop

    Points: 2
    Helpful Answer Positive Rating
Re: string.h in C for AVR

Code:
#include <mega8535.h>    
#include <string.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x15
   .equ __sda_bit=0
   .equ __scl_bit=1
#endasm
#include <i2c.h>  
#include <string.h>

// Declare your global variables here
#define RS PORTA.1
#define RW PORTA.3
#define EN PORTA.5
#define DATA PORTB
#define Busy PINB.7

void send(void);
void wait_LCD(void);
void clear_LCD(void);      
void LCD_init(void);                
void print_LCD(char mychar[]);


void send()
{
        EN = 1;
        EN = 0;
}


void clear_LCD()
{
        RS = 0;
        DATA = 0x01;
        send();
        wait_LCD();
}


void wait_LCD()
{
        do
        {
                EN = 0;
                RS = 0;
                RW = 1;
                DDRB.7 = 0;             
                EN = 1;
        }while(Busy);
        EN = 0;
        RW = 0;
        DDRB.7 = 1;                     
        
}


void LCD_init()
{
        RS = 0;	
	DATA = 0x38;
	send();
	wait_LCD();
	RS = 0;
	DATA = 0x0E;
	send();
	wait_LCD();
	RS = 0;
	DATA = 0x06;
	send();
	wait_LCD();
}

void print_LCD(char mychar[])
{
	unsigned int i;
        RS = 1;
        for(i=0;i<=strlen(mychar)-1;i++)
        {
        	DATA = mychar[i];
        	send();
        	wait_LCD();
	}
}

void main(void)
{                                   
//char mychar[20];
// Declare your local variables here

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

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

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

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

// 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: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=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;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();
LCD_init();
clear_LCD();

while (1)
      {         
      char mychar[100];       
      // Place your code here 
      strcpy(mychar,"HELLO WORLD"); 
      print_LCD(mychar);
      };
}

it still didn't work, now the compiler said that the parameter(mychar) incompatible with the declaration. Although i have tried this code in my AT89S52 (keil) and it works fine.What is the difference?:(
 

string.h in C for AVR

That's much easier to read.

I don't immediately see the culprit, however I'm not familiar with your particular compiler.

I see mychar used several places. Which line did it complain about?

You used mychar[] in two places. You might try changing them to *mychar to see if the compiler becomes happier.

You included string.h twice. That shouldn't hurt, but who knows.
 

    Rooftop

    Points: 2
    Helpful Answer Positive Rating
Re: string.h in C for AVR

it still didn't work but i really say thanks for your help. May i know what kind of compiler did you use?
Thanks a lot for your help once again


Best regards
 

string.h in C for AVR

Are you using codevision ?
if it is , use LCD function of codevision it is better.
use
char mychar[]="HELLO WORLD";
 

    Rooftop

    Points: 2
    Helpful Answer Positive Rating
Re: string.h in C for AVR

Thanks for your information. I know that it will works if i use the LCD function. But it looks like the LCD is in 4 bit mode and i now trying to use 8 bit mode. Anyway this is my first experiment with avr so i want to understand the io better.
Thanks for all of your help.
If someone know my mistake please correct me.

Best regards
 

Re: string.h in C for AVR

Hi,
I haved the same problem, did your program worked ?
If yes, please send the source file.
Regards.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top