شروع کار با میکروکنترلرهای Holtek

  • ۶۱۲ بازدید

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

مزایای استفاده از این پلت فرم حرفه ای:

  • کنترل بیشتر بر روی تنظیمات – شما به راحتی می توانید سخت افزاری با مصرف انرژی در محدوده میکروآمپر ایجاد کنید.
  • هزینه کمتر میکروکنترلرها برخی از دستگاه های Holtek در LCSC کمتر از 0.10 دلار هستند!
  • دانش شما را گسترش می دهد و شروع به کار با تولید کنندگان دیگر را آسان تر می کند.

ملزومات

  • میکروکنترلر یا برد توسعه فلش 8 بیتی Holtek. من از این برد توسعه HT66F0185 استفاده خواهم کرد.
  • کامپیوتر مبتنی بر ویندوز
  • پروگرامر Holtek e-Link.
  • پروتوبرد و قطعات، بر اساس نیاز پروژه شما.
برد توسعه HT66F0185

مرحله 1: قطعات و برنامه نویس خود را خریداری کنید

میکروکنترلر Holtek

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

در حالی که با آردوینو شما معمولاً فقط یک ATMEGA328 را بدون توجه به نیازهای پروژه احتیاج دارید، اولین تفاوت اینجاست. لیستی از نیازهای پروژه خود (تعداد پورت های آنالوگ، نیازهای UART یا SPI، تعداد IO و غیره) تهیه کنید و بخشی را با کمترین هزینه که تمام ویژگی های لازم را دارد انتخاب کنید. می توانید تصویری را که در بالا انتخاب کرده ام با رنگ زرد مشخص شده ببینید.

وب‌سایت Holtek دارای فهرست کاملی از بخش‌ها در مقابل ویژگی‌ها برای کل طیف آنها ( فهرست محصولات ) است، اما به خاطر داشته باشید که همه آنها از توزیع‌کنندگان در دسترس نیستند.

در مرحله بعد به یک برنامه نویس/دیباگر e-Link نیاز دارید. خوشبختانه در فروشگاههای اینترنتی تجهیزات الکترونیکی ایرانی در دسترس هستند. (در گوگل سرچ کنید!)

مرحله 2: IDE را دانلود کنید

میکروکنترلر Holtek

IDE برای Holtek به HT-IDE3000 نامیده می شود. البته کمی قدیمی به نظر می رسد اگر به Microchip MPLAB-X یا برخی از IDE های مدرن دیگر عادت دارید، اما نتیجه آن عملکرد سریع است و زمان زیادی طول نمی کشد تا به آن عادت کنید.

می توانید نرم افزار را در پایین صفحه محصول E-Link دانلود کنید . پس از نصب، اگر برای اولین بار پس از اتصال آن از طریق USB از آن استفاده می کنید، احتمالاً باید E-Link خود را فعال کنید، سپس همه چیز آماده است.

مرحله 3: شروع یک پروژه جدید

من چند فرض را برای مراحل زیر در نظر گرفته ام :

  • شما دانش اولیه زبان C را دارید.
  • شما می توانید داده های مورد نیاز خود را از دیتاشیت آی سی به دست آورید.

برای هدف دموی ما، من از برد توسعه HT66F0185 استفاده خواهم کرد. برای کسانی که از پس‌ از آشنایی با آردوینو می‌آیند، فرقی نمی‌کند که از یک آی‌سی شل استفاده می‌کنید یا از برد توسعه، زیرا هرگز قابلیت اشکال‌زدایی را نداشته‌اید، اما برای کسانی که از پس‌زمینه میکروچیپ می‌آیند، مهم است که توجه داشته باشند که آی‌سی پروداکشن قابلیت دیباگ کردن را ندارد. در مواردی که قابلیت اشکال زدایی روی برد توسعه وجود دارد، شماره‌های قطعه دارای حرف ویژه «V» هستند – در واقع HT66V0185، به این معنی است که می‌توانید اجرای برنامه را متوقف کنید و مقادیر ثبات را بررسی کنید، مقادیر را وارد کنید و به بخش‌های مختلف کد بروید که بسیار مفید هستند. همچنین می‌توانید آی‌سی‌های دیباگ ویژه را از نمایندگی Holtek دریافت کنید، اگر قصد دارید کار خود را در مقیاس بزرگ انجام دهید.

