مرجع دستورات بیسیک avr (قسمت2)
جمعه, ۴ آذر ۱۳۹۰، ۰۴:۴۳ ق.ظ
ولتاژ های VSS و VDD تغذیه LCD را فراهم می کند.
ولتاژ VO ولتاژ کنتراست است که تنظیم میزان
روشنایی کاراکتر ها را روی LCD به کمک ولتاژ های VSS و VDD و یک مقاومت متغیر 10
کیلو انجام می دهد.
در داخل LCD دو ثبات وجود دارد که توسط پایه RS انتخاب می
شود.
اگر RS=0 باشد ثبات دستور IR انتخاب تا
اطلاعات ورودی به عنوان فرمان مشخص شوند. LCD این اطلاعات را دریافت می کند و فرمان
تعریف شده را اجرا می کند.لیستی از این دستورات در جدول زیر موجود است.
در صورتیکه RS=1 باشد ثبات داده DR انتخاب می
شود تا کاربر بتواند اطلاعاتی را روی LCD بنویسد یا بخواند.
اطلاعات مربوط به کاراکتر ها باید به صورت کد اسکی باشد.
جدول دستورات:
عملکرد فرمان
کد هگزادسیمال فرمان
صفحه نمایش پاک می شود
مکان نما به محل اولیه بر می گردد
مکان نما پس از نوشتن هر حرف یا عدد به چپ شیفت پیدا می کند
مکان نما پس از نوشتن هر حرف یا عدد به راست شیفت پیدا می کند
کاراکترها به راست شیفت پیدا می کنند
کاراکترها به چپ شیفت پیدا می کنند
کاراکترها و مکان نما خاموش می شوند
کاراکترها خاموش و مکان نمای زیر خط ثابت روشن می شود
کاراکترها روشن و مکان نما خاموش می شود
مکان نمای چشمک زن فعال می شود
مکان نما به چپ شیفت پیدا می کند
مکان نما به راست شیفت پیدا می کند
کل به چپ شیفت پیدا می کند
کل به راست شیفت پیدا می کند
آدرس اولین کاراکتر سطر اول
آدرس اولین کاراکتر سطر دوم
LCD به صورت دو سطری می شود
1
2
4
6
5
7
8
0A
0C
0D
10
14
18
1C
80
C0
38
پایه پنجم پایه خواندن یا نوشتن است. برای
نوشتن روی LCD ،باید R/W=0 باشد و برای خواندن اطلاعات از LCD باید R/W=1 باشد.
پایه 6 پایه فعال کردن (E) است.اگر در پایه
(E) پالسی از یک به صفر قرار داده شود،در اینصورت اطلاعاتی که در پایه های 7 تا 14
قرار دارند در ثبات های LCD ذخیره می شوند . به عبارت دیگر در لبه منفی پالس ورودی
به پایه E اطلاعات به LCD منتقل می شوند.
پایه های 7 تا 14، هشت بیت اطلاعات ارسالی به
LCD و یا دریافتی از آن می باشند. کد باینری دستورات و کد اسکی کاراکتر ها روی این
پایه ها قرار می گیرند.
پایه های 15 و 16 برای لامپ پشت LCD می باشند.
پیکره بندی LCD
اتصال پایه های LCD به میکروکنترلر
پیکره بندی زیر برای انتخاب پایه های میکرو متصل به LCD به
کار می رود.
CONFIG
LCDPIN=PIN,DB4=PN,DB5=PN,DB6=PN,DB7=PN,E=PN,RS=PN
و PN پایه ای دلخواه از میکرو است که به پایه
LCD اتصال می یابد.مثال:
_=Config Lcdpin = Pin , Db4 = Portb.0 , Db5 =
Portb.1 , Db6 = Portb.2 , Db7 Portb.3 , E = Portb.4 , Rs = Portb.5
که به طور مثال portb.0 یعنی پایه 0 از portb
.دقت کنید که به طور مثال میکرو atmega32 دارای چهار port است به نام های A,B,C,D
که هرکدام از این پورت ها دارای هشت پین یا پایه است و ترتیب شمارش این پایه ها در
BASCOM از صفر تا هفت است پس پایه صفر همان پایه یک حقیقی میکرو مورد نظر ماست.
تعیین نوع LCD
CONFIG LCD = LCD TYPE
LCD TYPE مشخص کننده تعداد ستون و سطر LCD می
باشد که می تواند یکی از موارد زیر باشد:
16x2 یا 16x1 یا 16x1a یا 16x4 یا 20x2 یا 20x4
یا 40x4 وغیره....مثال:
Config Lcd = 16 * 2"Lcd "helloEnd
دستورات مربوط به LCD
دستور LCD
این دستور یک عبارت ثابت یا متغیر را روی LCD
نمایش می دهد.
"LCD X ; LCD "STRING
در این دستور X متغیر و STRING ثابتی است که
نمایش داده می شود.همچنین همانطور که عبارت بالا مشاهده می شود برای نمایش چند
عبارت پشت سر هم بین آن ها علامت{;} استفاده می شود.
دستور CLS
این دستور باعث پاک شدن کل صفحه می شود.
"LCD"HELLO
CLS
دستور CURSOR
این دستور مکان نمای LCD را تنظیم می کند.
CURSOR ON/OFF BLINK/NOBLINK
که در این دستور ON روشن بودن مکان نما
راتنظیم می کند و در حالت روشن چشمک زدن آن را نیز توسط BLINK می توان فعال کرد و
OFF خاموش بودن مکان نما یا با حالت OFF NOBLINK خاموش بودن حالت چشمک زدن آن را
تنظیم کرد.
دستور HOME
این دستور مکان نما را به ترتیب در اولین ستون
سطر اول،سطر دوم،سطر سوم یا سطر چهارم قرار می دهد.
HOME U / L / T / F
دستور HOME به تنهایی باعث انتقال مکان نما به
سطر و ستون اول می شود.
دستور DISPLAY
این دستور صفحه نمایش LCD را خاموش (OFF) یا
روشن (ON) می کند.
DISPLAY ON / OFF
دستور SHIFT CURSOR
این دستور مکان نما LCD را یک واحد به چپ یا
راست منتقل می کند.
SHIFTCURSOR LEFT / RIGHT
دستور SHIFTLCD
این دستور کل صفحه نمایش LCD را یک واحد به چپ
یا راست منتقل می کند.
SHIFTLCD LEFT / RIGHT
دستور LOCATE
این دستور مکان نمای LCD را به مکانی به سطر(X)
و ستون (Y)منتقل می کند.
LOCATE X , Y دستور LOWERLINE
این دستور مکان نما را به خط پایین تر می برد.
دستور UPPERLINE این دستور مکان نما را به خط
بالاتر می برد.
دستور RIGHT با این دستور از سمت راست
رشته VAR1 ،به تعداد n کاراکتر جدا می شود و در متغیر VAR قرار میگیرد.
(VAR=RIGHT(var1,n
به مثال زیر توجه کنید:
Dim A As String * 10 , B As String * 10"A = "1234567(B
= Right(a , 4Lcd B
'lcd 4567End
دستور LEFT با این دستور از سمت
چپ رشته VAR1 ،به تعداد n کاراکتر جدا می شود و در متغیر VAR قرار می گیرد.
(VAR=LEFT(var1,n
به مثال زیر توجه کنید:
Dim A As String * 10 , B As String * 10"A = "ABCDEFGH(B =
Left(a , 3Lcd B
'lcd ABCEnd
دستور ROTATE
با این دستور می توان تمام بیت ها را به سمت چپ یا راست انتقال داد که LEFT/RIGHT
جهت چرخش بیت ها و گزینه اختیاری BITS تعداد چرخش بیت ها را مشخص می کند و در صورتی
که برای این گزینه مقداری تعریف نشود مقدار پیش فرض یک برای آن در نظر گرفته می
شود.
[ROTATE var ,LEFT/RIGHT [,BITS به مثال زیر دقت کنید:
Dim A As Byte
A = 128Rotate A , Right
Lcd A
'lcd 64End لازم می دونم که کمی بیشتر در مورد مثال بالا
توضیح بدم که برای این کار ابتدا باید با مبناهای ریاضی آشنا بشید.اصولاً در ریاضی
اعداد را در مبناهای مختلف از جمله BINARY (در مبنای دو)، OCTAL (در مبنای 8)،
HEXADECIMAL (در مبنای 16) و DECIMAL (در مبنای ده) به کار می برند که ما در برنامه
نویسی از سه مبنای BINARY ، HEXADECIMAL ، DECIMAL استفاده می کنیم به طوری که وقتی
عدد باینری را در متغیری قرار می دهیم آن را با نماد B& شروع می کنیم زمانی که عدد
هگزادسیمال را در متغیری قرار می دهیم آن را با نماد H& شروع می کنیم و برای قرار
دادن عدد در مبنای دسیمال از نماد خاصی استفاده نمی کنیم و آن را بدون علامت در
متغیر قرار می دهیم. اکنون به چگونگی تبدیل عدد از مبنای دسیمال به باینری می
پردازیم:
برای تبدیل عدد از مبنای دسیمال به باینری عدد مورد نظر را به طور
متوالی به عدد دو تقسیم می کنیم تا خارج قسمت از مقسوم الیه کوچکتر شود سپس از خارج
قسمت به سمت اولین باقیمانده عدد ها را می نویسیم که عدد بدست آمده معادل باینری
عدد ما خواهد بود.به مثال زیر توجه کنید:
باقیمانده
0 2/ 128 0
2/64 0
2/32 0
2/16 0 2/ 8
0 2/ 4 0
2/2
1
2(10000000)=128
همانطور که در مثال بالا دیدید معادل عدد 128
در مبنای باینری مساوی عدد (10000000) شد. که با توجه به این عدد متوجه می شویم که
تعداد این اعداد هشت تا است و ما در مثال مربوط به دستور ROTATE این مقدار را
(البته مقدار دسیمال آن را یعنی 128) در متغیر A قرار داده ایم که در واقع این هشت
عدد معادل هشت پایه پورت دلخواه ماست که در این مثال فقط پایه هشتم پورت دلخواه ما
یک است و بقیه پایه ها در وضعیت صفر(منطقی) به سر می برند که ما با دستور ROTATE
این مقدار یک را در پورت مربوطه به سمت راست می چرخانیم که کاربرد آن می تواند در
روشنایی ترتیبی LED باشد البته با هر بار استفاده از این دستور بیت مورد نظر فقط یک
بار می چرخد که ما برای استفاده از این دستور برای روشنایی ترتیبی LED باید آن را
داخل یک حلقه تکرار(در پست های آینده به طور مفصل راجع به این موضوع صحبت خواهیم
کرد) قرار دهیم.جدول LOOKUP با استفاده
از این دستور می توان مقدار دلخواهی را از جدول مربوطه خواند که LABLE نام جدول
مربوطه و VALUE شماره داده دلخواه در جدول است که شماره اولین داده جدول صفر است
یعنی شماره ها در جدول از صفر شروع می شود و داده خوانده شده از جدول در متغیر VAR
قرار می گیرد. (VAR=LOOKUP(value , lable
به مثال زیر توجه کنید:
Dim A As Byte
(A = Lookup(4 , FshLcd A
'lcd eEnd:Fsh
Data A , B , C , D , E , F , G , H , I , J , K
دستور MID با این دستور می توان قسمتی از رشته VAR1 را با شروع از کاراکتر st ام و طول L در متغیر VAR قرار داد. ([VAR=MID(var , st [, Lالبته گزینه L اختیاری می باشد و در صورتی که برای آن مقداری نوشته نشود بیشترین طول L در نظر گرفته می شود. به مثال زیر توجه کنید:Dim A As String * 10 , B As String * 10"A = "farzanshojaee(B = Mid(a , 7 , 7Lcd B 'lcd shojaeeEnd جدول دستورات ریاضی محیط BASCOMعلامتنماد علامت ضرب * علامت تقسیم / علامت ممیز . علامت جمع + علامت تفریق- علامت بتوان^ علامت مخالف علامت مساوی = علامت بزرگتر از > علامت بزرگتر یا مساوی با =4:statement ، یا Case 2 to 6 .به مثال زیر توجه کنید:Config Portc = InputA Alias PortcDo Select Case A Case 1 To 50 : Lcd A :Case Is > 50 A = A * 2 Lcd A End SelectLoopEnd می خواهیم در مورد پیکره بندی امکانات avr در محیط Bascom صحبت کنیم.ببینید دوستان هر مدل از سری میکروکنترلر های Avr دارای امکانات داخلی می باشند مانند :تایمرها-کانترها و منابع وقفه و مبدل آنالوگ به دیجیتال و ارتباطات سریال می باشند که هر کدام به جای خود توضیح داده می شوند.ما برای استفاده از این امکانات ابتدا باید آن ها را پیکره بندی کنیم یعنی با استفاده از زبان برنامه نویسی به میکرو کنترلر بفهمانیم که از کدام امکانات آن می خواهیم استفاده کنیم بعد از آن باید با دستورات مختلف این امکانات را مدیریت کنیم. در این پست به نحوه پیکره بندی و استفاده از تایمر-کانترها و همچنین پیکره بندی صفحه کلید ماتریسی(Keypad) و استفاده از آن می پردازیم.پیکره بندی صفحه کلید های ماتریسیبرای پیکره بندی این صفحه کلید ها از دستور زیر استفاده می شود که در آن portx می تواند یکی از پورت های میکروکنترلر باشد که صفحه کلید به آن وصل می شود (این صفحه کلید ها همانطور که در شکل می بینید دارای 8 پایه برای اتصال به میکروکنترلر هستند) و مقدار Debounce بر حسب میلی ثانیه مدت زمانی است که میکرو در تشخیص کلید فشرده شده صبر می کند و دوباره وضعیت پایه را بررسی می کند و اگر تغییری نکرده بود آن را به منزله فشرده شدن کلید در نظر می گیرد و این به دلیل آن است که کلید هایی که به طور مکانیکی فشرده می شوند مدت زمانی در حدود 20 میلی ثانیه لرزش بین مقدار 0 و 1 ایجاد می کنند که این مسئله میکرو را در تشخیص کلید فشرده شده گمراه می کند که استفاده از مقدار 20 بر حسب میلی ثانیه برای Debounce این مشکل را حل می کند و مقدار اختیاری Delay زمانی استفاده می شود که صفحه کلید به طور مداوم اسکن می شود و مدت زمانی است بین فشرده شدن دو کلید که مقدار 100 میلی ثانیه برای آن ایده آل است.[ config KBD=portx, Debounce=x,[Delay=xعکس مربوط به اتصال keypad به atmega32پس از اینکه توسط دستور بالا صفحه کلید را پیکره بندی کردیم نوبت به آن رسیده که توسط دستور زیر عدد فشرده شده از صفحه کلید را در یک متغیر بریزیم این دستور تا زمانی که کلیدی فشرده نشده باشد عدد 16 را در متغیر مربوطه قرار می دهد و در زمان فشرده شدن کلید عدد متناسب با آن را از بین 0 تا 15 در متغیر قرار می هد.( )var=GETKBDوستان طبق برگه های اطلاعاتی که برای هرمدل از میکرو وجود دارد هر کدام دارای یک یا چند تایمر-کانتر هستند که ما می توانیم از آن ها هم به عنوان تایمر بسیار دقیق استفاده کنیم یا به عنوان کانتر که پالس های ورودی به پایه های T0 ، T1،.... را شمرده در واقع محتوای این کانترها با یک پالس که مقدار آن از صفر به یک متغیر است یک واحد افزایش می یابد. که از این خاصیّت می توان برای اندازه گیری فرکانس موج های خارج از میکرو استفاده کرد.با استفاده از دستور زیر می توان تایمر-کانترها را در مد تایمر پیکره بندی کرد که در آن x یکی از اعداد 0،1،2،3 به معنی تایمر 0 یا یک و... است و عبارت PRESCALE می تواند یکی از موراد 1024،256،64،8،1 باشد که این عدد تقسیمی از فرکانس کریستال مورد استفاده در میکرو است به عنوان مثال اگر فرکانس کریستال مورد استفاده برابر 8 مگاهرتز باشد و مقدار PRESCALE برابر 8 آنگاه فرکانس پالس اعمالی به تایمر برابر 1=8/8 یک مگاهرتز خواهد بود.Config timerX=timer ,PRESCALE=1 / 8 / 64 / 256 / 1024در دستور بالا چنانچه Timerx را Timer0 قرار دهیم و آن را مساوی با timer قرار دهیم Timer0 را در مُد تایمر پیکره بندی کرده ایم .دوستان اصولاً محتوای یک تایمر تا مقدار مشخصی با هر پالس ساعت افزایش می یابد و پس از آن دوباره صفر می شود که این مقدار مشخص در تایمر های هشت بیتی عدد ۲۵۶ و در تایمر های شانزده بیتی عدد ۶۵۵۳۶ است که تایمر وقتی در مد تایمر پیکره بندی می شود با شمردن تا این مقدار سرریز شده و دوباره صفر می شود و یک بیت پرچم را در رجیستر میکروکنترلر یک می کند که کاربر می تواند با نظارت بر این بیت برنامه خود را بنویسد، که تایمر صفر یک تایمر هشت بیتی است و تایمر یک، یک تایمر شانزده بیتی است و تایمر دو، یک تایمر هشت بیتی است و تایمر سه، یک تایمر شانزده بیتی است.با استفاده از فرمول زیر می توان حداکثر زمان تأخیری که می توان توسط یک تایمر هشت بیتی ایجاد کرد را محاسبه نمود که در آن Fosc فرکانس کریستال مورد استفاده میکرو و PRESCALE تقسیمی از فرکانس کریستال مورد استفاده میکرو است که به شمارنده تایمر اعمال می شود. که برای محاسبه زمان تأخیر تایمر های شانزده بیتی از عدد 65536 به جای عدد 256 در فرمول استفاده می شود.PRESCALE*256 / Fosc با استفاده از دستور زیر می توان مقدار اولیه ای را در رجیستر شمارنده تایمر قرار داد که در اینصورت تایمر از عدد مورد نظر شروع به شمارش کرده در نتیجه به میزان عدد مورد نظر از 256 کمتر شمرده می شود و برای محاسبه زمان تأخیر عدد مورد نظر را از 256 کم کرده و در فرمول قرار می دهیم. که در آن value عدد مورد نظر است.TimerX= valueدر مثال زیر مقدار PRESCALE برابر با 1024 و فرکانس کریستال برابر یک مگاهرتز است و مقدار اولیه 10 در رجیستر شمارنده تایمر قرار داده شده است که طبق فرمول 1000000/246*1024 میزان تأخیر برابر با 251 میلی ثانیه است یعنی تایمر هر 251 میلی ثانیه یک بار سرریز می شود. همانطور که مشاهده می کنید عدد 10 از 256 کم شده و عدد 246 در فرمول قرار گرفته است."regfile="m32def.dat$crystal=1000000$config timer0=timer , prescale=1024timer0 = 10و با استفاده از دستور زیر می توان مقدار تایمر را خواند و در متغیر Var قرار داد.Var= TimerXاکنون که تایمر را در مد تایمر پیکره بندی کردید و نحوه ایجاد تأخیرهای مختلف با آن را فرا گرفتید می توانید با استفاده از دستور Start TimerX تایمر X را شروع به شمارش کنید و با استفاده از دستور Stop TimerX آن را متوقف کنید. نکته دیگری که می ماند آن است که تایمر هر بار که سرریز می شود یک پرچم به نام Ovf 0 را یک می کند که شما برای نظارت بر این پرچم می توانید از دستورات وقفه استفاده کنید طوری که میکرو طبق روال دستورات برنامه را انجام می دهد و به محض بروز سرریز شدن تایمر و یک شدن پرچم Ovf X اجرای دستورات به بر چسب مربوطه پرش کرده و پس از اتمام مراحل دوباره به بدنه اصلی برنامه باز می گردد اما برای استفاده از وقفه ابتدا باید توسط دستور enable interrupts اجازه کلی استفاده از تمامی وقفه ها داده شود [این دستور امکان استفاده از تمامی وقفه ها را می دهد] سپس توسط دستور enable TimerX وقفه مربوط به تایمرها را فعال کرد و در نهایت با استفاده از دستور ON Ovf X Lable در صورت یک شدن هریک از بیت پرچم های Ovf 0 ، Ovf 1 ، Ovf 2 یا Ovf 3 به برچسب Lable که در پایان برنامه بعد از دستور End قرار می گیرد پرش کرد. هر مدلی از میکروهای avr که دارای چند تا از این تایمر ها هستند هرکدام از این تایمر ها یک پایه به عنوان ورودی به نام های T0و T1 و... دارند که عدد بعد از T نشان دهنده تایمر مورد نظر می باشد مثلاْ : T0 نشان دهنده پایه ورودی پالس به تایمر صفر است که با هر پالسی که(یک سیکل)که به این پایه می رسد محتوای این کانتر یک واحد افزایش می یابد.برای پیکر بندی تایمر ها در مد کانتر از دستور زیر استفاده می کنیم که در آن x شماره تایمر مورد نظر(مثلاْ TIMER0) می باشد و با انتخاب Edge=Rising محتوای کانتر با لبه بالا رونده سیگنال ورودی افزایش می یابد و با انتخاب Edge=Falling محتوای کانتر با لبه پایین رونده سیگنال ورودی افزایش می یابد.Config Timerx = Counter , Edge = Rising / Fallingهمانطور که در پست قبل به آن اشاره شد تایمر بر اساس اینکه هشت بیتی باشد یا شانزده بیتی می تواند تا حداکثر ۲۵۵(هشت بیتی) و ۶۵۵۳۵(شانزده بیتی) را بشمرد که وقتی کانتر تا این مقدار را شمرد یکی از پرچم های وقفه ovfx را یک می کند که در آن x شماره تایمر مورد نظر است که با استفاده ار دستوراتی که در پست قبل به آن ها اشاره شد می توان بر آن ها نظارت کرد.
۹۰/۰۹/۰۴