loading...

آموزش برنامه نویسی


وقتی ماها می خواستیم برنامه نویسی یاد بگیرم یادم می آید انقد سخت می شد منبع پیدا کرد که همون منبع رو روی چشممون می ذاشتیم و برای فهمیدنش کلی سعی و خطا می کردیم تا اون زبان رو درکش کنیم....

بگذریم، بهتره اینجوری این نوشته رو شروع کنم...
بعد از چند سالی که تو بازار کار وقت گذروندن به این نتیجه رسیدم که ما برنامه نویس خیلی زیاد داریم، اما برنامه نویس خوب واقعا کم پیدا میشه. شاید بد نباشه از دیدگاه خودم دلایل رو ذکر کنم.

1- همیشه وقتی می بینم آدما تازه میخوان برنامه نویسی رو شروع کنن دنبال یه زبان می گردن و توی هزار توی اینترنت فقط می گردن که چه زبانی خوبه و یکی رو انتخاب می کنن.
جواب من به این دسته : بهتره دنبال این باشی که چه نیازی رو میخوای برطرف کنی و تازه قبل از اون بگردی دنبال اینکه خود کلمه برنامه نویسی یعنی چی و یه مقداری وقت صرف خوندن الگوریتم ها بکنیم...
یه برنامه نویس خوب برنامه نویسی هستش که الگوریتم نویسی بلد باشه نه کد نویسی....

2- فیلم های آموزشی خوب هستند اما همیشه می بینم یه رویه رو از توی این فیلم ها انتخاب می کنند و همیشه طبق اون جلو می رند... بهتره بدونیم فیلم های آموزشی فقط همون فیلم آموزشی هستند و دارند زبان رو به ما یاد می دند نه کد نویسی درست ...
بهتره پروژه های بازی که توی دنیای اینترنت هست رو باز کنید و اونها رو نگاه کنید...

3- توی اغلب شرکت هایی که کار می کنم بدترین چیزی رو که دیدم اینه که برنامه نویس هایی که تجربه کم دارند برنامه نویس های با تجربه تر رو زیر فشار می ذارند... بهتره بجای این کار در اول راه بیشتر به خودمون فشار بیاریم تا اونا...

شاید عکس کاور مطلب کاملا مفهوم باشه که می خوام در مورد چه چیزی صحبت کنم...

بیایید از همین الان به خودمون قول بدیم هر روز بجای یادگیری سینتکس های مختلف، در مورد الگوریتم ها و چیز هایی که مرتبط می شه با اینکه من قدمی مثبت در راه کد نویسی بردارم وقت بذاریم...


در کل سه تایمر/کانتر به نام‌های "تایمرصفر ، تایمر‌یک و تیامردو " داریم که صفر و یک هشت بیتی هستند و تایمر‌یک ۱۶ بیتی.

رجیستر‌هایی که باید بشناسید

TCNTn: Timer / Counter Register

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

TOVn: Timer Overflow Flag

هر تایمر فلگ سرریز داره که وقتی تایمر سرریز میکنه ،یا وقتی شمارنده به تهش میرسه ، این فلگ ست میشه.

TCCRn : Timer Counter Control Register

این رجیستر برای تنظیم حالت های تایمر/کانتر استفاده میشه.

OCRn : Output Compare Register

مقدار داخل این رجیستر با شمارنده مقایسه میشه وقتی برابر باشند فلگ OCFn ست میشه.

 


تایمر صفر

در ادامه تایمر صفر رو بررسی می‌کنیم. اول باید رجیستر های اساسی تایمر صفر رو درک کنیم.

TCNT0: Timer / Counter Register 0

یک رجیستر هشت بیتی که با هرپالس یکی بهش اضافه می‌شه.که بهش شمارنده می‌گیم.

TCCR0: Timer / Counter Control register 0

یک رجیستر هشت بیتی برای تنظیم حالت و منبع کلاک

Bit 7- FOC0: Force compare match

بیت هفتم ، تنها بیتی که هنگام تولید موج استفاده می‌شود، را می‌نویسد. نوشتن یک در این بیت باعث میشود که تولید کننده موج مانند زمانی عمل کند که مقایسه انجام شده.

Bit 6, 3 - WGM00, WGM01: Waveform Generation ModeBit 6, 3 - WGM00, WGM01: Waveform Generation Mode

Bit 6, 3 - WGM00, WGM01: Waveform Generation Mode