در ابتدا فکر می کردم که این کاملاً محدود کننده است (اکثر قطعات ریزتراشه دارای قظعات اشکال زدایی هستند، حتی روی آی سی های پروداکشن)، اما بعد متوجه شدم که این کار صرفه جویی بسیار زیادی در هزینه ها دارد، زیرا 99.9٪ از آی سی های تولیدی هرگز به دیباگر وصل نمی شوند. یک دیباگر اتلاف بزرگی در ناحیه سیلیکونی است.

برای شروع یک پروژه جدید، “Project -> New” را در نوار منوی بالای HT-IDE3000 انتخاب کنید.

نام پروژه و مکان خود را وارد کرده و MCU خود را انتخاب کنید.

گزینه بعدی ‘Choose Language Tool’ بستگی به این دارد که کدام آی سی را انتخاب کرده اید – IC های ارزان تر و اساسی تر مانند HT66F001 فقط از نسخه های قدیمی پشتیبانی می کنند، اما در این مورد برای HT66F0185 ما می توانیم نسخه 3 را انتخاب کنیم. به نظر من V3 بسیار بهتر و به C واقعی نزدیکتر است.

در مرحله بعد، ما یک اخطار در مورد پین های نامحدود دریافت می کنیم – این فقط به این معنی است که اگر برای مثال یک بسته 28 پین دارید، ولی همان تراشه را در یک بسته 44 پین نیز می سازند، در این صورت پین های غیر متصل وجود خواهد داشت. تمرین خوبی است که در سیستم عامل خود مشخص کنید که با آنها چه کاری انجام دهید تا رفتار غیرقابل پیش بینی رخ ندهد. Next را بزنید تا به طور خودکار یک فایل .C برای پروژه شما ایجاد شود.

بهتر است که در مرحله بعد یک صفحه پیکربندی دریافت کنیم – این به ما امکان می دهد گزینه های پروژه را تنظیم کنیم. SysVolt را به عنوان ولتاژ منبع تغذیه خود تنظیم کنید – دلیل اهمیت این موضوع این است که برخی از آی سی ها گزینه های ساعت متعددی دارند و سرعت های بالاتر فقط بالاتر از ولتاژهای خاص در دسترس هستند. در مثال من اگر روی 5 ولت تنظیم کنم، 8 مگاهرتز، 12 مگاهرتز و 16 مگاهرتز را باز می کنم، اما در 3.3 ولت گزینه 16 مگاهرتز ناپدید می شود. Vdd، OSC (در مورد من RC داخلی + IO1/IO2)، HIRC که سرعت اجرای شماست را تنظیم کنید، و من ساعت fsub خود را روی LIRC (ساعت آهسته داخلی) تنظیم کردم زیرا از ساعت Real Time در این برنامه استفاده نمی کردم. روی OK و سپس دوباره OK را در تنظیمات پروژه فشار دهید، پیش فرض ها در اکثر موارد OK هستند.

مرحله 4: سخت افزار

برای پروژه آزمایشی خود، تصمیم گرفتم یک شمارنده 3 رقمی ساده با یک رمزگذار چرخشی و نمایشگر 7 قسمتی بسازم.

من این را روی برد سوراخدار ساختم، با هدرهای SIL قابل جابجایی برای وصل کردن برد نمایشی. همچنین از کابل نواری همراه برای اتصال برد توسعه خود به e-Link استفاده کردم. (اگر سوکت دو ردیفه است، فقط به یک طرف آن نیاز دارید.)

اگر قبلا با بردهای دیگری کار کرده باشید، ممکن است فکر کنید که با وارد نکردن مقاومت در اتصالات 7 سگمنت، یک مرحله را فراموش کرده ام، اما این میکروکنترلر دارای یک ویژگی واقعا مفید است (کنترل جریان منبع پورت ورودی/خروجی) که به شما امکان انتخاب جریان ورودی/خروجی را بدون مقاومت و درایورهای LED می دهد.

مرحله 5: پیکربندی

میکروکنترلر Holtek

اگرچه پیکربندی Holtek به طور خودکار به پورت‌های شما نام‌های قابل دسترسی نسبتاً معقول اختصاص می‌دهد، اما یادآوری اینکه مثلا بعد از 2 ماه به یاد آورید که پایه B را به عنوان مثال به بخش H متصل کرده‌اید، بسیار سخت است، بنابراین اولین قدم این است که نام‌های قابل خواندن توسط انسان را برای پین‌ها تعریف کنیم. که اگر مجبور باشم دوباره کد را مرور کنم، مجبور نیستم از طریق شماتیک ها و دیتاشیت ها جستجو کنم.

