basic programming

آموزش برنامه نویسی Basic برای میکروکنترلر AVR با کامپایلر BASCOM

آموزش برنامه نویسی به زبان Basic  برای میکروکنترلر AVR:

برنامه نویسی Basic

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

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

معرفی میکرو:

REGFILE= VAR$

برای شروع یک برنامه در محیط BASCOM ابتدا بایستی میکرو مورد نظر تعریف گردد. VAR نام چیپ مورد استفاده است که می تواند یکی از موارد زیر باشد.

REGFILE= “AT12DEF.DAT” ‘ATTINY 12 MCU$

REGFILE= “AT15DEF.DAT” ‘ATTINY15 MCU$

REGFILE= “2323DEF.DAT” ‘AT90S2323 MCU$

REGFILE= “M16DEF.DAT” ‘MEGA16 MCU$

کریستال:

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

$CRYSTAL = X

X فرکانس کریستال استفاده شده بر حسب هرتز است .

اسمبلی و بیسیک:

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

ASM$

ASSEMBLY PROGRAMME

ENDASM$

یادداشت (اختیاری):

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

‘ یا REM 

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

آدرس شروع برنامه ریزی حافظه FLASH:

گاهی نیاز است که برنامه خود را از آدرسی دلخواه در حافظه ی FLASH ROM قرار دهید.

ROMSTART=ADDRESS$ 

در برنامه نویسی Basic آدرس مکانی از حافظه است که برنامه HEX از این آدرس در حافظه میکرو کنترولر، شروع به نوشته شدن می شود در صورتی که از این دستور استفاده نشود COMPILER به صورت خودکار آدرس &H0000 را در نظر می گیرد.

تعیین کلاک :

با این دستور در میکرو های سری میکرو MEGAAVR از جمله NEGA103 تا MEGA603 به صورت نرم افزاری میتوان کلاک سیستم را تغییر داد. تقسیم کلاک به طور مثال برای کاهش مصرف تغذیه استفاده می شود.

CLOCKDIVISON=VAR

VAR مقادیر معتبر بین اعداد 2 تا 128 می تواند باشد.

پایان برنامه:

END

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

دستور CONST:

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

CONST SYMBOL=NUMCONST

CONST SYMBOL=STRINGCONST

CONST SYMBOL=EXPRESSION

دستور ALIAS:

از این دستور برای تغییر نام متغیر استفاده می شود.

DIRECTION ALIAS PORTB.1

حال شما می توانید به جای PORTB.1 از متغیر DIRECTION استفاده نمایید.

دستور CHR:

از این دستور برای تبدیل متغیر عددی یا یک ثابت به کارکتر استفاده می شود. زمانی که شما قصد دارید یک کارکتر بر روی LCD نمایش دهید از این دستور می توانید استفاده نمایید .

در صورتی که از این دستور بدین صورت استفاده نمایید PRINT CHR (VAR) کاراکتر اسکی VAR به پورت سزیال فرستاده خواهد شد.

دستور INSTR:

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

VAR=INSTR (START,STRING,SUBSTR)

VAR=INSTR(STRING,SUBSTR)

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

دستور INCR:

INCR VAR

این دستور یک واحد به متغیر عددی می افزلید.

دستور DECR:

DECR VAR

این دستور متغیر VAR را یک واحد کم می کند.

دستور CHECKSUM:

این دستور مجموع کد دسیمال اسکی رشته VAR را برمی گرداند که البته اگر مجموع کد اسکی رشته از عدد255 بیشتر شود مقدار 256 از مجموع کم می شود.

دستور LOW:

این دستور LSB یک متغییر را برمی گرداند.

VAR = LOW (S)

LSB متغییر S در VAR قرار می گیرد.

دستور HIGH:

این دستور پر ارزش ترین بایت (MSB) یک متغییر را برمی گرداند.

VAR = HIGH (S)

مقدار MSB متغییر S در VAR جای می گیرد.

دستور LCASE:

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

TARGET = LCASE (SOURCE)

