C 4 any Time
Відкрити в Telegram
آموزش زبان سی و نکات کلیدی آن @C_4_any_Time ادمین: @Alma_Electronic آموزشها به ترتیب اراعه شده لذا بهتره از ابتدای کانال مطالعه بشه ❗️انتشار اطلاعات فقط با ذکر منبع مجاز است !!!
Показати більше1 614
Підписники
Немає даних24 години
Немає даних7 днів
Немає даних30 день
Архів дописів
1 614
تابعی ساده و بسیار بهینه برای محاسبه رادیکال
uint16_t sqrt32(uint32_t a) {
uint32_t rem = 0, root = 0;
for (int i = 32 / 2; i > 0; i--)
{
root <<= 1;
rem = (rem << 2) | (a >> (32 - 2));
a <<= 2;
if (root < rem)
{
rem -= root | 1;
root += 2;
}
}
return root >> 1;
}1 614
نمونه مثال و خروجی
xprintf("%d", 1234); /* "1234" */
xprintf("%6d,%3d%%", -200, 5); /* " -200, 5%" */
xprintf("%-6u", 100); /* "100 " */
xprintf("%ld", 12345678); /* "12345678" */
xprintf("%llu", 0x100000000); /* "4294967296" <XF_USE_LLI> */
xprintf("%lld", -1LL); /* "-1" <XF_USE_LLI> */
xprintf("%04x", 0xA3); /* "00a3" */
xprintf("%08lX", 0x123ABC); /* "00123ABC" */
xprintf("%016b", 0x550F); /* "0101010100001111" */
xprintf("%*d", 6, 100); /* " 100" */
xprintf("%s", "abcdefg"); /* "abcdefg" */
xprintf("%5s", "abc"); /* " abc" */
xprintf("%-5s", "abc"); /* "abc " */
xprintf("%.5s", "abcdefg"); /* "abcde" */
xprintf("%-5.2s", "abcdefg"); /* "ab " */
xprintf("%c", 'a'); /* "a" */
xprintf("%12f", 10.0); /* " 10.000000" <XF_USE_FP> */
xprintf("%.4E", 123.45678); /* "1.2346E+02" <XF_USE_FP> */1 614
معرفی توابع xprintf که یک کتابخانه ورودی/خروجی رشته ای فشرده است.
این کتابخانه نوشته اقای چان بوده و برای میکروکنترلرهای کوچکی که حافظه برنامه کافی برای عملکرد printf معمولی ندارند ایده آل است.
همچنین توابع xprintf را می توان با گزینه های پیکربندی برای کاهش اندازه ماژول پیکربندی کرد.
حجم فلش مورد نیاز برای این کتابخانه در کرتکس M0 و در ساده ترین حالت 789 بایت و در صورت استفاده از متغیر های long long به حافظه 880 بایت و هم چینین در صورت استفاده از سویچ float حدود 1816 بایت خواهد بود یعنی به کمتر از 2 کیلو بایت فلش نیاز دارد.
منبع
1 614
معرفی ورژن جدید ادیتور EmBitz v2.6
پشتیبانی از نسخه های مختلف ارم های شرکت های
Atmel
Infineon
NXP
PIC18
PIC32
dsPIC
Nordic
ST
Texas
,
1 614
با توجه به اینکه ترکیب بیتی فرمت متغیر های فلوت به صورت باینری نیست لذا به راحتی نمیشه از این متغیر ها برای ارسال یا دریافت توسط یوارت یا واحد های ارتباطی متداول بایتی استفاده کرد برای این کار یکی از راحت ترین روش ها تفکیک متغیر به 4 بایت هست
برای این منظور استفاده از اشاره گر ها میتواند بسیار مفید باشد این صورت که ادرس متغیر فلوت رو بعد از تبدیل به اشاره گر از نوع 8 بیت برابر متغیر 8 بیت کنیم
به کد زیر توجه کنید
TX_Buffer[0] = *((uint8_t *)&float_val );
TX_Buffer[1] = *((uint8_t *)&float_val + 1);
TX_Buffer[2] = *((uint8_t *)&float_val + 2);
TX_Buffer[3] = *((uint8_t *)&float_val + 3);1 614
یکی از قابلیت های جالب بسیار و کار بردی اما متاسفانه ناشناخته در زبان سی اشاره گر از نوع تابع هست
به کد زیر توجه کنید
void add(int a, int b) {
printf("Addition is %d\n", a+b);
}
void subtract(int a, int b) {
printf("Subtraction is %d\n", a-b);
}
void multiply(int a, int b) {
printf("Multiplication is %d\n", a*b);
}
int main()
{
void (*fun_ptr_arr[])(int, int) = {add, subtract, multiply};
unsigned int ch=2, a = 15, b = 10;
(*fun_ptr_arr[ch])(a, b);
return 0;
}
1 614
گاهی اوقات نیازه که یه اشاره گر به اشاره گر داشته باشیم
برای مثال
int main()
{
int a = 5;
int* ptr = &a;
int** d_ptr = &ptr;
printf("Value of var = %d\n", var);
printf("Value of var using single pointer = %d\n", *ptr2);
printf("Value of var using double pointer = %d\n", **ptr1);
return 0;
}
خروجی تابع فوق میشه
Value of var = 5
Value of var using single pointer = 5
Value of var using double pointer = 51 614
با توجه به اینکه تلگرام کانال هایی را که برای مدت مشخصی غیر فعال بوده اند را private کرده ادرس لینک کانال حذف شده و برای استفاده مجدد ازش نیازمند پرداخت 320 دلار بود لذا با استفاده از پیشنهاد خوب اقای کینژاد تغییری جزیی در اسم و ادرس کانال مجددا لینک ها ویرایش شد و در اختیار شما عزیزان قرار گرفت
لطفا با ارایه سوالات و پیشنهادات خود در تکمیل شدن اطلاعات کانال همراه ما باشید
1 614
فهرست اموزش های مخصوص ARM
معرفی کامپیالر gcc
معرفی ادیتور ساده و سبک embitz
شروع کار با ارم و ایجاد پروژه
مرتب کردن فایل ها و پوشه ها
ایجاد یک فایل h یا هدر در پروژه
روش دیفاین پینهای IO
معرفی رجیستر های پین های IO
دیتاشیت کلی میکرو کنترلر های سری stm32f103
اخرین ورژن درایور SPL یعنی STM32F10x_StdPeriph_Lib_V3.5.0
توضیحاتی در خصوص درایور SPL
نوشتن تابعی برای انیشیال GPIO
فعال کردن اتصال بخش های مختلف به منبع کلاک
نوشتن تابع delay
معرفی توابعی برای نوشتن GPIO
نوشتن تابعی برای تغییر وضعیت یا Toggle پین
معرفی تایمر ها
نوشتن تابعی برای تنظیم کلاک میکرو
شروع کار با بخش تایمر و نوشتن تابعی برای اینیشیال تایمر
شروع کار با یوزارت یا ارتباط سریال
بلوک دیاگرام واحد یوزارت
رجیستر های یوزارت
یوزر منوال مخصوص یوزارت
نوشتن تابعی برای انیشیال یوزارت
نوشتن تابع وقفه یوزارت
1 614
فهرست اموزش های مخصوص AVR
معرفی کامپیالر gcc
معرفی ادیتور ساده و سبک embitz
اموزش نصب ادیتور embitz و تنظیمات لازم
اموزش تنظیمات مخصوص تنظیمات کامپیالر gcc در ادیتور
شروع کار با ادیتور embitz و کامپایلر gcc
ایجاد پروژه AVR
اموزش کامپایل کردن پرژه
روش ایجاد فایل h یا هدر و اضافه کردن به پروژه
اموزش اصول نوشتن یک فایل h یا هدر
اموزش دیفاین پینها و بخش های مختلف سخت افزار
شروع نوشتن یک کد ساده در فایل main
اضافه کردن کتابخونه delay در پروژه های AVR
کار با تایمر ها
رجیستر های تایمر
بلوک دیاگرام تایمر های 16 بیتی
وقفه سراسری در AVR ها و اظافه کردن ماکرو های وقفه به کد
نوشتن تابع وقفه تایمر
1 614
فهرست اموزش های مخصوص زبان C
۵ مورد از دلایل اهمیت یادگیری برنامه نویسی
نکته هایی که میتونم برای بالابردن تخصص در برنامه نویسی اشاره کنم
پیشینه برنامه نویسی و زبان سی
برنامه نویسی ساختار یافته
دستورات پیش پردازنده
کلاس حافظه
متغیر ها تعریف و مقدار دهی
چنتا نکته در مورد سی
اصل نام گذاری متغیر ها در سی
عملگرها و انواع آن
تبدیل متغیر ها
ساختار تصميم if
ساختار تصميم switch
حلقه while
حلقه do...while
حلقه for
عملگر علامت سوال ؟
تعریف متغیر ها
تعریف و مقدار دهی رشته ها
دستور goto
دستور break
دستور continue
ثابت های Escape Sequences
توابع استاندارد سی
رشته ها در زبان سی
رشته_ های چند بعدی در زبان سی
تعریف و نوشتن توابع
دستور Return
رشته ها در ورودی توابع
تابع بازگشتی یا recursion
دامنه و طول عمر متغیرها
مثال برای درک بشتر نوشتن توابع
اشاره گرها
اشاره گرها در ورودی توابع
حافظه پویا در سی
چند مثال در خصوص حافظه های پویا و رشته ها
رشته های کاراکتری
دستکاری رشته در زبان C با استفاده از توابع کتابخانه
نمونه مثال های عملی در خصوص رشته های کاراکتری
استراکچر یا ساختار
استراکچر در استراکچر
انتقال ساختار به یک تابع
یونیونها
دسترسی به اعضا در یونیونها
فرق یونیونها و ساختارها
ارسال union به یک تابع
پیش پردازنده ها و ماکرو ها در سی
پیش پردازنده های Conditional Compilation
ماکرو های Predefined Macros
ماکرو هایی برای تغییر بیتی در پورت یا متغیر ها
توضیحاتی در خصوص کتابخانه اقای چان و نکات آموزشی آن
نکته های اموزشی در فایل integer.h کتابخانه فت اقای چان
کتابخانه xprintf اقای چان
تمرین برنامه نویسی c و نمونه سوال
دستور پیش پردازنده #pragma once
روش نصب کامپایلر GCC و ادیتور کدبلاک
نمونه سوال و تمرین برنامه نویسی
چند مثال برای ایجاد هرم و الگو با اعداد و کارکتر ها
تکنیک برنامه نویسی اشاره گر به تابع
معرفی کامپایلر GCC به صورت انلاین
استیت ماشین توضیح و نمونه کد
نمونه کد های مختلفی بر مبنای اموزش های قبلی
انسی سی و روند کامپایل در زبان سی
ادامه نمونه کد ها
معرفی لینک کامپایلر انلاین gcc
فایل maikfile و کاربرد ان
سوالی برای درک بیشتر اسراکچر ها و چیدمان اعضا
سوالی برای اموزش دستور شرط
1 614
تابع فوق برای فیلتر کردن مقدار adc یا موارد مشابه مناسب هست
این فیلتر به نام MA یا Moving Average Filter شناخته میشود
با این تابع به راحتی میتونید چند کانال مختلف رو فیلتر کنید
ورودی تابع newValue مقدار خونده شده جدید و channel شماره کانال
خروجی تابع مقدار فیلتر شده
در این تابع مقدار خروجی با یه شیب بالا یا پایین میره و با هر ورودی که بهش بدید یه مقدار میتونید ازش داشته باشید نیازی به تعداد زیادی از نمونه های اندازه گرفته شده یا بافر نداره و حافظه رم کمتری اشغال میکنه
توجه داشته باشید برای استفاده از این فیلتر بهتره ازش در بازه های زمانی ثابت استفاده بشه برای مثال هر 1 میلی ثانیه یک بار
1 614
uint16_t calc_filter (uint16_t newValue, uint8_t channel){
#define FILTER_LENGTH 32
#define MAX_CHANNEL 3
#define HYSTERSIS 0
static uint32_t Sum[MAX_CHANNEL];
static uint16_t Array[MAX_CHANNEL][FILTER_LENGTH];
static uint8_t Index[MAX_CHANNEL];
static uint16_t oldValue[MAX_CHANNEL];
Sum[channel] -= Array[channel][Index[channel]];
Array[channel][Index[channel]] = newValue;
Sum[channel] += newValue;
Index[channel]++;
if (Index[channel] >= FILTER_LENGTH)Index[channel] = 0;
newValue = Sum[channel] / FILTER_LENGTH;
if ((newValue > (oldValue[channel] + HYSTERSIS)) || (oldValue[channel] > (newValue + HYSTERSIS)))
{
oldValue[channel] = newValue;
}
return(oldValue[channel]);
}1 614
کدی ساده برای تبدیل اعداد فلوت به رشته
void reverse(char* str, int len){
int i = 0, j = len - 1, temp;
while (i < j)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++;
j--;
}
}
int itoa(int x, char str[], int d){
int i = 0;
while (x)
{
str[i++] = (x % 10) + '0';
x = x / 10;
}
while (i < d) str[i++] = '0';
reverse(str, i);
str[i] = '\0';
return i;
}
void ftoa(float n, char* res, int afterpoint){
int ipart = (int)n;
float fpart = n - (float)ipart;
int i = itoa(ipart, res, 1);
if (afterpoint != 0)
{
res[i] = '.';
fpart = fpart * pow(10, afterpoint);
itoa((int)fpart, res + i + 1, afterpoint);
}
}