اگر قسمت اصلی تری را انتخاب کردید و مجبور بودید از کامپایلر V2 یا پایین تر از C استفاده کنید، اینجاست که اولین تفاوت را متوجه خواهید شد – در V3 می توانیم یک مقدار شروع را به یک متغیر اختصاص دهیم.(مثلاً unsigned int number = 100) در حالی که این به عنوان یک خطا در V2 علامت گذاری می شود. برای دور زدن این محدودیت، فقط باید ‘unsigned int number;’ را قرار دهیم. در اعلان متغیر، سپس در جایی در روال تنظیم، خط دوم را بنویسید ‘number = 100;’ قبل از اینکه متغیر برای جایی مورد نیاز باشد.

علاوه بر این، اگر از پس‌زمینه آردوینو می‌آیید، احتمالاً با فراخوانی delay() به ایجاد تاخیرهای دقیق عادت کرده اید، اما در اینجا چنین چیزی وجود ندارد! شما باید روال تاخیر خود را ایجاد کنید یا با استفاده از Tools -> V3 Code Generator مانند تصویر بالا، یکی را ایجاد کنید. این تاخیر به جای میلی ثانیه در چرخه های CPU خواهد بود، بنابراین طول آن به سرعت ساعتی که تراشه شما در آن کار می کند بستگی دارد. شایان ذکر است که ساعت CPU با سرعت 1/4 نوسانگر کار می کند، بنابراین یک ساعت 16MHz نتیجه 4 میلیون عملیات در ثانیه را مانند بسیاری از میکروکنترلرهای PIC ارائه خواهد داد.

مرحله 6: راه اندازی

میکروکنترلر Holtek

توجه داشته باشید که روال Setup به طور خودکار در آردوینو ایجاد می شود و در ابتدای اجرای برنامه اجرا می شود، در حالی که در محیط Holtek فقط یک حلقه Main() به شما داده می شود. اگر می‌خواهید یک روتین Setup ایجاد کنید، باید خودتان آن را بسازید و از Main آن را فراخوانی کنید.

ادامه دهید و آن را ایجاد کنید، سپس پین های پورت IO خود را تنظیم کنید. در این مورد، می خواستم تمام پین های نمایشگر را روی خروجی ها تنظیم کنم. هر پورت IO دارای رجیستر کنترل با نام مخصوص به خود است مثلا پورت A به نام PAC , پورت B به نام PBC نامیده می شود. شما می توانید به هر بیت به صورت جداگانه دسترسی داشته باشید، برای مثال ‘pbc4 = 1_;’ پورت B پین 4 را به یک ورودی تبدیل می کند، یا ‘pbc4 = 0_;’ برای یک خروجی تنظیم می کند. علاوه بر این، کشش‌های ضعیف کننده ای (weak pullups) در اکثر پورت‌های Holtek IO تعبیه شده است. (مقاومت‌های داخلی که می‌توان آنها را طوری تنظیم کرد که ورودی‌های سوئیچ را در حالت بالا قرار دهند)، که نیاز به اضافه کردن مقاومت‌های خارجی را کاهش می‌دهد. آنها از طریق _pXpuY قابل دسترسی هستند، جایی که X پورت شما و Y شماره پین ​​شما است. 1 کشش ضعیف را فعال می کند و 0 آن را حذف می کند.

اگر می خواهید یک دستگاه جانبی متصل کنید برای همه تجهیزات جانبی تقریباً یکسان عمل می کند در صفحه داده (دیتاشیت) خود جستجو کنید تا ببینید چه رجیسترهایی باید پیکربندی شوند تا کار کند. توضیحات کاملاً جامع هستند، اما اگر در دفعه اول کار نمی کند، ناامید نشوید. نحوه دسترسی به رجیسترها در فایل part .h تعریف شده است که به طور خودکار هنگام ایجاد پروژه خود اختصاص داده می شود و در Workspace در قسمت External Files یافت می شود. شایان ذکر است که نباید آن را ویرایش کنید، زیرا بسته به پروژه ای که به آن مرتبط است تغییر می کند!

اگر پین‌ها به درستی کار نمی‌کنند مطمئن شوید که در حالت آنالوگ پیش‌فرض نیستند، ارزش آن را دارد که برگه داده‌های آی سی خود را بخوانید قسمت های پورت ها یا پین های UART و غیره