تمام حروف رشته SOURCE کوچک شده و در رشته TARGET جای داده می شوند.

دستور UCASE:

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

TARGET = UCASE (SOURCE)

تمام حروف رشته SOURCE بزرگ شده و در رشته TARGET جای داده می شود.

دستور RIGHT:

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

VAR = RIGHT (VAR1,n)

از سمت راست رشته VAR1 به تعداد کاراکتر n رشته ای جدا شده و در رشته VAR قرار می گیرد.

دستور LEFT:

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

VAR = LEFT (VAR1,n)

رشته VAR1 از سمت چپ به تعداد کاراکتر n، رشته ای جدا شده و در رشته VAR قرار می گیرد.

دستور LEN:

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

VAR = LEN (STRING)

دستور LTRIM:

این دستور فضای خالی رشته را حذف می کند.

VAR = LTRIM (ORG)

دستور SWAP:

SWAP VAR1 , VAR2

با اجرای این دستور محتوای متغییر VAR1 در متغییر VAR2 و محتوای متغییر VAR2 در متغییر VAR1 قرار می گیرد.

دستور MID:

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

1- VAR = MID (VAR1 , ST [,L])

2- MID(VAR , ST [,L]) = VAR1

1- قسمتی از رشته VAR1، با شروع از کاراکتر STام و طول L برداشته شده و در متغییر VAR قرار می گیرد.

2- رشته VAR1 در رشته VAR با شروع از کاراکتر STام و وطول L قرار می گیرد.

در صورت قید نکردن گزینه اختیاری L، بیشترین طول در نظرگرفته می شود.

دستور ROTATE:

دستور بیتها را به چپ یا راست منتقل می کند ولی تمام بیتها محفوظ هستند و هیچ بیتی بیرون فرستاده نمی شود.

ROTATE VAR, LEFR/RIGHT [ ,SHIFTS]

دستور SPACE:

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

VAR=SPACE(X)

تابع FORMAT:

این دستور یک رشته عددی را شکل دهی می کند .

TARGET= FORMAT(SOURCE,”MASK”)

رشته ای است که شکل دهی شود. SOURCE 

قرار می گیرد. TARGET نتایج در

نوع شکل دهی است.MASK

تابع FUSING:

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

TARGET = FUSING ( SOURCE , “MASK”)

SOURCE رشته مورد نظر برای شکل دهی و MASK نوع شکل دهی است سپس نتایج این شکل دهی در TARGET قرار می گیرد. عمل MASK حتما باید با علامت # شروع شود و حد اقل باید یکی از علامت های # و & را بعد از ممیز داشته باشد. علامت های # و& با یکدیگر بعد از ممیز استفاده نمی شود. با استفاده از علامت # عدد روند می شود و در صورت استفاده از & روندی صورت نمی گیرد.

جدول LOOKUP:

توسط این جدول می توان مقدار دلخواهی را از جدول برگرداند.

VAE = LOOKUP ( VALUE , LABEL )

LABELE برچسب جدول و VALUE اندیس داده دلخواه در جدول است. داده برگشتی از جدول در متغیر VAR قرار می گیرد. VALUE = 0 اولین داده در جدول را برمی گرداند. تعداد اندیس ها و مقدار داده برگشتی به ترتیب نهایتا می تواند 255 و 65535 باشند.

 

جدول LOOKUPSTR:

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

VAR = LOOKUPSTR ( VALUE , LABEL )

LABLE برچسب جدول و VALUE اندیس رشته دلخواه در جدول است. رشته برگشتی از جدول در متغییر رشته ای VAR قرار می گیرد. VALUE = 0 اولین رشته در جدول را برمی گرداند. تعداد اندیس ها نهایتا می تواند 255 باشد.

 توابع ریاضی و محاسباتی در برنامه نویسی Basic:

عملگر های ریاضی:

از عملگرهای ریاضی زیر می توانید در محیط BASCOM استفاده نمایید و عملیات ریاضی خود را راحتر انجام دهید.

