PDA

View Full Version : خطا در برنامه سی (کمپایلر کدویزن)



usefiantm
یک شنبه 10 فروردین 1393, 00:55 صبح
سلام
این برنامه رو نوشتم ولی کدویزن سه تا Library error ازش میگیره:


#include <mega32a.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B
#endasm
#include <lcd.h>
#include <stdio.h>


#define columns 40
#define offset 50
#define space 6
#define SPEED 5
#define NOP #asm("nop")
#define DATA PORTA.0
#define CLOCK PORTA.1
#define STROBE PORTA.2

const char font[] = {
0X42,0X61,0X51,0X49,0X46,// 2
0X3E,0X51,0X49,0X45,0X3E,// 0
0X00,0X42,0X7F,0X40,0X00,// 1
0X18,0X14,0X12,0X7F,0X10,// 4
};

void scan(char negative);
void load(char *str);
void effect();

char text[]="2014";
char buffer[1000];
char display[columns];
int n;
void main(void)
{
char s;
DDRA=0xFF;
load(text);
while(1)
{
for(s=0;s<SPEED;s++)
scan(0);
effect();
}
}
//--------------------
void load(char *str)
{
int FontPosition,i,j=0;
while(*str != 0)
{
FontPosition=(int)((*str++)-32)*5;
for(i=0;i<5;i++)
buffer[j+i]=font[FontPosition+i];
j+=space;
}
}
//----------------------
void effect()
{
register char i;
for(i=0;i<columns;i++)
display[i]=display[i+1];
display[columns-1]=buffer[n];
n++;
if(n==(sizeof(text)*5)+offset)n=0;
}
//--------------------------
void scan(char negative)
{
char i,j,data;
for(j=0;j<8;j++){
STROBE=0;
CLOCK=1;
for(i=columns;i>0;i--){
data=display[i-1];
if(negative)
data=~display[i-1];
data=data>>j;
DATA=data & 0x01;
CLOCK=0;
NOP
NOP
CLOCK=1;
}
for(i=0;i<8;i++){
DATA=0;
if(i==j)
DATA=1;
CLOCK=0;
NOP
NOP
CLOCK=1;
}
STROBE=1;
NOP
NOP
STROBE=0;
}
}







برنامه رو به این شکل اصلاح کردم ارورها برطرف شدن ولی برنامه دیگه کار نمیکنه.اگه اساتید یه راهنمایی بکنند ممنون میشم.



#include <mega32a.h>


#define columns 40
#define offset 50
#define space 6
#define SPEED 5
#define NOP #asm("nop")
#define DATA PORTA.0
#define CLOCK PORTA.1
#define STROBE PORTA.2

const char font[] = {
0x42,0x61,0x51,0x49,0x46,// 2
0x3E,0x51,0x49,0x45,0x3E,// 0
0x00,0x42,0x7F,0x40,0x00,// 1
0x18,0x14,0x12,0x7F,0x10,// 4
};

char text[]="2014";
char buffer[1000];
char display[columns];
int n;

void scan(char negative);
void load(char *str);
void effect();

//----------------
void main(void)
{

char s;
//------------
//lcd_init(16);
//lcd_clear();

//-------------
DDRA=0xFF;
load(text);
while(1)
{
for(s=0;s<SPEED;s++)
scan(0);
effect();
}
}
//--------------------
void load(char *str)
{
int FontPosition,i,j=0;
while(*str != 0)
{
FontPosition=(int)((*str++)-32)*5;
for(i=0;i<5;i++)
buffer[j+i]=font[FontPosition+i];
j+=space;
}
}
//----------------------
void effect()
{
register char i;
for(i=0;i<columns;i++)
display[i]=display[i+1];
display[columns-1]=buffer[n];
n++;
if(n==(sizeof(text)*5)+offset)n=0;
}
//--------------------------
void scan(char negative)
{
char i,j,data;
for(j=0;j<8;j++){
STROBE=0;
CLOCK=1;
for(i=columns;i>0;i--){
data=display[i-1];
if(negative)
data=~display[i-1];
data=data>>j;
DATA=data & 0x01;
CLOCK=0;
NOP
NOP
CLOCK=1;
}
for(i=0;i<8;i++){
DATA=0;
if(i==j)
DATA=1;
CLOCK=0;
NOP
NOP
CLOCK=1;
}
STROBE=1;
NOP
NOP
STROBE=0;
}
}

one hacker alone
یک شنبه 10 فروردین 1393, 11:06 صبح
سلام
باید متن خطا رو بزارید تا بشه کمک کرد
شما پایین اومدید کتابخونه ها رو برداشتید
فک کنم مسیر کتابخونه ها یا پسوندشون تو این کامپایلر فرق کنه ( برای اطمینان یه پروژه ی خالی در حد مقداردهی یا چاپ کامپایل کنید)