پس از نوشتن روال تنظیم (setup routine)، روال‌های بیشتری را برای پیکربندی خروجی برای هر رقم و ستون‌های یک‌ها، ده‌ها و صدها و دو وقفه اضافه کردم که زمان چرخاندن سوئیچ چرخشی را تشخیص می‌دهند.

مرحله 7: Main

ابتدا در Main، فراموش نکنیم که با روال setup خود را صدا بزنیم!

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

راه حل این است که بقیه برنامه را در یک حلقه while(1) دائمی قرار دهید، که هرگز نمی تواند از آن فرار کند. تنها راه فرار این است که یکی از توابعی که قبلا ایجاد کرده بودیم فراخوانی شود، یا وقفه ای رخ دهد، اما پس از کامل شدن تابع یا وقفه باز خواهد گشت.

در این حلقه، چند دور strobing از طریق ارقام، یک عبارت کلیدی برای تغییر نمایش نقطه اعشار اضافه می‌کنم که به ما امکان می‌دهد به جای چرخش در هر 999 بار، یک‌ها، ده‌ها یا صدها را ویرایش کنیم، و یک تاخیر کوچک که غیرفعال می‌شود. با زدن صفحه کلید، برای چند میلی ثانیه قطع می شود. این کار برای جلوگیری از تغییر چندین رقم با یک کلیک روی صفحه کلید است، زیرا سوئیچ نویز بالایی دارد.

همچنین مقداری جانک در آنجا وجود دارد که قصد داشتم مقدار را در EEPROM ذخیره کنم و هنگام راه اندازی آن را به خاطر بیاورم. کد در زیر آورده شده است.