علامت نماد 

علامت ضرب ASTERISKS                           *

علامت جمع PLUS SIGN                            +

علامت تفریق MINUS SIGN                         –

علامت ممیز PERIOD                                 .

علامت تقسیم SLASH                               /

علامت کوچکتر از LESS THAN                     <

علامت تساوی EQUAL SIGN                      =

علامت بزرگتر از GREATER THAN                >

علامت بتوان EXPONENT                           ^

علامت کوچکتر یا مساوی با LESS THAN OR EQUAL TO                          <=

علامت بزرگتر یا مساوی با GREATER THAN OR EQUAL TO                      =<

علامت مخالف INEQUALITY                                                              <>

 

عملگر های منطقی در برنامه نویسی Basic:

عملگر های منطقی در BASCOM به قرار زیر است:

 CONJUNCTION AND

DISJUNCTION OR

EXCLUSIVE OR XOR

LOGICAL COMPLEMENT NOT

 
تابعABS :

VAR = ABS ( VAR2 )

این دستور به معنای ریاضی VAR = |VAR2| (قدر مطلق) است.

تابع EXP:

TARGET = EXP(SOURCE)

TARGET برابر با e به توان SOURCE است. TARGET مغییری از نوع داده SINGLE است.

تابع LOG10:

لگاریتم پایه 10 متغییر یا ثابت SOURCE در متغییر TARGET قرار می گیرد. TARGET و SOURCE هر دو داده نوع SINGLE هستند.

تابع LOG :

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

TARGET = LOG (SOURCE)

لگاریتم متغییر یا ثابت SOURCE از نوع داده SINGLE گرفته می شود و در متغییر TARGET از نوع داده SINGLE قرار می گیرد. این تابع برای اجرا شدن وقت زیادی می برد مخصوصا زمانی که اعداد بزرگ استفاده می شود. همچنین با بزرگتر شدن اعداد دقت نیز پایین خواهد آمد.

 

رجیستر ها و آدرس های حافظه در برنامه نویسی Basic

تمام میکروهای AVR دارای 32 رجیستر 8 بیتی (R0-R31) همه منظوره در CPU خود هستند. رجیسترهای R31(MSB) با R30(LSB)، R29(MSB) و R27(MSB) با R26(LSB) تشکیل سه رجیستر 16 بیتی به ترتیب با نام های Z، Y و X را می دهند.

دستور SET:

توسط این دستور می توان یک بیت را یک کرد.

SET BIT/PIN

SET VAR.X

BIT می تواند یک بیت و یا یک SFR مانند PORB.1 باشد و VAR متغییری از نوع داده BYTE، INTEGER، WORD یا LONG است. X برای BYTE می تواند 0 تا 7، 0 تا 15 برای WORD و برای LONG می تواند 0 تا 31 باشد.

دستور TOGGLE:

این دستور مقدار منطقی یک پایه یا یک بیت را معکوس می کند.

TOGGLE PIN/BIT

PIN می تواند یک SFR مانند PORTB.1 و یا یک بیت باشد.

دستور RESET:

توسط این دستور می توان یک بیت را صفر کرد.

RESET BIT/PIN

RESET VAR.X

BIT می تواند یک بیت و یا یک SFR مانند PORTB.1 باشد و VAR مغییری از نوع داده WORD, INTEGER, BYTE یا LONG است و X برای BYTE می تواند 0 تا 7، 0 تا 15 برای WORD و برای LONG می تواند 0 تا 31 باشد.

دستور BITWAIT:

BITWAIT X, SET/RESET

توسط این دستور اجرای برنامه تا زمانی که بیت SET ( =1 ) ,X یا RESET شود در خط جاری متوقف می ماند. در صورت TRUE شدن شرایط، اجرای برنامه از خط بعد ادامه می یابد. X می تواند یک بیت رجیستر داخلی مانند PORTB.Y باشد که Y می تواند بین می تواند بین اعداد 0 تا 7 تغییر کند.

