C 4 any Time
1.5K subscribers
282 photos
7 videos
38 files
53 links
آموزش زبان سی و نکات کلیدی آن
@C_4_any_Time
ادمین:
@Alma_Electronic

آموزشها به ترتیب اراعه شده لذا بهتره از ابتدای کانال مطالعه بشه

❗️انتشار اطلاعات فقط با ذکر منبع مجاز است !!!
Download Telegram
با استفاده از کد زیر میشه پروتکت خوندن برنامه در میکرو های STM32 رو از داخل برنامه فعال کرد

if(!FLASH_GetReadOutProtectionStatus())
{
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
while(1)delay_ms(1);
}
کدی ساده برای تبدل مقدار متغیر به رشته بر مبنای 16 یا هگز

static char * itoh (char * buf, uint8_t digits, uint16_t number){
for (buf[digits] = 0; digits--; number >>= 4)
{
buf[digits] = "0123456789ABCDEF"[number & 0x0F];
}
return buf;
}
Fix for add AVR & ARM Toolchain v2.0.exe
184.6 MB
ورژن جدید فایل فیکس مخصوص ادیتور محبوب EmBitz با قابلیت ابدیت کامپایلر های AVR و ARM و همچنین اضافه کردن EBlink V2.9 و از همه مهمتر قایلیت ایجاد پروژه برای محصولات ST با کتابخانه های HAL و LL
در این ورژن میکرو های سری F0 تا F7 و سری جدید H7 و همینطور L0 تا L5 و G0 و G4 و WB پشتیبانی میشوند
Fix for add AVR & ARM Toolchain v2.0

با توجه به اینکه این نسخه اول هست ممکنه مشکلاتی در اون باشه که در صورت مشاهده و گزارش دوستان رفع خواهد شد
برای استفاده از فایل فیکس باید ادیتور EmBitz رو از این لینک دانلود و نصب کنید فایل فیکس رو در دایرکتوری اصلی کپی کرده و اجرا کنید و اجازه کپی فایل های جدید رو روی فایل های قبلی بدید
کدی ساده برای تبدیل اعداد فلوت به رشته

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);
}
}
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]);
}
تابع فوق برای فیلتر کردن مقدار adc یا موارد مشابه مناسب هست
این فیلتر به نام MA یا Moving Average Filter شناخته میشود
با این تابع به راحتی میتونید چند کانال مختلف رو فیلتر کنید
ورودی تابع newValue مقدار خونده شده جدید و channel شماره کانال
خروجی تابع مقدار فیلتر شده
در این تابع مقدار خروجی با یه شیب بالا یا پایین میره و با هر ورودی که بهش بدید یه مقدار میتونید ازش داشته باشید نیازی به تعداد زیادی از نمونه های اندازه گرفته شده یا بافر نداره و حافظه رم کمتری اشغال میکنه

توجه داشته باشید برای استفاده از این فیلتر بهتره ازش در بازه های زمانی ثابت استفاده بشه برای مثال هر 1 میلی ثانیه یک بار
[Beginning_C][Ivar Horton].pdf
13.3 MB
آغاز C از مبتدی تا حرفه ای
نوشته ایور هورتون
فهرست اموزش های مخصوص زبان 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 و کاربرد ان
سوالی برای درک بیشتر اسراکچر ها و چیدمان اعضا
سوالی برای اموزش دستور شرط
با توجه به اینکه تلگرام کانال هایی را که برای مدت مشخصی غیر فعال بوده اند را private کرده ادرس لینک کانال حذف شده و برای استفاده مجدد ازش نیازمند پرداخت 320 دلار بود لذا با استفاده از پیشنهاد خوب اقای کینژاد تغییری جزیی در اسم و ادرس کانال مجددا لینک ها ویرایش شد و در اختیار شما عزیزان قرار گرفت

لطفا با ارایه سوالات و پیشنهادات خود در تکمیل شدن اطلاعات کانال همراه ما باشید
گاهی اوقات نیازه که یه اشاره گر به اشاره گر داشته باشیم
برای مثال
int main()
{
    int a = 5;
    int* ptr = &a;
    int** d_ptr = &ptr;

    printf("Value of var = %d\n", a);
    printf("Value of var using single pointer = %d\n", *ptr);
    printf("Value of var using double pointer = %d\n", **d_ptr);
  
    return 0;
}

خروجی تابع فوق میشه

Value of var = 5
Value of var using single pointer = 5
Value of var using double pointer =
5
یکی از قابلیت های جالب و بسیار کاربردی اما متاسفانه ناشناخته در زبان سی اشاره گر از نوع تابع هست
به کد زیر توجه کنید
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;
}
Turn Any Question to {Code}.

https://www.useblackbox.io/search
با توجه به اینکه ترکیب بیتی فرمت متغیر های فلوت به صورت باینری نیست لذا به راحتی نمیشه از این متغیر ها برای ارسال یا دریافت توسط یوارت یا واحد های ارتباطی متداول بایتی استفاده کرد برای این کار یکی از راحت ترین روش ها تفکیک متغیر به 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);
EmBitz_2.60.exe
99.2 MB
معرفی ورژن جدید ادیتور EmBitz v2.6
پشتیبانی از نسخه های مختلف ارم های شرکت های
Atmel
Infineon
NXP
PIC18
PIC32
dsPIC
Nordic
ST
Texas

همراه GDB debugger اختصاصی با امکانت بسیار کار بردی

با توجه به اینکه قابلیت پشتیبانی از کامپالیر های غیر از ARM در ورژن های بالاتر از 2 حذف شده دیگر امکان استفاده از این ادیتور برای میکرو های 8 بیتی مثل AVR و ... ممکن نیست
جهت استفاده از این ادیتور طبق اموزش های قبلی برای میکروهای 8 بیتی بهتر است از ورژن 1.11 استفاده شود
Fix for add AVR & ARM Toolchain v2.0.exe
184.6 MB
همونطوری که قبلا هم معرفی شده با استفاده از این افزونه میتونید کامپایلر GCC AVR رو به نسخه 1.11 اضافه کنید

روش نصب
xprintf.rar
5.7 KB
معرفی توابع xprintf که یک کتابخانه ورودی/خروجی رشته ای فشرده است.
این کتابخانه نوشته اقای چان بوده و برای میکروکنترلرهای کوچکی که حافظه برنامه کافی برای عملکرد printf معمولی ندارند ایده آل است.
همچنین توابع xprintf را می توان با گزینه های پیکربندی برای کاهش اندازه ماژول پیکربندی کرد.
حجم فلش مورد نیاز برای این کتابخانه در کرتکس M0 و در ساده ترین حالت 789 بایت و در صورت استفاده از متغیر های long long به حافظه 880 بایت و هم چینین در صورت استفاده از سویچ float حدود 1816 بایت خواهد بود یعنی به کمتر از 2 کیلو بایت فلش نیاز دارد.

منبع