حالت‌های عملکرد تایمر با بیت سوم و ششم این رجیستر طبق جدول بالا مشخص می‌شوند.

  • حالت نرمال : با رسیدن شمارنده به ۲۵۵ فلگ سرریز ست می‌شود.
  • حالت ctc : با رسیدن شمارنده به مقدار مقایسه شونده وقعه فعال می‌شود و شمارنده نیز صفر می‌شود.
  • حالت PWM : توضیح قسمت های بعدی ...
  • حالت fast PWM

Bit 5:4 - COM01:00: Compare Output Mode

این دو بیت تعیین کننده حالت تولید‌کننده شکل‌موج هستند.

Bit 2:0 - CS02:CS00: Clock Source Select

این سه بیت برای انتخاب منبع کلاک استفاده می‌شوند. وقتی مقدار سه بیت صفر باشد تایمر متوقف می‌شود.

ولی بعد از ست کردن مقدار بین ۲ تا ۵ باینری با pre-scaler شروع به تولید کلاک می‌کنه و شمارنده عددش رو اضافه می‌کنه در هر سیکل.

تعیین کلاکتعیین کلاک

خب تصویر بالا نیاز به توضیح نداره از مقدار ۲ باینری تا ۵ باینری کلاک رو تقسیم بر عدد سمت راستش میکنه.

 

TIFR: Timer Counter Interrupt Flag register

رجیستر فلگ وقفه تایمر/کانتر

Bit 0 - TOV0: Timer0 Overflow flag

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

Bit 1 - OCF0: Timer0 Output Compare flag

فلگ خروجی مقایسه : وقتی مقدار شمارنده و مقایسه شونده برابر شوند این بیت یک در غیر اینصورت صفر می‌شود.

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

Bit 2 - TOV1: Timer1 Overflow flag

Bit 3 - OCF1B: Timer1 Output Compare B match flag

Bit 4 - OCF1A: Timer1 Output Compare A match flag

Bit 5 - ICF1: Input Capture flag

Bit 6 - TOV2: Timer2 Overflow flag

Bit 7 - OCF2: Timer2 Output Compare match flag

 


سرریز در تایمر صفر

درحالت نرمال : وقتی شمارنده سرریز می‌شود، یعنی مثلا از صفر به ۲۵۵ می‌رود، فلگ TOV0 ست می‌شود.توجه کنید که مقدار شمارنده بصورت خودکار صفر نمی‌شود و باید بصورت دستی این کار را انجام دهیم.

مقدار شمارنده بر اثر زمانمقدار شمارنده بر اثر زمان

ساخت تاخیر با اسفاده از تایمر صفر

مراحل برنامه نویسی :

  1. مقدار اولیه TCNT0 را مشخص کنیم. مثلا 0x25
  2. برای حالت نرمال و حالت pre-scalar کلاک ، به رجیستر TCCR0 مقدار می‌دهیم. به محض مقدار دهی به این رجیستر ، تایمر/کانتر شروع به شمارش می‌کند.
  3. تایمر به شمارش ادامه می‌دهد ، پس برای کنترل سرریز مقدار TOVO رو نظارت میکنیم که وقتی مقدار یک بگیره یعنی سرریز رخ داده.
  4. توقف تایمر با مقدار دهی صفر به TCCR0.
  5. پاک کردن فلگ TOV0. برای پاک کردن فلگ ما باید مقدار یک در این بیت بریزیم .
  6. برگشت به تابع main.

برنامه‌ی وقته با تایمر

#include <avr/io.h>
void T0delay();
int main(void){
	DDRB = 0xFF;		/* PORTB as output*/
    	while(1){  		/* Repeat forever*/
		PORTB=0x55;
		T0delay();  	/* Give some delay */
		PORTB=0xAA;
		T0delay();
    	}
}
void T0delay() {
	TCNT0 = 0x25;  		/* Load TCNT0*/
	TCCR0 = 0x01;  		/* Timer0, normal mode, no pre-scalar */
	
	while((TIFR&0x01)==0);  /* Wait for TOV0 to roll over */
	TCCR0 = 0;
	TIFR = 0x1;  		/* Clear TOV0 flag*/
}

 


مثال

یک شکل موج مربعی با طول ۱۰ میلی ثانیه بالا و ۱۰ میلی ثانیه پایین تولید کنیم.

اول باید یک وقفه ۱۰ میلی ثانیه‌ای با تایمر صفر تولید کنیم.