usefiantm
یک شنبه 10 فروردین 1393, 12:31 عصر
ممنون از توجه شما.خطاها:

Library error: C:\cvavreval\lib\stdio.lib(304): a value of type 'flash unsigned int [5]' can't be assigned to an entity of type 'flash unsigned char *'
Library error: C:\cvavreval\lib\stdio.lib(310): a value of type 'flash unsigned int [4]' can't be assigned to an entity of type 'flash unsigned char *'
Library error: C:\cvavreval\lib\stdio.lib(1338): expression must be a pointer to a complete object type
من چون توی سخت افزار از ال سی دی استفاده نکردم (دات ماتریس).فکر کردم خطا مربوط به این خط:
.equ_lcd_port=0x1B
باشه ولی ظاهرا نیست.

one hacker alone
یک شنبه 10 فروردین 1393, 15:27 عصر
خطا بر میگرده به کامپایلر و ربطی به کد نداره
و چون شما در کد دوم هدرفایل ها رو برداشتید دیگه خطا نداده
برنامه شما یه تابع اصلی main داره
یه پروژه ی جدید باز کنید و فقط کتابخونه ی stdio رو include کنید بعد داخل main هم چیزی ننویسید سپس کامپایل کنید ببینید میشه یا نه؟ که احتمال خیلی زیاد نباید بشه اما اگه شد همین کد تون رو کپی کنید تو این پروژه ی جدید و کامپیایل کنید
اما اگه نشد نسخه ی جدید کامپایلر رو نصب کنید که اخرین نسخه اش در لینک زیر از سایت خودش هست
http://www.hpinfotech.ro/cvavr_download.html

usefiantm
یک شنبه 10 فروردین 1393, 18:54 عصر
....یه پروژه ی جدید باز کنید و فقط کتابخونه ی stdio رو include کنید بعد داخل main هم چیزی ننویسید سپس کامپایل کنید ببینید میشه یا نه؟ که احتمال خیلی زیاد نباید بشه اما اگه شد همین کد تون رو کپی کنید تو این پروژه ی جدید و کامپیایل کنید...

حق با شماست جناب one haker alone کتابخونه stdio رو کمپایل نمیکنه.دقیقا همون سه تا ارور رو گرفت.من نسخه جدید رو نصب و تست میکنم...

usefiantm
دوشنبه 11 فروردین 1393, 13:37 عصر
اقا دست شما درد نکنه با اخرین نسخه مشکل حل شد.فقط یه سوال از لحاظ برنامه برای طول اون text که میزارم محدودیت وجود داره؟بیشتر از نیم خط متن رو نمایش نمیده.

one hacker alone
دوشنبه 11 فروردین 1393, 13:44 عصر
خدا رو شکر
عرض شود که شما در برنامه نویسی که محدودیتی که قابل توجه باشه ندارید برای نمایش متن هم مونده LCD چی باشه اگه کاراکتری 16*2 باشه که تکلیف روشنه؛ شما 16 کاراکتر میتونید بنویسید اما معمولا از متن های متحرک استفاده میکنن یعنی شما یه رشته رو تعریف میکنید و میدید به lcd که البته یه کد باید براش بنویسید که تو هر پالسی که کریستال تولید میکنه یه حرکت انجام بشه رو کاراکتر ها تا متن به صورت حرکتی نمایش داده بشه
نتیجه:
شما باید بتونید تمام کاراکتر های روی ال سی دی رو روشن کنید و اگه بشه پس باید بتونید همه جای اون بنویسید اگه مشکلی داشته باشید ایراد از کد هست

usefiantm
دوشنبه 11 فروردین 1393, 15:52 عصر
از ال سی دی استفاده نمیکنم با ال ای دی یه دات ماتریس 40*8 درس کردم.این برنامه متن رو که از راست به چپ حرکت میده هیچ مشکلی نداره(تمام ال ای دی ها روشن میشن و حروف رو نمایش میدن).
کد حروف انگلیسی و اعداد رو کامل به برنامه اضافه کردم.ولی یه متن رو که بهش میدم فقط نصف خط اول رو نمایش میده و تکرار میکنه.میکرویی که استفاده میکنم 32کیلوبایت فلش و 2کیلو بایت رم داره(avr mga32).اگه از یه میکرو با رم بیشتراستفاده کنم مشکل حل میشه؟

one hacker alone
دوشنبه 11 فروردین 1393, 16:26 عصر
نباید مشکل از میکروکنترل باشه حتی atmega 8 هم کارتون رو را میندازه
مگه طول متنتون چقدره؟

usefiantm
دوشنبه 11 فروردین 1393, 16:58 عصر
حدودا 110 تا حرف رو بیشتر نمایش نمیده.با MEGA16 که 1کیلو رم داره تست کردم حین کمپایل خطای زیر رو میده:
Linker error: global RAM variables size: 1162 bytes is too large