Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic 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.

Register Log in

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
135
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
 

Jack// ani

Advanced Member level 3
Joined
Dec 2, 2004
Messages
759
Helped
106
Reputation
220
Reaction score
58
Trophy points
1,308
Activity points
5,018
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

Rooftop

Full Member level 2
Joined
Oct 28, 2004
Messages
135
Helped
4
Reputation
8
Reaction score
2
Trophy points
1,298
Activity points
1,241
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
 

echo47

Advanced Member level 5
Joined
Apr 7, 2002
Messages
3,942
Helped
636
Reputation
1,270
Reaction score
88
Trophy points
1,328
Location
USA
Activity points
33,183
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

Rooftop

Full Member level 2
Joined
Oct 28, 2004
Messages
135
Helped
4
Reputation
8
Reaction score
2
Trophy points
1,298
Activity points
1,241
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?:(
 

echo47

Advanced Member level 5
Joined
Apr 7, 2002
Messages
3,942
Helped
636
Reputation
1,270
Reaction score
88
Trophy points
1,328
Location
USA
Activity points
33,183
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

Rooftop

Full Member level 2
Joined
Oct 28, 2004
Messages
135
Helped
4
Reputation
8
Reaction score
2
Trophy points
1,298
Activity points
1,241
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
 

hr_rezaee

Advanced Member level 3
Joined
Oct 6, 2004
Messages
751
Helped
109
Reputation
218
Reaction score
24
Trophy points
1,298
Location
Iran-Mashhad
Activity points
4,036
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

Rooftop

Full Member level 2
Joined
Oct 28, 2004
Messages
135
Helped
4
Reputation
8
Reaction score
2
Trophy points
1,298
Activity points
1,241
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
 

gafar

Junior Member level 1
Joined
Jul 14, 2003
Messages
16
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Location
Brazil
Activity points
135
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.
Toggle Sidebar

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top