فرض که میکرو رو روی فرکانس ۸ مگاهرتز تنظیم کردیم.

با استفاده از pre-scaler اه ۱۰۲۴ ، فرکانس منبع کلاک می‌شود :

8 MHz / 1024 = 7812.5 Hz

زمان هر سیکل :

1 / 7812.5 = 128 μs

بنابراین برای وقفه ۱۰ میلی‌ثانیه‌ای تعداد سیکل‌های مورد نیاز تقریبا 78 میشه

10 ms / 128 μs = 78

پس ما به ۷۸ سیکل نیاز داریم تا وقفه ۱۰ میلی‌ثانیه‌ای بسازیم. پس مقداری که باید توی TCNT0 بزاریم میشه 178 :

TCNT0 = 256 – 78

یعنی شمارنده از ۱۷۸ شروع می‌کنه به شمردن و ۷۸ تا سیکل می‌شماره تا سرریز کنه.

پس ما اگه مقدار 0xB2 رو داخل رجیستر TCNT0 بزاریم ، تایمر بعد از ۱۰ میلی ثانیه سرریز می‌کنه.

 

برنامه وقفه ۱۰ میلی‌ثانیه‌ای با تایمر صفر

 

#include <avr/io.h>
void T0delay();
int main(void)
{
	DDRB = 0xFF;		/* PORTB as output */
	PORTB=0;
    	while(1)  		/* Repeat forever */
    	{
		PORTB= ~ PORTB;
		T0delay();
    	}
}
void T0delay()
{
	TCCR0 = (1<<CS02) | (1<<CS00); /* Timer0, normal mode, /1024 prescalar */
	TCNT0 = 0xB2;  		/* Load TCNT0, count for 10ms */
	while((TIFR&0x01)==0);  /* Wait for TOV0 to roll over */
	TCCR0 = 0;
	TIFR = 0x1;  		/* Clear TOV0 flag */
}

 


وقفه تایمر

TIMSK: Timer / Counter Interrupt Mask Register

ما باید بیت TOIE0 (Timer0 Overflow Interrupt Enable) رو در رجیستر TIMSK ست کنیم تا وققه‌ی تایمر صفر فعال بشه. بعد از فعال شدن ، به محض سرریز تایمرصفر ، کنترلر به روتین وقفه تایمر صفر پرش می‌کنه.

برنامه وقفه یک میلی‌ثانیه‌ای با تایمر صفر

 

#include <avr/io.h>
#include <avr/interrupt.h>

/* timer0 overflow interrupt */
ISR(TIMER0_OVF_vect)
{
	PORTB=~PORTB;		/* Toggle PORTB */
	TCNT0 = 0xB2;
}
int main( void )
{
	DDRB=0xFF;  		/* Make port B as output */
	sei();
	TIMSK=(1<<TOIE0);  	/* Enable Timer0 overflow interrupts */
	TCNT0 = 0xB2;  		/* Load TCNT0, count for 10ms*/
	TCCR0 = (1<<CS02) | (1<<CS00); /* Start timer0 with /1024 prescaler*/
	while(1);
}

 


منبع :

https://www.electronicwings.com/avr-atmega/atmega1632-timer


یکی از گروه هایی که ما همیشه در حوزه کاریمون باهاشون سر و کار داریم برنامه نویس ها هستند و من معمولا میگم که برنامه نویس ها قلب تیم و مارکتینگ همانند مغز تیم هستش و هر کدوم نباشن قطعا تیم موفق نخواهد شد.

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

در استارتاپ ها :

یکی از اجزای جدایی ناپذیر استارتاپ ها برنامه نویس ها هستند و اونهایی که در این فضا حضور دارند اکثرا دانشجویان و جوان های علاقمندی هستند که معمولا به سه گروه تقسیم میشن :

  • گروه اول : کسانی هستند که فقط کد میزنن ، زیاد آدمهای اجتماعی نیستند و با اینکه برنامه نویس های خوبی هستند ولی به دلیل همون اجتماعی نبودن معمولا تیمی ندارند و فقط اپ تولید می کنند و به دلیل اینکه از مارکتینگ چیز زیادی نمی دونن اپ ها در گوشه ای در اپ استورها خاک می خوره.
  • گروه دوم : کسانی هستند که مقداری اجتماعی تر هستند و در تیم های استارتاپی مشغول به کار میشن ولی به علت اینکه کار تیمی نمی دونن ، کمتر می تونن تعامل خوبی داشته باشند و در مجموع ارزش زیادی برای تیم قائل نیستن،تعهدی ندارن ،معمولا با کوچکترین اختلافی قهر می کنن و می رن .
  • گروه سوم : که تعدادشون هم خیلی کمه برنامه نویس هایی هستند که کار تیمی رو می دونن، قدرت ارتباط خوبی دارند، متعهد هستند و معمولا تیم های موفق استارتاپی یکی ازین برنامه نویس در هسته ی اصلی خودشون دارند.

 

