PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل با winavr(avrlib)



vahidasm
12-10-2012, 01:50
سلام دوستان عزیز
من یه پروژه میخوام انجام بدم با winavr حالا یه مشکلی برام بوجود اومده که مربوط میشه به کتابخونه avrlib
من با این کتابخونه ال سی دی کاراکتری رو راه انداختم همه چی درسته ولی وقتی یه چیزی میخوام بو ال سی دی بنویسم چرت و پرت مینویسه(تو پروتیوس)
مشکل کجاست؟؟

sadmonew
12-10-2012, 13:51
سلام مهندس
اون كتابخونه سالمه. خودم ازش استفاده كردم.
مهندس عملا مدارو ببندو تستش كن. تو پروتئوس ممكنه درست كار نكنه.

vahidasm
12-10-2012, 15:52
سلام آقای محمدی ممنون که جواب دادین
یه سوال دیگه ای که دارم اینه که آیه غیر از این avrlib تابخونه های دیگه ای سراغ دارین؟؟
ضمنا اگه ممکنه یه منبع خوب برای یادگیری وین ای وی آر بهم معرفی کنید ممنون میشم
بازم ممنون

vahidasm
16-10-2012, 14:54
سلامی دوباره
آقای محمدی من هنوز منتظرم ها!!

sadmonew
16-10-2012, 19:02
سلامی دوباره
آقای محمدی من هنوز منتظرم ها!!
سلام مهندس
اين سايتا رو ببين:
-WinAVR tool-set | WinAVR AVR-GCC Tutorial (You can see links before reply)
WinAVR : AVR-GCC for Windows (You can see links before reply)

vahidasm
06-11-2012, 02:35
سلامی دوباره مهندس محمدی
آقا من بدجوری گیر کردم رو مبدل آنالوگ به دیجیتال این کتابخونه
این برنامه رو ببینید:

#include <avr/io.h>

#include <util/delay.h>

#include <stdlib.h>

#include <string.h>

#include "lcd_lib.c"

#include "a2d.c"

int num;

char str[10];

int main()

{
cbi(DDRA, 3);

cbi(PORTA, 3);

DDRB=0xff;

a2dInit();

LCDinit();

a2dSetPrescaler(ADC_PRESCALE_DIV8);

a2dSetReference(ADC_REFERENCE_AREF);

a2dStartConvert();

while (1)
{
LCDclr();

num = a2dConvert8bit(ADC_CH_ADC3);

PORTB=num;


itoa(num, str, 10);

LCDstring(str,strlen(str));

_delay_ms(100);

PORTB=num;

}

return 0;

}




مشکل این برنامه کجاست که کامپایل میشه ولی حتی به صورت عملی هم کار نمیکنه؟؟
ضمنا مهندس اگه احیانا کتابخونه جدیدی برای آنالوگ به دیجیتال دارید ممنون میشم که برسونید
چون قبلا که با ال سی دی مشکل داشتم یه کتابخونه پیدا کردم که کارمو راه انداخت
ممنون

sadmonew
06-11-2012, 13:17
سلام مهندس
رو السيدي چي نشون ميده؟ اصلا چيزي نشون ميده؟ يا فقط مربع نشون ميده؟
با كدوم ورژن كامپايلش ميكني؟
تو محيط AVRstudio يا pn كامپايلش ميكني؟