دستور CPEEK :

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

دستور OUT:

توسط این دستور می توان یک بایت به یک پورت سخت افزاری یا آدرس حافظه داخلی /خارجی ارسال کرد.

OUT ADDRESS , VALUE

VALUE به آدرس ADDRESS که می تواند بین 0H تا FFFFH باشد فرستاده می شود. دستور OUT می تواند در تمام مکانهای حافظه AVR بنویسید.در ضمن برای نوشتن در مکان حافظه خارجی (XRAM) باید در محیط BASCOM و در منوی (OPTION?COMPILER ? CHIP)، گزینه (EXTERNAL ACCESS ENABLE) را فعال کنید.

 

دستور العمل های حلقه و پرش در برنامه نویسی Basic

دستور GOTO و JMP

GOTO LABEL

JMP LABLE

با این دستورات می توان به برچسب LABEL پرش کرد. برچسب LABEL باید با علامت: (COLLON) پایان یابد و می تواند تا32 کاراکتر طول داشته باشد. به خاطر داشته باشید زمانی که از دو LABEL هم نام استفاده شود کامپایلر به شما هشدار (WARNING) می دهد. دستور RETURN برای برگشت از برچسب وجود ندارد.

دستور العمل DO-LOOP در برنامه نویسی Basic

فرم کلی دستور DO…LOOP به صورت زیر می باشد.

DO 

Statements

LOOP [UNTIL EXPRESSION]

دستورالعمل Statements تا زمانی که EXPRESSION دارای ارزش TRUE یا غیر صفر است تکرار خواهد شد بنابراین این نوع حلقه، حداقل یکبار تکرار شود. DO-LOOP به تنهایی یک حلقه بینهایت ایت که با EXIT DO می توان از درون حلقه خارج شد و اجرای برنامه در خط بعد از حلقه ادامه یابد.

دستورالعمل IF در برنامه نویسی Basic

در کلیه حالتهای زیر عبارت Statements می تواند یک دستورالعمل ساده یا چند دستورالعمل مرکب باشد.

حالت 0:

IF EXPRESSION THEN Statements 

دستورالعمل Statements زمانی اجرا می شود که عبارت EXPRESSION دارای ارزش TRUE باشد.

حالت 1:

IF EXPRESSION THEN

Statements1

ELSE

Statements2

END IF

در صورتی که عبارت EXPRESSION1 دارای ارزش TRUE باشد دستورالعمل Statements1 اجرا خواهد شد، در غیر این صورت دستورالعمل Statements2 اجرا می شود.

IF EXPRESSION1 THEN

Statements1

ELSE IF [EXPRESSION2 THEN]

Statements2

ELSE

Statements3

ELSE IF

در صورتی که عبارت EXPRESSION1 دارای ارزش TRUE باشد دستورالعمل Statements1 اجرا خواهد شد. در صورتی که عبارت EXPRESSION1 دارای ارزش FALSE ولی عبارت اختیاری EXPRESSION2 دارای ارزش TRUE باشد، دستورالعمل Statements2 اجرا خواهد شد و در غیر این صورت یعنی در حالتی که هر دو عبارت EXPRESSION2 و EXPRESSION1 دارای ارزش FALSE باشند دستورالعمل Statements3 اجرا خواهد شد.

همچنین با دستور IF می توان یک یا صفر بودن یک بیت از یک متغییر را امتحان کرد.

IF BIT = 1 THEN OR IF BIT = 0 THEN

 


۳ Comments

رادمهر

اسفند ۲۶, ۱۳۹۶ at ۱۲:۴۹ ب.ظ

با عرض تشکر؛ تقریبا کامل بود

ماهتو

آبان ۲۲, ۱۳۹۹ at ۸:۰۱ ق.ظ

من یکی از کاربران دائمی سایت
شما هستم

آریا

فروردین ۲۱, ۱۴۰۰ at ۱۱:۲۱ ب.ظ

عالی بود ممنون

ارسال نظرات