مهمترین مشکلات در این فضا که معمولا استارتاپ ها با برنامه نویس ها دارند، فضای فکری اونهاست ، خیلیاشون معمولا خودشون رو در حد خدا می دونن، ادعای زیادی دارند و طرز فکرشون اینه که فقط اونا کار می کنند و بقیه تیم بیکارن که دقیقا همین آفت کار تیمی هستش ،بدون اینکه توجه کنن که موفقیت یک استارتاپ رو مجموعه ای از عوامل ،در کنار هم هستن که رقم میزنه و کار هر فرد دارای ارزش هست که البته دلایلش رو همونطور که در این پست اشاره کردم نوپا بودن اکوسیستم استارتاپی ،پایین بودن رنج سنی برنامه نویس ها و کم تجربگی اونهاست.

در سازمان :

چیزی که در سازمان ها دیده میشه یه ذره اوضاع بهتره ، برنامه نویس ها از تجربیات بیشتری برخوردارن ، و با توجه به قرارداد و حقوق ثابتی که دریافت می کنن،حرفه ای تر عمل می کنن.

البته در سازمان ها با معضل دیگه ای درگیرن و اون عدم ساختار سازمانی برنامه نویس ها هستن ، معمولا زیاد به زمان ورود و خروج توجهی ندارن و این چیزا زیاد براشون اهمیت نداره که البته یه سری از سازمان ها با دادن ساعت های شناور سعی در حل این موضوع داشتن ولی مهمترین مشکلی که اینجا هم هنوز دیده میشه روحیه حساسشون و عدم تعهد هستش که کمتر در برنامه نویس ها دیده میشه و به راحتی یهو بدون هیچ دلیلی به سرکار بر نمی گردن بدون اینکه دغدغه ای درباره این موضوع داشته باشند.

مطالب بیشتر در این زمینه رو می تونین در وبسایت من مشاهده کنین.


۱.نداشتن هدف واضح

اگه هدفی توی سر نداشته باشی هر جا که باد بره تو هم میری

اگر می‌خواهید در شغل برنامه نویسی موفق باشید, باید بدانید که دقیقا کجا میخواهید بروید.

داشتن یک ذهنیت مبهم از کاری که در یک فاصله زمانی میخواهید انجام دهید, کافی نیست. در عوض شما باید اهداف محکمی داشته باشید;تا در هر نقطه از راه جهت شما مشخص باشد.

خیلی از برنامه نویسان و متخصصان , بعد از ده‌ها سال شغل و مسئولیت سابق خود شون رو دارند, بعله ده سال !!!

این اتفاق ناراحت کننده‌اس ولی انتخاب پیش‌فرضه. اگه شما هنوز هدف کاریتون رو به وضوح مشخص نکردید, تقریبن همین اتفاق هم برای شما میوفته.

خب چکارش میشه کرد؟ 
امروز,همین الان,وقت بزارید و فکر کنید در مورد شغل ایده‌آل تون و تصمیم بگیرید که اهداف نزدیک تون چی هستند.

یعنی ببینید مقصد اصلی تون کجاست و الان کدوم وری باید برید؟؟؟

وقتی به هدف نزدیکتون رسیدین , هدف نزدیک بعدی رو انتخاب کنید.

و هدف اصلی رو همیشه به یاد داشته باشید. مصلا روی یه کاغذ بنویسید بزنید به دیوار تا  همیشه بدونید که به کجا دارید میرید.

و اشتباهی که حتی از هدف نداشتن هم رایج تره , تعویض سریع هدفه.

خب بدیهیه که کسی که هر هفته از یک شاخه به اون شاخه بپره نتیجه ای هم نمیگیره.

 

2. مهارت های نرم یا غیر تکنیکی

اگر میخواهید برنامه نویس بهتری باشید , باید خلاقیت , سرعت عمل , سلامت جسمی و بقیه موارد مشابه رو هم داشته باشید و بهشون توجه کنید.