vahidasm
06-11-2012, 13:22
سلام مهندس
رو ال سی دی چیزی نمایش داده نمیشه ولی وقتی همون مدار رو یه برنامه دیگه مثل شمارش اعداد براش مینویسم عین ساعت کار میکنه(فک نمیکنم سخت افزاری مشکل داشته باشه)
ورژن WinAVR-20100110
من با خود وین ای وی آر (programmer's Notepad)کامپایل میکنم مشکل داره؟

pooriya
06-11-2012, 15:04
سلام ببین این به دردت می خوره.
قبلا با این کتابخونه سنسور MQ2 را راه اندازی کردم و مشکلی نداشته.(البته با AVRSTUDIO)


#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd_lib.h"
#include "global.h"
#include "a2d.h"


#define F_CPU 1000000UL
const uint8_t LCDwelcomeln1[] PROGMEM="POORIA";


void program( uint8_t adc_result){

if (adc_result>180){

PORTD=0x3;
}

else {

PORTD=0;

};

}

int main(void)
{
uint8_t adc_result;
LCDinit();//init LCD bit, dual line, cursor right
LCDclr();//clears LCD
LCDcursorOFF();
a2dInit();
DDRA = 0x00;
DDRD = 0xFF;
// make sure pull-up resistors are turned off
PORTA = 0x00;
// set the a2d prescaler (clock division ratio)
// - a lower prescale setting will make the a2d converter go faster
// - a higher setting will make it go slower but the measurements
// will be more accurate
// - other allowed prescale values can be found in a2d.h
a2dSetPrescaler(ADC_PRESCALE_DIV8);

// set the a2d reference
// - the reference is the voltage against which a2d measurements are made
// - other allowed reference values can be found in a2d.h
a2dSetReference(ADC_REFERENCE_AVCC);
a2dSetChannel(0);
a2dStartConvert();

LCDGotoXY(1,0);
LCDstring("POORIA_A",8);
LCDGotoXY(1,1);
LCDstring("MAGID_BA",8);
_delay_ms(2000);
LCDclr();//clears LCD

while(1)
{

LCDGotoXY(0,0);
LCDstring("L ",8);
LCDGotoXY(8,0);
LCDstring("M",1);
LCDGotoXY(15,0);
LCDstring("D",1);

LCDGotoXY(0,1);
LCDprogressBar(a2dConvert8bit(0),255,16);
adc_result=a2dConvert8bit(0); // Read Analog value from channel-0
//LCDGotoXY(2,0);
//LCDWriteInt(adc_result,4); //Print the value in 4th column second line
program(adc_result);

_delay_ms(100);

}

}

vahidasm
06-11-2012, 16:07
سلام ببین این به دردت می خوره.
قبلا با این کتابخونه سنسور mq2 را راه اندازی کردم و مشکلی نداشته.(البته با avrstudio)


#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd_lib.h"
#include "global.h"
#include "a2d.h"


#define f_cpu 1000000ul
const uint8_t lcdwelcomeln1[] progmem="pooria";


void program( uint8_t adc_result){

if (adc_result>180){

portd=0x3;
}

else {

portd=0;

};

}

int main(void)
{
uint8_t adc_result;
lcdinit();//init lcd bit, dual line, cursor right
lcdclr();//clears lcd
lcdcursoroff();
a2dinit();
ddra = 0x00;
ddrd = 0xff;
// make sure pull-up resistors are turned off
porta = 0x00;
// set the a2d prescaler (clock division ratio)
// - a lower prescale setting will make the a2d converter go faster
// - a higher setting will make it go slower but the measurements
// will be more accurate
// - other allowed prescale values can be found in a2d.h
a2dsetprescaler(adc_prescale_div8);

// set the a2d reference
// - the reference is the voltage against which a2d measurements are made
// - other allowed reference values can be found in a2d.h
a2dsetreference(adc_reference_avcc);
a2dsetchannel(0);
a2dstartconvert();

lcdgotoxy(1,0);
lcdstring("pooria_a",8);
lcdgotoxy(1,1);
lcdstring("magid_ba",8);
_delay_ms(2000);
lcdclr();//clears lcd

while(1)
{

lcdgotoxy(0,0);
lcdstring("l ",8);
lcdgotoxy(8,0);
lcdstring("m",1);
lcdgotoxy(15,0);
lcdstring("d",1);

lcdgotoxy(0,1);
lcdprogressbar(a2dconvert8bit(0),255,16);
adc_result=a2dconvert8bit(0); // read analog value from channel-0
//lcdgotoxy(2,0);
//lcdwriteint(adc_result,4); //print the value in 4th column second line
program(adc_result);

_delay_ms(100);

}

}

مهندس شما اینو رو پروتیوس هم تونستید تست کنید؟؟

pooriya
06-11-2012, 17:59
بله مهندس مشکلی نداره
کل فایلو میزارم با پروتئوس.

vahidasm
06-11-2012, 23:26
ممنون مهندس
اتفاقا از همین یه سوال داشتم قبلا هم یه جای دیگه دیده بودم ولی نتونستم برنامشو تحلیل کنم
اون حالت گرافیکی شکل که روی ال سی دی نمایش داده میشه رو چطور ایجاد کردی؟؟
من تو برنامه نیگا کردم چیزی نفهمیدم
بازم تشکر آقا پوریا

pooriya
07-11-2012, 01:08
اون حالت فقط یکی از توابع کتابخونه lcd هست که با پر کردن پیکسل های lcd به صورت طولی عمل می کنه.اگه به تابعش نگاه کنید در lcd_lib.c همه چی مشخصه.
فقط باید در تنظیمات این تابع دقت داشته باشین که متغییر شما نباید بیشتر از 8 بیتی باشه.
و طول lcd تون را داخل تابع مشخص کنید.
در برنامه بالا adc در مد 8 بیتی پیکر بندی شده و مقدار خوانده شده توسط adc داخل این تابع قرار می گیره .


LCDprogressBar(a2dConvert8bit(0),255,16);
در تابع بالا 16 همان طول lcd
255 حداکثر مقدار متغییر(که گفتیم باید 8 بیتی باشه)
و a2dConvert8bit(0) مقدار خوانده شده از Adc .

vahidasm
08-11-2012, 03:40
سلام مهندس
آقا یه سوال دیگه پیش اومد
من برنامه ای که شما نوشتین رو بردم آنالیز کردم یکم دستکاری کردم
با قسمت ال سی دی بیشتر کار کردم و ....
از همه اینا جواب گرفتم ولی متاسفانه قسمت آنالوگ به دیجیتال باز هم گیر میده به یه سری چیزاش
حالا سوالم اینه که آیا winavr ای که من نصب کردم مشکل داره یا اینکه مشکل از برنامه یه چیز دیگس؟؟
ممنون
اینم برنامه ای که نوشتم:

#include <avr/io.h>

#include <util/delay.h>

#include "lcd_lib.c"

#include <stdlib.h>

#include <string.h>

#include "global.h"

#include "a2d.h"

#include <avr/pgmspace.h>

#define F_CPU 1000000UL

uint8_t a=0;

char str[3];

int main()
{
DDRA = 0x00;

LCDinit();

a2d init();

a2dSetPrescaler(ADC_PRESCALE_DIV8);

a2dSetReference(ADC_REFERENCE_AVCC);

a2dSetChannel(0);

a2dStartConvert();

while (1)
{
LCDclr();

a=a2dConvert8bit(0);

LCDGotoXY(0,0);

LCDstring("temp:",5);

LCDGotoXY(5,0);

LCDprogressBar(a,255,11);

_delay_ms(10);

itoa(a,str,10);

LCDGotoXY(0,1);

LCDstring(str,3);
}
}

ضمنا ارورهایی که میگیره به صورت زیره:


Compiling C: main.c
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o
In file included from lcd_lib.c:15,
from main.c:5:
lcd_lib.h:44:19: warning: extra tokens at end of #ifdef directive
lcd_lib.h:69:17: warning: extra tokens at end of #ifdef directive
In file included from main.c:11:
global.h:34:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
main.c:24: warning: function declaration isn't a prototype
main.c: In function 'main':
main.c:29: error: 'a2d' undeclared (first use in this function)
main.c:29: error: (Each undeclared identifier is reported only once
main.c:29: error: for each function it appears in.)
main.c:29: error: expected ';' before 'init'
main.c:47: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
main.c:59: warning: pointer targets in passing argument 1 of 'LCDstring' differ in signedness
make.exe: *** [main.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00

vahidasm
08-11-2012, 13:19
آقا ممنون درست شد.:wink:
فقط یه سوال باقی میمونه.
تابع زیر:

a2dSetChannel(0);

نشون میده که ما باید قیل از تبدیل مشخص کنیم که میخوایم از کدوم کانال نمونه برداری کنیم درسته؟؟
حالا اگه من بخوام از 3 یا 4 تا کانال با هم نمونه برداری کنم چطو میشه؟؟
ممنون

vahidasm
20-11-2012, 01:46
سلامی دیگر دوستان عزیز
آقا ما که هنوز جواب سوال قبلی رو نگرفتم
ولی یه سوال جدید برام پیش اومده



#include<avr/io.h>

#include<avr/interrupt.h>

#include<util/delay.h>


ISR(INT0_vect)
{
PORTA=!(PORTA);
}

int main()
{
DDRA=0xff;

PORTA=0x00;

sei();

while(1)
{

}
}


دوستان مکل این کد کجاست؟؟میخوام وقفه خارجی 0 رو راه بندازم ولی ناموفق بودم
ممنون

sadmonew
20-11-2012, 02:42
سلام مهندس
برنامه كامپايل نميشه يا درست اجرا نميشه؟
ظاهرا كه درست نوشته شده.

vahidasm
20-11-2012, 02:47
سلام مهندس
برنامه درست شد
با کلی سر و کله زدن بلاخره مشکل حل شد
اگه مشکلشو بگم شاید بخندید :mrgreen:
خلاصه میگم-مشکل این بود که رجیسترها رو مقدار دهی نکرده بودم
برنامه درست:


#include<avr/io.h>

#include<avr/interrupt.h>

#include<util/delay.h>


ISR(INT0_vect)
{
PORTA=!(PORTA);
}

int main()
{
DDRA=0xff;

PORTA=0x00;

GICR=0x40;

MCUCR=0x02;

GIFR=0x40;

sei();

while(1)
{

}
}


حالا غیر از این یه سوال برام پیش اومده
اونم اینه که من توبرنامه مشخص کردم که تمام پورت A تاگل شه
ولی تو پروتیوس که اجرا میکنم میبینم که فقط پایه 0 از پورت A تاگل میشه چرا؟؟؟؟؟؟

pooriya
20-11-2012, 10:56
سلام

مهندس به این صورت بنویس.


ISR(INT0_vect)
{
PORTA=~(PORTA);
}

vahidasm
22-11-2012, 00:53
سلام دوستان
یه سوال دیگه:

ISR(INT0_vect)

میدونید که برای اجرای روتین هر وقفه باید دستوری مثل بالا بنویسیم و بعد از اون به جای INT0_vect اسم وقفه مورد نظر رو بنویسیم
حالا سوالم اینه که من اگه بخوام از وقفه های دیگه ای مث سرریز تایمر و .... تو winavr استفاده کنم باید این اسم ها رو از کجا پیدا کنم؟؟
میشه یه لیستی چیزی در صورت امکان بذارید؟؟
ممنون

vahidasm
22-11-2012, 00:53
سلام دوستان
یه سوال دیگه:

ISR(INT0_vect)

میدونید که برای اجرای روتین هر وقفه باید دستوری مثل بالا بنویسیم و بعد از اون به جای INT0_vect اسم وقفه مورد نظر رو بنویسیم
حالا سوالم اینه که من اگه بخوام از وقفه های دیگه ای مث سرریز تایمر و .... تو winavr استفاده کنم باید این اسم ها رو از کجا پیدا کنم؟؟
میشه یه لیستی چیزی در صورت امکان بذارید؟؟
ممنون

sadmonew
22-11-2012, 01:18
سلام مهندس
مثلا اگه از ميكروي مگا 8 دارين استفاده ميكنيد فقط كافيه فايلي به اسم iom8.h رو باز كنيد.
اگه عبارت Interrupt vectors رو سرچ كنيد. به اطلاعاتي كه نياز دارين ميرسين.
فايل هدرو ميتونيد از مسير زير پيدا كنيد

C:\WinAVR-20100110\avr\include\avr

vahidasm
22-11-2012, 23:01
سلام دوستان
:mrgreen:
انگار مشکل من با این وقفه حل نشدنیه
دوستان برنامه زیر رو ببینید من با یه مشکل خیلی عجیبی گیر کردم


#include<avr/io.h>

#include<util/delay.h>

#include<avr/interrupt.h>

int count;

ISR(INT0_vect)
{
count++;
}


ISR(INT1_vect)
{

count--;
}



int main()
{

DDRC=0xff;

PORTC=0x0f;

GICR|=0xc0;

MCUCR=0x0a;

GIFR=0xc0;

sei();

while(1)

{
PORTC=count;
}
}


دوستان داخل روتین های وقفه که داریم به هیچ عنوان متغیرها تغییر نمیکنه
ولی با دستورهای پورت کار میکنه مثلا PORTC++ به اندازه یه واحد مقدار پورت سی رو افزایش میده ولی متغیر رو نه
دلیل خاصی داره؟؟

sadmonew
23-11-2012, 01:47
سلام مهندس
دستور داخل حلقه while رو به اين صورت بنويس:


PORTC |= count;

vahidasm
23-11-2012, 02:29
سلام مهندس
ممنون بابت پاسخ هاتون

این کار رو هم انجام داده بودم ولی نشد

ولی این مشکل همین الان حل شد به صورت زیر:

باید متغیر count رو از نوع volatile تعریف میکردم طبق صحبتهای گفته شده در این لینک (You can see links before reply)
حالا من خودم هم نمیدونم داستان این volatile چیه چون تا حالا نشنیده بودم
میدونید داستانش چیه ؟؟؟

sadmonew
23-11-2012, 02:34
مهندس حالا بيا متغير رو به اين صورت تعريف كن:


static unsigned char count=0;

vahidasm
23-11-2012, 02:54
بله مهندس این کار رو کردم من هم استاتیک و هم volatile تعریف کردم که درست شد پست قبلی ام رو هم ویرایش کردم
داستان اینا چیه ؟؟
چه فرقی با متغیرهای معمولی داره؟؟

KHM
23-11-2012, 12:28
دادا volatile برا متغیرهایی استفاده میشه که سریع عوض میشن یا مثلآ از پروتکل ارتباطی از جمله usart دریافت میشن..و احتمال از دست رفتن اطلاعات وجود داره...
بدون volatile میکرو متغیر ها رو بهینه میکنه خودش..ولی وقتی متغیری از نوع volatile باشه، دیگه میکرو باهاش کاری نداره و همونجوری که هست نگه داشته میشه...
ولی دادا اینجا دلیلی نداره که از این نوع تعریف یشه..
حالا یه چنتا کار کن ببین بدون volatile هم کار میکنه یا نه...
واسه پایه وقفه ها مقاومت pull up در حد 1k بذار..
تو روتین وقفه ات اینجوری بنویس که وقتی وارد وقفه شد(یعنی پایه 1بار صفر شده) در حد مثلآ 30ms صبر کنه و دوباره پایه رو چک کنه..اگه هنوز صفر بود مقدار متغیر رو افزایش یا کاهش بده...این برا جلوگیری از نویزه...

البته قبل همه ی اینها اینو امتحان کن شاید جواب بده ولی بعدش برا اینکه برنامه ات بهتر باشه حتمآ بالایی ها رو انجام بده:
بعد از دستورات count++ یا count-- یه وقفه ی کوچیک بذار...همو در حد چند میلی ثانیه...ببین چی میشه.

معمولآ اینجوری هست که اول روتین وقفه، وقفه ها رو غیر فعال میکنن و آخر روتینش دوباره وقفه ها رو فعال میکنن..(با cli )
موفق باشی دادا

pooriya
23-11-2012, 12:33
سلام
ببین مهندس اصولش اینه که مخصوصا اگر متغییر رو داخا توابع وقفه داری استفاده می کنی از نوع volatile معرفی کنی.چون متغییر شما هم داخل توابع وقفه و هم داخل تابع اصلی استفاده شده(متغییر از نوع عمومی) وقتی برنامتون رو کامپایل می کنید برای بهینه سازی کامپایلر تغییراتی تو برنامه ایجاد می کنه و تعریف متغییر به صورت volatile باعث می شه از دخل و تصرف کامپایلر روی متغییر مورد نظر جلوگیری بشه .(این تعریف سادش بود)
static ( اختصاص فضای ثابت در رم و نگاه داشتن مقدار رجیستر حین فراخوانی های مختلف یک تابع ) فقط مخصوص متغیر های محلی

vahidasm
23-11-2012, 13:57
سلام دوستان گلم ممنون بابت پاسخ هاتون

دادا volatile برا متغیرهایی استفاده میشه که سریع عوض میشن یا مثلآ از پروتکل ارتباطی از جمله usart دریافت میشن..و احتمال از دست رفتن اطلاعات وجود داره...
بدون volatile میکرو متغیر ها رو بهینه میکنه خودش..ولی وقتی متغیری از نوع volatile باشه، دیگه میکرو باهاش کاری نداره و همونجوری که هست نگه داشته میشه...
ولی دادا اینجا دلیلی نداره که از این نوع تعریف یشه..
حالا یه چنتا کار کن ببین بدون volatile هم کار میکنه یا نه...
واسه پایه وقفه ها مقاومت pull up در حد 1k بذار..
تو روتین وقفه ات اینجوری بنویس که وقتی وارد وقفه شد(یعنی پایه 1بار صفر شده) در حد مثلآ 30ms صبر کنه و دوباره پایه رو چک کنه..اگه هنوز صفر بود مقدار متغیر رو افزایش یا کاهش بده...این برا جلوگیری از نویزه...

البته قبل همه ی اینها اینو امتحان کن شاید جواب بده ولی بعدش برا اینکه برنامه ات بهتر باشه حتمآ بالایی ها رو انجام بده:
بعد از دستورات count++ یا count-- یه وقفه ی کوچیک بذار...همو در حد چند میلی ثانیه...ببین چی میشه.

معمولآ اینجوری هست که اول روتین وقفه، وقفه ها رو غیر فعال میکنن و آخر روتینش دوباره وقفه ها رو فعال میکنن..(با cli )
موفق باشی دادا
دادا دیشب نمیدونی چه کارایی نکردم که این متغیر بدون volatile تغییر کنه ولی نکرد که نکرد :mrgreen:
یعنی تو وین ای وی آر اگه خودمو بکشم هم نمیتونم بدون volatile و با static این برنامه رو بنویسم:mrgreen:
خلاصه دمت گرم

همچنین تشکر از شما آقا پوریا و آقا صادق
من حالا حالاها با این تاپیک کار دارم :mrgreen:
بازم مزاحم میشم

vahidasm
12-01-2013, 18:33
سلام دوستان
نگفتم من با این تاپیک حالا حالاها کار دارم؟؟ :mrgreen:

آقا یه مشکلی پیش اومده

میخوام با استفاده از کتابخونه uart چندتا عدد رو بفرستم رو پورت سریال
text رو راحت میتونم بفرستم و کاملا هم جواب گرفتم ولی عدد رو نمیتونم بفرستم



/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */
extern void uart1_init(unsigned int baudrate);
/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */
extern unsigned int uart1_getc(void);
/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */
extern void uart1_putc(unsigned char data);
/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */
extern void uart1_puts(const char *s );
/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */
extern void uart1_puts_p(const char *s );
/** @brief Macro to automatically put a string constant into program memory */
#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
/** @brief Return number of bytes waiting in the receive buffer */
extern int uart1_available(void);
/** @brief Flush bytes waiting in receive buffer */
extern void uart1_flush(void);


این توابعی هستن که تو این کتابخونه وجود دارن
خود کتابخونه ها رو هم ضمیمه میکنم ببینید
من خودم از putc استفاده کردم نشد ولی به را حتی با استفاده از puts میتونم کلمه ok رو رو پورت سریال بفرستم
ممنون میشم دوستان کمک کنن
ضمنا اعدادی که میخوام رو پورت سریال بفرستم از نوع integer هستن

sadmonew
12-01-2013, 21:46
سلام مهندس
از این تابع استفاده کنید:


char str[9];

void ChTostr(unsigned int x,char b)
{
unsigned int t,m,count;
unsigned char z=0,b_tmp;
b_tmp = b;
b--;
for (b;b>0;b--)
{
switch(b){
case 0: t=1;
break;
case 1: t=10;
break;
case 2: t=100;
break;
case 3: t=1000;
break;
case 4: t=10000;
break;
case 5: t=100000;
break;
case 6: t=1000000;
break;
}
m=x/t;
str[z]=m+0x30;
x=x-(t*m);
z++;
}
str[z]=x+0x30;
for(count=0;count<b_tmp;count++){
uart1_putc(str[count]);
}
}
به این صورت استفاده کنید:


ChTostr(23653,5);
پارامتر اول عددی که میخواین تبدیل کنید و پارامتر دوم تعداد ارقام عدد مورد نظره.

vahidasm
12-01-2013, 23:26
سلام خیلی ممنون مهندس
این کد خییییییییییییییییییییییلی کمک کرد