#include "HT66F0185.h"
//Holtek Instructables Demo - rotary encoder and 3 digit seven seg display
//Paul Dack 2021
//pin definitions
#define seg_E	_pb4
#define seg_G	_pa7
#define seg_C	_pa5
#define seg_B	_pd1
#define seg_A	_pb3
#define seg_F	_pc5
#define seg_D	_pc4
#define seg_DP	_pa6
#define com_1	_pc2
#define com_2	_pc1
#define com_3	_pc0
#define a_in	_pb0
#define b_in	_pb1
unsigned int number = 100;
unsigned char ones = 0;
unsigned char tens = 0;
unsigned char hundreds = 0;
unsigned char EEPROM_upper = 0;
unsigned char EEPROM_lower = 0;
volatile bit A_state_last = 0;
unsigned char DP_stat = 1;
bit wait_flag = 0;
void delay(unsigned int count){
    volatile unsigned int i;
    for(i=0;i<count;i++)
        asm("nop");
}
void __attribute((interrupt(0x04))) INT0_ISR(void){	
	if(number<=998){
		if(DP_stat == 1){
			number++;
		}
	}
	if(number<=989){
		if(DP_stat == 2){
			number = number + 10;
		}
	}
	if(number<=899){
		if(DP_stat == 3){
			number = number + 100;
		}
	}
	_int0e = 0; //int0 interrupt disabled
	_int1e = 0; //int1 interrupt disabled
	wait_flag =1;
}
void __attribute((interrupt(0x24))) INT1_ISR(void){
	
	if(number>=1){
		if(DP_stat == 1){
			number--;
		}
	}
	if(number>=10){
		if(DP_stat == 2){
			number = number - 10;
		}
	}
	if(number>=100){
		if(DP_stat == 3){
			number = number - 100;
		}
	}
	_int0e = 0; //int0 interrupt disabled
	_int1e = 0; //int1 interrupt disabled	
	wait_flag = 1;
}
void setup(void){
	//set segment drivers to off to prevent unwanted flashing
	com_1 = 0;
	com_2 = 0;
	com_3 = 0;
	//set pin directions for display
	_pbc4 = 0;
	_pcc4 = 0;
	_pac5 = 0;
	_pac7 = 0;
	_pbc3 = 0;
	_pcc5 = 0;
	_pdc1 = 0;
	_pac6 = 0;
	_pcc2 = 0;
	_pcc1 = 0;
	_pcc0 = 0;
	//set weak pullup bits for switch inputs:
	_pbpu0 = 1;
	_pbpu1 = 1;
	_pbpu2 = 1;
	//set interrupt edge detection 
	_integ = 0b00001010; //falling edges both int0 and int1
	_rxps = 0; //set rx to pb4 instead of PD1
	_rxen = 0; //disable UART
	_txen = 0; //disable 
	_uarten = 0; //make sure!
	_lcden = 0; //disable LCD driver
	_seg7en = 0; //disable the LCD driver pin 7
	_seg6en	= 0; //disable the LCD driver pin 6
	_clop = 0; //clock output off
	_t2cp = 0; //timer output off
	_wdtc = 0b10101000; //disable WDT
	_adcen = 0; //disable the ADC
	_acerl = 0b00000000; //ADC ports A not ADC
	_sledc0 = 0b10101010; //level 2 source current
	_sledc1 = 0b10101010; //level 2 source current
	//configure edge detect interrupts for encoder
	_int0e = 1; //int0 input active
	_int1e = 1; //int1 input active
	_emi = 1; //global interrupts enabled
}
void read_EEPROM(void){
	_rden = 1;		//read enable
	_eea = 0x00;	//eeprom address 0x00
	_rd = 1;		//perform read 
	while(_rd){
	//wait for eeprom value to be available
	}
	EEPROM_upper = _eed;
	_rden = 1;		//read enable
	_eea = 0x01;	//eeprom address 0x01
	_rd = 1;		//perform read 
	while(_rd){
	//wait for eeprom value to be available
	}
	EEPROM_lower = _eed;
	number = EEPROM_upper<<8;		//left shift upper byte
	number = number + EEPROM_lower;	
	//TODO add range check for 0-999
}
void write_EEPROM(void){
	EEPROM_upper = number>>8;		//right shift upper byte
	EEPROM_lower = (number & 0x00FF); //bitmask
}
void number_to_digits(void){
	hundreds = number / 100;
	tens = ((number - (hundreds * 100)) / 10);
	ones = ((number - (hundreds * 100)) - (tens * 10));
}
void digits_to_number(void){
	number = ones;
	number = number + (10 * tens);
	number = number + (100 * hundreds);
}
char configure_outputs(char digit){
	switch(digit){
		case 0:
			seg_A = 1;
			seg_B = 1;
			seg_C = 1;
			seg_D = 1;
			seg_E = 1;
			seg_F = 1;
			seg_G = 0;
			//seg_DP = 0;
		break;
		case 1:
			seg_A = 0;
			seg_B = 1;
			seg_C = 1;
			seg_D = 0;
			seg_E = 0;
			seg_F = 0;
			seg_G = 0;
			//seg_DP = 0;
		break;
		case 2:
			seg_A = 1;
			seg_B = 1;
			seg_C = 0;
			seg_D = 1;
			seg_E = 1;
			seg_F = 0;
			seg_G = 1;
			//seg_DP = 0;
		break;
		case 3:
			seg_A = 1;
			seg_B = 1;
			seg_C = 1;
			seg_D = 1;
			seg_E = 0;
			seg_F = 0;
			seg_G = 1;
			//seg_DP = 0;
		break;
		case 4:
			seg_A = 0;
			seg_B = 1;
			seg_C = 1;
			seg_D = 0;
			seg_E = 0;
			seg_F = 1;
			seg_G = 1;
			//seg_DP = 0;
		break;
		case 5:
			seg_A = 1;
			seg_B = 0;
			seg_C = 1;
			seg_D = 1;
			seg_E = 0;
			seg_F = 1;
			seg_G = 1;
			//seg_DP = 0;
		break;
		case 6:
			seg_A = 1;
			seg_B = 0;
			seg_C = 1;
			seg_D = 1;
			seg_E = 1;
			seg_F = 1;
			seg_G = 1;
			//seg_DP = 0;
		break;
		case 7:
			seg_A = 1;
			seg_B = 1;
			seg_C = 1;
			seg_D = 0;
			seg_E = 0;
			seg_F = 0;
			seg_G = 0;
			//seg_DP = 0;
		break;
		case 8:
			seg_A = 1;
			seg_B = 1;
			seg_C = 1;
			seg_D = 1;
			seg_E = 1;
			seg_F = 1;
			seg_G = 1;
			//seg_DP = 0;
		break;
		case 9:
			seg_A = 1;
			seg_B = 1;
			seg_C = 1;
			seg_D = 1;
			seg_E = 0;
			seg_F = 1;
			seg_G = 1;
			//seg_DP = 0;
		break;
		default:
			seg_A = 0;
			seg_B = 0;
			seg_C = 0;
			seg_D = 0;
			seg_E = 0;
			seg_F = 0;
			seg_G = 0;
			//seg_DP = 0;
		break;
	}
return(0);
}
void display_ones(void){
	configure_outputs(ones);
	if(DP_stat == 1){
		seg_DP = 1;
	} else seg_DP = 0;
	com_1 = 0;
	com_2 = 0;
	com_3 = 1;
}
void display_tens(void){
	configure_outputs(tens);
	if(DP_stat == 2){
		seg_DP = 1;
	} else seg_DP = 0;
	com_1 = 0;
	com_2 = 1;
	com_3 = 0;
}
void display_hundreds(void){
	configure_outputs(hundreds);
	if(DP_stat == 3){
		seg_DP = 1;
	} else seg_DP = 0;
	com_1 = 1;
	com_2 = 0;
	com_3 = 0;
}
void main()
{
	setup();
	while(1){	
	//read_EEPROM();
	//write_EEPROM();
	number_to_digits();
	display_ones();
	delay(500);
	display_tens();
	delay(500);
	display_hundreds();
	delay(500);
	display_ones();
	delay(500);
	display_tens();
	delay(500);
	display_hundreds();
	delay(500);
	display_ones();
	delay(500);
	display_tens();
	delay(500);
	display_hundreds();
	delay(500);
	display_ones();
	delay(500);
	display_tens();
	delay(500);
	display_hundreds();
	delay(500);
	if(wait_flag){
		delay(8000);
		_int0f = 0;	//clear any flags which may be set
		_int1f = 0;
		_int0e = 1; //int0 interrupt enabled
		_int1e = 1; //int1 interrupt enabled
		wait_flag = 0;
	}
	if(!_pb2){
		switch(DP_stat){
			case 1:
				DP_stat = 2;
				break;		
			case 2:
				DP_stat = 3;
				break;
			case 3:
				DP_stat = 1;
				break;		
			default:
				DP_stat = 1;
				break;
		}
	while(!_pb2){} //wait for switch to be released before continuing			
	}
	}
}