پس در کنار تقویت مهارت کد نویسی به روش های تقویت مهارت های نرم هم توجه کنید.

در مورد مهارت‌های نرم میتونید سرچ کنید.

 

3.قاطی جامعه نبودن

بودن در جامعه کمک میکنه تا حس تنهایی نکنید و حس کنید که به جایی تعلق دارید.

بعلاوه میتونید رابطه های جدیدی پیدا کنید و از اطراف ایده بگیرید.

اگه عضو یک اجتماع برنامه نویسی نیستید, پیشنهاد میکنم که حتما عوض (عضو) بشید.

عضو چیزی بزرگتر از خودت بودن , راهیه برای رشد.

بودن در یک جامعه برنامه نویسی فایده های زیادی داره :|

تو خارج که کد کمپ میزنن ولی ازین سوسول بازیا ما نداریم !!!
شما میتونید برید به کلاس های آموزشی.

یا اگر حضوری راحت نیستید مجازی که زیاده :/

 

4.تخصصی کار نکردن

عمیق کار کنید. چون تخصص داشتن توی یک زمینه خیلی فایده داره :|

شما هم شنیدید که همه کاره هیچ کاره اس. بد برداشت نکنید این که اطلاعات پایه در مورد همه چی داشته باشید, لازمه.

اول در یک حوضه مشخص متخصص بشید و بعد میتونید در حوضه‌ی بعدی کار کنید.

چون میگن توی برکه ماهی بزرگه باشی بهتره تا توی دریا ماهی کوچیکه.

بعد ازین که توی برکه‌ی خودتون بزرگ شدید میتونید برید جاهای بزرگ تر و عمیق تر شنا کنید.

 

5.سرمایه گذاری نکردن روی برند شخصی 

در طول زندگی خیلی چیزا میان و میرن. شما ممکنه شغلتون رو چند بار عوض کنید, ممکنه پولدار بشین یا ورشکسته, ممکنه چاق بشین یا لاغر ولی یک چیز هست که تغییر نمیکنه...

اسم شما.

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

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

اگه شما اسم و رسم خوبی داشته باشید میتونید همه چیزو با یک علامت دست عوض کنید.

خب فروش محصولات و سرویس ها که طبیعی بنظر میرسه, ولی تاحالا فکر کردید به ارزش فروش خودتون؟(به عنوان برنامه نویس).

برای ساختن یک برند شخصی تو رشته برنامه نویسی, من توصیه میکنم با ساختن یک بلاگ شروع کنید و یک مبحص یا تخصص , که قراره با اون شناخته بشین , رو انتخاب کنید. و یاد بگیرید که چطور حرفتون رو پخش کنید و اسمی بدر کنید.

یک  راهش تولید محتوایی که برای بقیه مفید باشه.

6.کار نکردن روی پروژه های جانبی

کار کردن روی پروژه های جانبی خیلی مفیییده :|

اکثر افرادی که شاغل هستند گله میکنند که فرصت نداریم تا روی دیگر تکنولوژی ها کار کنیم.

شما با کار کردن روی پروژه های جانبی میتونید به ترز فجیعی مهارت های برنامه نویسی خودتون رو تقویت کنید و کنارش یه اضافه درآمد هم میتونید داشته باشید.

همه ی برنامه نویسانی که پروژه جانبی کار میکردن (یا زیر آبی میرفتن تو شرکت) در نهایت اون پروژه جانبی تبدیل به کار تمام وقت شون شد.

فواید دیگه ای هم هست که اینجا نامبرده نمی‌شن 

7.برنامه ای برای خودآموزی نداشتن

داشتن برنامه منظم برای یادگیری و آپدیت اطلاعات خییییلی مفیده :| 

چون یکی از فاکتور های موفقیته و نداشتن اینچنین برنامه ای اشتباهه

این جور آدمی نه تنها خودشو رشد میده بلکه آدمهای اطرافش رو هم رشد میده.

میتونید برنامه ریزی کنید که هر ماه یک کتاب بخونید و هر سال 12 تا کتاب خوندید :/

یا هر روز نیم ساعت مطالعه کنید , و بعد از یکی دو سال خیییلییی تغییر میکنید.

عمل کنید

شااااااید مطالب این پست بنظرتون مفید بود ولی چه فایده اگه تغییری در شما ایجاد نکنه؟
پس بجای خوندن و پر کردن مغزتون , عمل کنید , همین امروز

تعداد صفحات : 3

اطلاعات کاربری