مرحله 8: اجرا و رفع اشکال

میکروکنترلر Holtek

برای کسانی که فقط قسمت “F” دارند، پروگرامر خود را وصل کنید، کد خود را کامپایل کنید (Shift + F8) سپس دکمه ICP را فشار دهید که شبیه یک صفحه آبی با یک فلش رو به پایین است. با این کار منویی ظاهر می شود که به شما امکان می دهد ولتاژ برنامه نویسی را انتخاب کنید و برنامه نویسی را شروع کنید. اگر همه چیز به درستی سیم‌کشی شده باشد، باید چند ثانیه طول بکشد، سپس می‌توانید مدار خود را از طریق پروگرامر به‌طور خودکار روشن کنید تا آن را آزمایش کنید.

برای کسانی که به اندازه کافی خوش شانس هستند تا قسمت ‘V’ یا یک برد توسعه داشته باشند، می توانند با زدن (Shift + F8) کد خود را را کامپایل کنند و سپس با زدن (F5) وارد حالت اشکال زدایی شوند. سپس برنامه شروع به اجرا می کند، می توانید با F4 بازنشانی کنید، یا روی هر خط کد کلیک کنید و F9 را فشار دهید تا نقطه انفصال اضافه شود – این کار باعث می شود که وقتی کد به نقطه مورد نظر رسید بایستد.

وقتی به نقطه شکست رسیدید، می‌توانید با کلیک راست و «افزودن متغیر به پنجره تماشا» ‘add variable to watch window’، متغیرها را به هر یک از 4 تب Watch در پایین اضافه کنید. این مقدار آنها را نمایش می دهد و به شما امکان می دهد بررسی کنید که برنامه شما همان کاری را که انتظار دارید انجام می دهد یا خطاها را تشخیص دهید. همچنین مفید است که با تعیین نقطه انفصال در آنجا متوجه شوید که آیا بخشی از کد شما واقعاً در حال اجرا است یا خیر. اگر حرکت متوقف نشود، نمیتوانید که آیا به آن خط رسیده است یا نه.

همچنین یک ابزار مفید این است که وقتی در یک نقطه شکست توقف می کنید، میتوانید کل محتویات RAM و ROM را دانلود کنید. مواردی که با دفعه قبل که متوقف شده تفاوت دارند با رنگ قرمز برجسته می شوند که به شما امکان می دهد ببینید چه متغیرهایی در حال تغییر هستند. اگر نشان داده نشد، آن را با استفاده از View->Toolbar->RAM انجام دهید.