بازگشت   پی سی سیتی > تالار علمی - آموزشی و دانشکده سایت > دانشگاه ها > فنی و مهندسی

فنی و مهندسی در این زیر تالار به بحث و گفتگو در مورد رشته های فنی و مهندسی پرداخته میشود

پاسخ
 
ابزارهای موضوع نحوه نمایش
  #1  
قدیمی 10-20-2008
دانه کولانه آواتار ها
دانه کولانه دانه کولانه آنلاین نیست.
    مدیر کل سایت
        
کوروش نعلینی
 
تاریخ عضویت: Jun 2007
محل سکونت: کرمانشاه
نوشته ها: 12,701
سپاسها: : 1,382

7,486 سپاس در 1,899 نوشته ایشان در یکماه اخیر
دانه کولانه به Yahoo ارسال پیام
پیش فرض دستورات مربوط به Lcd - میکروکنترلرها

دستورات مربوط به LCD - میکروکنترلرها





در این قسمت ادامه دستورات کامپایلر PIC Simulator IDE شرح داده می شود. این دستورات مربوط به ارتباط میکروکنترلر با LCD می باشد. برای اینکه بتوانید در این نرم افزار به زبان بیسیک برنامه نویسی نمائید ابتدا برنامه را باز کنید و روی منوی TOOLS رفته و سپس Basic Compiler را انتخاب نمائید.
اکنون ادامه دستورات:
دستورات:
قبل از مطالعه این دستورات بهتر است که با LCD و روش های ارتباط با آن آشنایی داشته باشید.
DEFINE
فرم کلی دستور:
DEFINE command
قبل از هر چیز درباره دستور DEFINE توضیح می دهم. برخی از دستورات دارای مقادیر پیش فرض هستند که با دستور DEFINE می توان مقدار دلخواه را مشخص نمود. در مثال ها کاربرد این دستور را مشاهده خواهید نمود.
________________________________________
LCD_BITS
فرم کلی دستور:
DEFINE LCD_BITS = 4 OR 8
این دستور مشخص می سازد که پورت اطلاعات LCD چهاربیتی است یا هشت بیتی (به روش های ارتباط با LCD مراجعه نمائید.)
مقدار پیش فرض 4 است.
________________________________________
LCD_DREG
فرم کلی دستور:
DEFINE LCD_DREG = PORTA OR PORTB OR PORTC OR PORTD
مشخص می سازد که خطوط دیتای LCD به کدام پورت میکرو متصل است . که یکی از پورت های فوق باید انتخاب شود.
مقدار پیش فرض PORTB است.
________________________________________
LCD_DBIT
فرم کلی دستور:
DEFINE LCD_DBIT = 0 or 4
این دستور زمانی کاربرد دارد که BUS چهار بیتی باشد. و برای باس 8 بیتی تعریف نشده .
این دستور مشخص می سازد که BUS به 4 بیت کم ارزشتر از پورت میکرومتصل است هرگاه صفر انتخاب شود و همچنین باس به 4 بیت با ارزش تر از پورت میکرو متصل است ، هرگاه 4 انتخاب شود.
مقدار پیش فرض 4 است.
________________________________________
LCD_RSREG
فرم کلی دستور:
DEFINE LCD_RSREG = PORTA OR PORTB OR PORTC OR PORTD
مشخص می سازد که پایه RS از LCD به کدام پورت از میکرو متصل شده.
مقدار پیش فرض PORTB است.
________________________________________
LCD_RSBIT
فرم کلی دستور:
DEFINE LCD_RSBIT = شماره پین پورت مشخص شده
مشخص می سازد که پایه RS از LCD به کدام پین از پورت میکرو که با دستور قبل مشخص شده است ، متصل شده.
مقدار پیش فرض 3 است.
________________________________________
LCD_EREG
فرم کلی دستور:
DEFINE LCD_EREG = PORTA OR PORTB OR PORTC OR PORTD
مشخص می سازد که پایه Enable از LCD به کدام پورت از میکرو متصل شده.
مقدار پیش فرض PORTB است.
________________________________________
LCD_EBIT
فرم کلی دستور:
DEFINE LCD_EBIT = شماره پین پورت مشخص شده
مشخص می سازد که پایه Enable از LCD به کدام پین از پورت میکرو که با دستور قبل مشخص شده است ، متصل شده.
مقدار پیش فرض 2 است.
________________________________________
LCD_RWREG
فرم کلی دستور:
DEFINE LCD_RWREG = PORTA OR PORTB OR PORTC OR PORTD
مشخص می سازد که پایه R/W از LCD به کدام پورت از میکرو متصل شده.
مقدار پیش فرض 0 است.
________________________________________
LCD_RWBIT
فرم کلی دستور:
DEFINE LCD_RWBIT = شماره پین پورت مشخص شده
مشخص می سازد که پایه R/W از LCD به کدام پین از پورت میکرو که با دستور قبل مشخص شده است ، متصل شده.
مقدار پیش فرض 0 است.
________________________________________
LCD_COMMANDUS
فرم کلی دستور:
DEFINE LCD_COMMANDUS = زمان برحسب میکروثانیه
مدت زمان تاخیر که پس از اجرای هر فرمان لازم است را مشخص می سازد.
مقدار پیش فرض 5000 میکروثانیه است.
________________________________________
LCD_DATAUS
فرم کلی دستور:
DEFINE LCD_DATAUS = زمان بر حسب میکروثانیه
مدت زمان تاخیر که پس از هربار ارسال اطلاعات روی LCD لازم است را مشخص می سازد.
مقدار پیش فرض 50 است.
________________________________________
LCD_INITMS
فرم کلی دستور:
DEFINE LCD_INITMS = زمان بر حسب میلی ثانیه
این دستور مدت زمان تاخیر برای دستور LCDINIT را مشخص می کند.
مقدار پیش فرض 100 است.
________________________________________
توجه: در هنگام استفاده از سه دستور اخیر در هنگام شبیه سازی با برنامه ، کمترین مقدار ممکن را برای آن ها در نظر بگیرید.
هر یک از دستورات فوق دارای مقادیر پیش فرض هستند لذا هرگاه هر یک از دستورات فوق را تایپ نکردید ، کامپایلر مقدار پیش فرض را برای آن پارامتر یا متغیر در نظر می گیرد. به عنوان مثال هرگاه دستور LCD_RWREG را در برنامه تایپ ننمودید کامپایلر هیچ پینی از پورت های میکروکنترلر را به پایه R/W از LCD اختصاص نمی دهد.
________________________________________
LCDINIT
فرم کلی دستور:
LCDINIT 0 or 1 or 2 or 3
این دستور باید قبل از اولین دستورفرمان (LCDCMDOUT) و اولین دستور ارسال اطلاعات (LCDOUT) قرار گیرد
اگر هیچ مقداری برای این دستور مشخص نشود و یا مقدار صفر برای آن مشخص شود ، مکان نمای LCD خاموش خواهد بود.
اگر مقدار 1 برای این دستور مشخص شود ، مکان نمای LCD چشمک زن خواهد بود.
اگر مقدار 2 برای این دستور مشخص شود ، مکان نمای LCD به صورت underline ثابت خواهد بود.
گر مقدار 3 برای این دستور مشخص شود ، مکان نمای LCD به صورت underline چشمک زن خواهد بود.
________________________________________
LCDOUT
این دستور برای ارسال اطلاعات روی LCD به کار می رود. با این دستور می توان مقادیرعددی ثابت ، متغیر رشته ای و متغیر ارسال نمود. و با استفاده از علامت (,) می توان ترکیبی از موارد فوق را ارسال نمود:
LCDOUT "mehdi_mosafard" عبارت داخل گیومه را روی LCD نمایش می دهد.
LCDOUT #A محتوای متغیر A را به صورت دسیمال روی LCD نمایش می دهد.
LCDOUT "vis.ir,#A

LCDOUT A کاراکتر اسکی محتوای متغیر A راروی LCD نمایش می دهد
________________________________________
LCDCMDOUT
این دستور برای ارسال فرمان روی LCD به کار می رود. با این دستور می توان مقادیرعددی ثابت ، متغیر رشته ای و متغیر ارسال نمود. و با استفاده از علامت (,) می توان ترکیبی از موارد فوق را ارسال نمود.
مثلا دستور زیر مشخص می سازد که مکان نما پس از نوشتن هر حرف یا عدد به سمت راست شیفت پیدا کند:
DIM A AS BYTE
A = 6
LCDCMDOUT #A
درسته که با روش فوق می توان فرمان ها را به LCD ارسال نمود اما این کامپایلر روش دیگری نیز برای این عمل در نظر گرفته است و آن استفاده از کلمات و دستورات کلیدی زیر است:
LCDCLEAR صفحه LCD پاک شود:
LCDHOME مکان نما در بالاترین سطر و در آخرین ستون سمت چپ قرار می گیرد
LCDLINE2HOME مکان نما در سطر دوم و آخرین ستون سمت چپ قرار می گیرد
LCDLEFT با هربار اجرای این دستور مکان نما یک کاراکتر به سمت چپ می رود
LCDRIGHT با هربار اجرای این دستور مکان نما یک کاراکتر به سمت راست می رود
LCDSHIFTLEFT با هربار اجرای این دستور تمامی کاراکترها به اندازه یک کاراکتر به سمت چپ شیفت پیدا می کنند
LCDSHIFTRIGHT با هربار اجرای این دستور تمامی کاراکترها به اندازه یک کاراکتر به سمت راست شیفت پیدا می کنند
LCDLINE1CLEAR تمامی کاراکترهای سطر اول را پاک می کند
LCDLINE2CLEAR تمامی کاراکترهای سطر دوم را پاک می کند
موقعیت مکان نما در سطر اول را مشخص می سازد. داخل پرانتز باید عددی بین 1 تا 40 باشد که شماره خانه ای که مکان نما در آن قرار می گیرد را (از سمت چپ) مشخص می سازد:
LCDLINE1POS( )
موقعیت مکان نما در سطردوم را مشخص می سازد. داخل پرانتز باید عددی بین 1 تا 40 باشد که شماره خانه ای که مکان نما در آن قرار می گیرد را (از سمت چپ) مشخص می سازد
LCDLINE2POS( )
________________________________________
LCDDEFCHAR
فرم کلی دستور:
LCDDEFCHAR v,a1,a2,a3,a4,a5,a6,a7,a8
از این دستور برای تعریف کاراکتر دلخواه کاربراستفاده می شود. مثلا اگر شما بخواهید که کاراکتر یک عدد پارسی و یا حرف پارسی را ایجاد نمائید و در پروژه تان از آن استفاده نمائید ، می توانید با استفاده از این دستور این کار را انجام دهید. اما محدودیتی وجود دارد و آن این است که بیش از 8 کاراکتر نمی توانید تعریف کنید دلیل این موضوع هم مربوط می شود به خود LCD های کاراکتری. این LCD ها دارای ثباتی با نام CGRAM می باشند که CG مخفف عبارت Character Cenerator (سازنده کاراکتر) می باشد. تعداد این ثبات ها 8 عدد می باشد ( cgram0 - cgram7) لذا بیشتر از 8 کاراکتر نمی توان ساخت. هر یک از این CGRAM ها دارای 8 بایت می باشد که این هشت بایت در واقع نقاط روشن و خاموش را در مکان کاراکترها مشخص می سازند:

شکل فوق مکان یک کاراکتر روی LCD را نشان می دهد. هر مکانی از 5 ستون و 8 سطر متشکل از نقاط ریز تشکیل شده است.
همانطور که قبلا گفته شد ثبات CGRAM دارای هشت بایت می باشد که هر یک از این 8 بایت به یکی از سطرهای شکل فوق مربوط می شود و 5 بیت کم ارزش هر یک از آن 8 بایت به ستون های فوق مربوط می شود. مقدار 1 منطقی نقطه ای را روشن می سازد و مقدار 0 منطقی نقطه ای را خاموش می سازد.
اما دستور LCDDEFCHAR (LCDDEFCHAR v,a1,a2,a3,a4,a5,a6,a7,a8 ) اولین آرگومان این دستور یعنی v می تواند مقادیری از 0 تا 7 داشته یاشد که در واقع شماره n امین کاراکتر تعریف شده را مشخص می سازد و قبلا ذکر شده بود که فقط 8 کاراکتر می توان تعریف نمود.
اما مقادیر a1 تا a8 هر یک به یکی از ستون های شکل فوق مریوط می شود- از بالا به پایین- بطوریکه a1 به بالاترین ستون و a8 به پایین ترین ستون. مقادیر a1 تا a8 هم می تواند به صورت دسیمال باشد و هم یه صورت باینری.
برای ارسال هریک از کاراکترهای تعریفی کافیست که از دستور lcdout استفاده شود. به این صورت که ابتدا دستور LCDOUT را نوشته و سپس شماره کاراکتر تعریف شده را می نویسیم. در مثال زیر 2 کاراکتر تعریف نمده ایم یکی عدد 3 و دیگری حرف ب :
Lcddefchar 0, %00000, %10101, %11111, %10000, %10000, %10000, %10000, %00000
Lcddefchar 1, %00000, %00000, %00000, %10001, %11111, %00100, %00000, %00000
lcdout 0
lcdout 1
نکته ی مهمی که درباره این کاراکترها باید مورد توجه قرار گیرد اینست که اولین کاراکتر ارسالی از این نوع در home (بالاترین و اولین خانه از سمت چپ lcd) قرار می گیرد و سپس می توان با دستورات شیفت دهنده کاراکتر مورد نظر را به خانه دلخواه انتقال داد.

________________________________________
چند مثال:
1:
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
DEFINE LCD_COMMANDUS = 10000
DEFINE LCD_DATAUS = 100
DEFINE LCD_INITMS = 1000
LCDINIT
loop:
LCDOUT "vis.ir!"
WAITMS 1000
LCDCMDOUT LcdClear
WAITMS 1000
GOTO loop
2:
DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2
DEFINE LCD_COMMANDUS = 10000
DEFINE LCD_DATAUS = 100
DEFINE LCD_INITMS = 1000
DIM A AS WORD
A = 65535
LCDINIT 3
WAITMS 1000
loop:
LCDOUT "I am counting!"
LCDCMDOUT LcdLine2Home
LCDOUT #A
A = A - 1
WAITMS 250
LCDCMDOUT LcdClear
GOTO loop
3:
LCDDEFCHAR 0, 10, 10, 10, 10, 10, 10, 10, 10
LCDDEFCHAR 1, %11111, %10101, %10101, %10101, %10101, %10101, %10101, %11111
LCDOUT 0, 1, "Hello!", 1, 0

________________________________________
نرم افزار PIC Simulator IDE دارای 6 نوع LCD از نوع کاراکتر و عدد می باشد که در قسمت SETUP ماژول LCD این نرم افزار می توان هر یک از آن ها را بسته به نوع پروژه ، برای شبیه سازی انتخاب نمائید. این 6 نوع عبارتند از:
1 X 16 - 2 X 16 - 4 X 16 - 2 X 20 - 4 X 20 - 2 X 40
تمامی دستورات فوق برای هر یک از این 6 نوع LCD صادق است.


منبع http://www.vis.ir
__________________
مرا سر نهان گر شود زير سنگ -- از آن به كه نامم بر آيد به ننگ
به نام نكو گر بميــرم رواست -- مرا نام بايد كه تن مرگ راست



پاسخ با نقل قول
  #2  
قدیمی 10-20-2008
دانه کولانه آواتار ها
دانه کولانه دانه کولانه آنلاین نیست.
    مدیر کل سایت
        
کوروش نعلینی
 
تاریخ عضویت: Jun 2007
محل سکونت: کرمانشاه
نوشته ها: 12,701
سپاسها: : 1,382

7,486 سپاس در 1,899 نوشته ایشان در یکماه اخیر
دانه کولانه به Yahoo ارسال پیام
پیش فرض میکروکنترلر 8051 - آزمایش میکروکنترلر 8051

میکروکنترلر 8051 - آزمایش میکروکنترلر 8051

آزمایش اول : اتصال یک LED به میکروکنترلر



خوب اگه وسایل و قطعات لیست مذکور را تهیه کردید ، نرم افزار Keil را دانلود و نصب کرده و به راحتی میتونید یک پروژه ی جدید ایجاد کنید ، پروگرامر شرح داده شده در بالا را ساخته و تست کردید و منبع تغذیه ی 5+ولت را هم ساختید ، میریم سراغ اولین و در واقع ساده ترین آزمایش که اتصال یک LED به میکروکنترلر و روشن و خاموش کردن آن است . در این آزمایش ما دو هدف را دنبال میکنیم : 1_ اتصال صحیح یک LED به میکرو و 2_ ایجاد یک تأخیر یک ثانیه ای نسبتاً دقیق با استفاده از تایمر صفر . قبل از اینکه به سراغ آزمایشهای بعدی بریم ، باید این تذکر را بدم که من توی این وبلاگ قصد آموزش برنامه نویسی اسمبلی را ندارم و فرض را بر این میگذارم که شما با دستورات اسمبلی و نحوه ی کاربرد اونها کاملاً آشنا هستید .

از اونجائیکه پورتهای میکروکنترلرهای سری 8051 فقط در حالت خروجی صفر جریاندهی خوبی دارند و جریان دهی پورتها در حالت خروجی یک ، برای روشن کردن یک LED کافی نیست ، در اینجا پایه ی کاتد LED را به میکرو وصل کرده و پایه ی آند LED را هم با یک مقاومت 470 اهم به 5+ولت وصل می کنیم . لازمه به این نکته اشاره کنم که LED هایی مورد استفاده من از نوع مرغوب هستند که حتی با یک مقاومت 7/4 کیلو اهم هم روشن می شوند و فکر کنم در اکثر شهرها هم از این نوع LED پیدا میشه .

برتامه ی میکرو را هم در زیر مشاهده می کنید . در این برنامه از تایمر صفر در مود یک استفاده شده که با توجه به مقداردهی اولیه پس از 62500 میکرو ثانیه سر ریز می کند و پس از هر بار سر ریز محتوای رجیستر R2 با دستور Djnz یک واحد کم می شود . با توجه به مقداردهی اولیه این رجیستر که عدد 16 هست ، سرانجام پس از 16 بار تکرار حلقه مذکور زمانی برابر 62500*16 میکرو ثانیه یا 1000000 میکروثانیه سپری خواهد شد که همان یک ثانیه می باشد . پس از گذشت زمان یک ثانیه وضعیت پایه ی P0.0 که LED به آن متصل است معکوس می شود و پس از مقدار دهی دوباره ی R2 برنامه مجدداً وارد حلقه ی تاخیر می شود .

Org 0H

Sjmp Main



Main: Mov Tmod,#01H

Mov r2,#16

Initialize: Mov Th0,#0BH

Mov Tl0,#0DBH

Setb Tr0

Jnb Tf0,$

Clr Tr0

Clr Tf0

Djnz r2,Initialize

Cpl P0.0

Mov r2,#16

Sjmp Initialize



End
==================
========================
========================
==================


آزمایش دوم : اتصال سون سگمنت به میکروکنترلر

با امید به اینکه اولین آزمایش را با موفقیت انجام دادید ، میریم سراغ آزمایش دوم که اتصال یک سون سگمنت به میکرو کنترلر و ساختن یک شمارنده هست . البته سون سگمنتی که من در لیست قطعات مورد نیاز آورده بودم از نوع 4 تایی مالتی پلکس شده هست و لازم میدونم تا قبل از اینکه به سراغ مطالب بعدی بریم مختصری در مورد تکنیک مالتی پلکس برای روشن کردن چندین سون سگمنت روی یک مسیر a ،b ،c ،d ،e ،f و g مشترک توضیح بدم .

برای اتصال مستقیم و بدون واسطه ی چندین سون سگمت به میکروکنترلر (بدون استفاده از تراشه های مبدل BCD به سون سگمنت مانند 7448 ) که سون سگمنتها به همون دلیلی که در مورد اتصال LED به میکروکنترلر گفتم حتماً بایستی از نوع آند مشترک باشند دو روش وجود دارد . روش اول اینه که هر سون سگمنت را به یکی از پورتهای میکرو وصل کنید . البته مقاومتهای محدود کننده ی جریان را هم که بین پایه های a تا g سون سگمنت و پورتهای میکرو قرار میگیرند نباید فراموش کنید . در صورت عدم قرار دادن این مقاومتها که مقدار آنها بسته به کیفیت سون سگمنت مورد استفاده بین 470اهم تا 5/1 کیلو اهم میتونه باشه ، هم سون سگمنتها و هم پورتهای میکرو آسیب میبینه . آند سون سگمنتها هم مستقیماً به 5+ ولت تغذیه وصل میشه . استفاده از این روش وقتی که تعداد سون سگمنتها بیشتر از یکی باشه و بخواهیم قطعات دیگه ای مثل صفحه کلید و یا مبدل آنالوگ به دیجیتال(ADC) و یا بالعکس (مبدل دیجیتال به آنالوگ یا DAC) را هم به میکرو متصل کنیم ، غیر ممکنه . زیرا میکروکنترلر 4 تا پورت بیشتر نداره و نمیشه همزمان چند تا سون سگمنت ، یک صفحه کلید و یک ADC را به میکرو وصل کرد . البته وقتی هر یک از سون سگمنتها را به یکی از پورتها وصل کنیم برنامه نویسی خیلی آسون میشه ولی در مقایسه با محدودیتی که از نظر سخت افزار برای ما ایجاد میکنه اهمیتی نداره .

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

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

البته امروزه دیگر لازم نیست که شما 4 عدد سون سگمنت آند مشترک تهیه کرده و آنها را بصورت مالتی پلکس به هم متصل کنید زیرا 4 عدد سون سگمنت مالتی پلکس شده به طور حاضری در دو نوع مشترک و کاتد مشترک تقریباً در همه ی مغازه های قطعات الکترونیک به فروش می رسد که از کیفیت خوبی هم برخوردار است . تنها موردی که شما می بایستی مد نظر داشته باشید آن است که نوع آند مشترک را بخرید . برای راحتی شما ترتیب پایه ها در این نوع از سون سگمنتها را هم از نمای روبرو در شکل زیر آوردم که خودتون هم به راحتی میتونید ترتیب پایه ها را تشخیص بدین .



B A2 A3 f a A4





A1 g c p d e

بعد از توضیحاتی در مورد نحوه ی اتصال سون سگمنت به میکروکنترلر به سراغ نحوه ی اتصال یک کلید فشاری که در بازار به تاچ سوئیچ معروف هست میریم . به طور کلی اتصال کلید های فشاری به میکرو کنترلر برای وارد کردن مقادیر ورودی و تنظیم پارامترهای یک مدار ساخته شده توسط میکروکنترلر بسیار مرسوم است . عمل این کلیدها بدین صورت است که با فشرن کلید اتصال بین پایه های آن برقرار شده و با قطع فشار بر روی کلید این اتصال نیز قطع می شود . این کلیدها در دو نوع 2 و 4 پایه در بازار موجود می باشند که در نوع 4 پایه ، 2 تا از پایه ها از داخل کلید به همدیگر متصل هستند و در مجموع همان 2 پایه را عرضه میکنند که شما بهتر است برای آسانی کار از همان نوع 2 پایه استفاده کنید . برای اتصال کلید های 2 پایه به میکرو یکی از پایه ها را به زمین تغذیه یا همان صفر ولت و پایه ی دیگر را هم به یکی از پایه های میکرو وصل کنید . بهتر است این پایه متعلق به یکی از پورتهای 1 ، 2 یا 3 باشد . زیرا این پورتها مقاومتهای بالا کش درونی دارند و به همین دلیل پایه ی مورد نظر که کلید به آن وصل است در حالت عادی که کلید فشرده نشده در سطح منطقی یک بوده و پس از آنکه کلید فشرده شود به سطح منطقی صفر می رود و از اینرو میتوان توسط کنترل وضعیت منطقی پایه ای که کلید به آن متصل است به فشرده شدن کلید پی برد . البته شما می توانید از پورت P0 نیز برای اتصال کلید استفاده کنید به شرطی که مقاومت بالا کش خارجی به کار ببرید یعنی توسط یک مقاومت حدوداً 7/4 کیلو اهمی از خارج پایه ای که کلید به آن متصل شده را به 5+ ولت وصل کنید . سخت افزارکامل این آزمایش را که یک شمارنده ی پالس هست میتونید از اینجا دانلود کنید .

پس از توضیحات مفصل در باره ی سخت افزار به سراغ نرم افزار میریم که مطمئن هستم خیلی منتظرش هستین . نرم افزار را در زیر مشاهده میکنید و توضیحات در مورد آنرا هم پس از آن آوردم .



Zero Equ 0C0H

One Equ 0F9H

Two Equ 0A4H

Three Equ 0B0H

Four Equ 99H

Five Equ 92H

six Equ 82H

Seven Equ 0F8H

Eight Equ 80H

Nine Equ 90H

Timer0_Preload Equ -5000

seven_segment Data P0

anode1 Bit P3.0

anode2 Bit P3.1

anode3 Bit P3.2

anode4 Bit P3.3

Pulse_Input Bit P1.0



Org 0H

Sjmp Main

;----------------

Org 0BH

Ajmp Multiplex

;-----------------

Main: Mov Tmod,#01H

Mov IE,#82H

Mov Tl0,#low Timer0_Preload

Mov Th0,#high Timer0_Preload

Mov Dptr,#Number_Codes

Mov r2,#0

Mov 30H,#0

Mov 31H,#0

Mov 32H,#0

Mov 33H,#0

Mov 34H,#0

Mov 35H,#zero

Mov 36H,#zero

Mov 37H,#zero

Mov 38H,#zero

Setb Tr0

Pulse_Check: Jb Pulse_Input,$

Acall Delay

Jb Pulse_Input, Pulse_Check

Mov a,30H

Add a,#1

Da a

Mov 30H,a

jnz Updade_Numbers

Mov a,31H

Add a,#1

Da a

Mov 31H,a



Mov 32h,31H

Acall Decode

Mov 37H,33H

Mov 38H,34H



Updade_Numbers: Mov 32h,30H

Acall Decode

Mov 35H,33H

Mov 36H,34H



Jnb Pulse_Input,$

Sjmp Pulse_Check

;-----------------

Decode: Mov a,32H

Anl a,#0Fh

Movc a,@a+dptr

Mov 33H,a



Mov a,32H

Swap a

Anl a,#0Fh

Movc a,@a+dptr

Mov 34H,a



Ret

;-----------------

Delay: Mov 39H,#50

Back: Mov 3AH,#100

Djnz 3AH,$

Djnz 39H,Back

ret

;-----------------------------

Multiplex: Clr Tr0

Mov Tl0,#low Timer0_Preload

Mov Th0,#high Timer0_Preload

Setb Tr0

Inc r2



Cjne r2,#1,Show_Dahgan

Clr anode4

Mov seven_segment,35H

Setb anode1

Reti



Show_Dahgan: Cjne r2,#2,Show_Sahgan

Clr anode1

Mov seven_segment,36H

Setb anode2

Reti



Show_Sahgan: Cjne r2,#3,Show_Yekanhezar

Clr anode2

Mov seven_segment,37H

Setb anode3

Reti



Show_Yekanhezar: Mov r2,#0

Clr anode3

Mov seven_segment,38H

Setb anode4

Reti

;----------------------------

Cseg at 180H

Number_Codes: db Zero,One,Two,Three,Four,Five,Six,Seven,Eight,Nine

End



همون طوری که می بینید نرم افزار این آزمایش نسبتاً طولانی هست و به نظر پیچیده میاد ولی نترسید . در واقع در نوشتن این برنامه که میتونه بعنوان زیربنای بسیاری از برنامه های بعدی باشه از روشهای زبانهای برنامه نویسی حرفه ای مثل C استفاده کردم تا قابلیت فهم برنامه و استفاده از زیر روالها در برنامه های دیگه فراهم بشه . میتونیم این برنامه را به قسمتهای مختلفی به شرح زیر تقسیم کنیم :

قسمت اول دستوراتی هست که تا قبل از دستور Org 0H قرار داره . این دستورات اصطلاحاً دایرکتیو نامیده میشه ، زیرا دستورات واقعی اسمبلی نیست و فقط به منظور افزایش خوانایی و قابلیت استفاده از زیر روالها در برنامه های مشابه به کار میره . مثلاً با دستور Zero equ 0C0H مقدار C0H به ثابت Zero ، با دستور Seven_Segment Data P0 نام مستعار Seven_Segment به پورت P0 و با دستور Anode1 bit P3.0 نام مستعار Anode1 به پایه ی P3.0 انتساب داده میشه . در واقع بعد از این دستورات هر جا اسمبلر به نامهای مستعار برخورد کنه ، مقادیر واقعی را جایگذاری میکنه .

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

قسمت سوم همون حلقه ی اصلی برنامه هست که در این قسمت دائماً وضعیت منطقی پایه ی P1.0 برای دریافت یک لبه ی پاین رونده بررسی میشه و نرم افزار حذف چندین فشردگی پشت سر هم یا اصطلاحاً Debounce هم برای آن نوشته شده که با کمی بررسی میتونید به نحوه ی عملکرد آن پی ببرید . در صورت تشخیص یک پالس صحیح محتوای خانه ی 30H به داخل انباره(رجیستر A) کپی شده ، پس از جمع انباره با عدد 1 و تصحیح اعشاری آن ، محتوای انباره مجدداً به داخل خانه ی 30H کپی می شود . خانه ی 30H از حافظه محتوی اعداد یکان و دهگان شمارنده است که به فرم BCD بوده و به ترتیب در نیبلهای پایین و بالای آن قرار دارند . در صورتی که محتوای این خانه صفر شود که به منزله ی دریافت 100 پالس می باشد ، اعمالی که ذکر آنها در مورد خانه ی 30H گفته شد ، در مورد خانه ی 31H صورت می گیرد که در بردارنده ی صدگان و یکان هزار شمارنده است . پس از آن زیر برنامه ی Decode به منظور به هنگام کردن عددی که سون سگمنتها نشان می دهند فراخانی میشود که در ذیل توضیح داده میشود .

قسمت چهارم برنامه را به لحاظ اهمیتی که از نظر ساختار و نحوه ی عملکرد دارد میتوان زیر برنامه ی Decode دانست . نوشتن این زیر برنامه به روش زبانهای برنامه نویسی سطح بالا مانند C صورت گرفته است . این زیر برنامه یک ورودی و دو خروجی دارد که ورودی به خانه ی 32H ارسال شده و خروجیها در خانه های 33H و 34H از حافظه قرار داده می شوند . عملکرد این زیر برنامه به این صورت است که کد متناظر برای نمایش اعداد BCD روی سون سگمنت را برای نیبلهای بالا و پایین بایت ورودی (خانه ی 32H) با استفاده از دستور Movc a,@a+dptr از جدولی که در انتهای برنامه است استخراج کرده ، کد متناظر با نیبل پایین را در خانه ی 35H و کد متناظر با نیبل بالا را هم در خانه ی 36H قرار میدهد . قبل از فراخوانی این زیر برنامه بایستی بایت ورودی در خانه ی 32H قرارداده شود و پس از دستور فراخوانی (Acall Decode) ، محتوای خانه های 33H و 34H به خانه های مورد نظر برای نمایش روی سون سگمنت منتقل شود . همان طوری که می بینید این زیر برنامه پس از دریافت هر پالس و افزایش خانه های 30H و در صورت لزوم 31H که محتوی اعداد BCD هستند ، فراخوانی می شود تا اعداد نمایش داده شده روی سون سگمنت ها به هنگام شوند .

قسمت پنجم و در واقع آخرین قسمت برنامه زیر روال وقفه ی تایمر صفر هست که وظیفه ی مالتی پلکس کردن سون سگمنتها را بر عهده دارد و با برچسب Multiplex مشخص گردیده . این زیر روال با توجه به مقدار دهی اولیه ثباتهای تایمر یعنی TL0 و TH0 ، پس از هر 5 میلی ثانیه (در صورت استفاده از کریستال 12MHZ) ، یکبار اجرا می شود و یکی از سون سگمنتها را به مدت 5 میلی ثانیه روشن می کند . پس از هر سرریز تایمر و رخ دادن وقفه ، محتوای ثبات r2 یک واحد افزایش پیدا می کند و با توجه به مقدار آن که بین 1 تا 4 است ، ابتدا آند سون سگمنت قبلی صفر شده ، سپس محتوای خانه ی مورد نظر برای نمایش روی سون سگمنت مورد نظر بر روی پورت P0 که به پایه های a تا g سون سگمنتها متصل است قرار گرفته و در پایان پایه ی آند سون سگمنت مورد نظر ، یک می شود . در واقع در هر لحظه فقط یکی از سون سگمنتها و به مدت 5 میلی ثانی روشن است که چون اثر آن تا زمانی که دوباره روشن شود روی شبکیه باقی می ماند ، عمل مالتی پلکس توسط چشم تشخیص داده نمی شود و روشنی سون سگمنتها پیوسته به نظر می رسد . در صورت افزایش مقدار اولیه ثباتهای TL0 و TH0 یعنی تغییر عدد 5000- به 8000- که به ثابت Timer0_Preload انتساب داده شده ، میتونید عمل مالتی پلکس را ببینید .

امیدوارم از این آزمایش و توضیحاتی که در مورد سخت افزار و نرم افزار آن دادم استفاده ی لازم را برده باشید و این مطالب برای شما سودمند واقع شده باشه . با اعمال تغییرات کمی در سخت افزار و نرم افزار این آزمایش ، یک ساعت دیجیتالی درست کردم که دوستان علاقمند میتونند با ارسال یک Email به من به آدرس stobaei@yahoo.com مبنی بر درخاست نقشه شماتیک و نرم افزار میکرو ، نقشه و نرم افزار را از طریق Email دریافت کنند .

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



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

با امید به اینکه آزمایشهای قبلی را با موفقیت انجام داده اید و با پوزش از عزیزانی که منتظر آپدیت شدن وبلاگ بوده اند به سراغ آزمایش سوم می رویم که اتصال صفحه کلید ماتریسی 16 تایی به میکروکنترلر می باشد و کاربردهای زیادی در اکثر پروژه های مبتنی بر مییکروکنترلر دارد . نقشه ی شماتیک سخت افزار را می توانید از اینجا دانلود کنید و نرم افزار را هم که در زیر مشاهده می کنید همان نرم افزاری است که در کتاب «میکروکنترلر 8051» نوشته ی محمد علی مزیدی برای اتصال صفحه کلید ماتریسی 16 تایی به میکروکنترلر پیشنهاد شده است . با این تفاوت که نرم افزار موجود در کتاب از 2 پورت استفاده می کند ولی نرم افزاری که در اینجا مشاهده می کنید برای استفاده از یک پورت بهینه شده است و برای نمایش اعداد مربوط به کلید های فشرده شده نیز از 4 عدد سون سگمنت که به روش مالتی پلکس بسته شده اند بهره می برد . توضیحات لازم در مورد نرم افزار صفحه کلید را در ذیل آن مشاهده می کنید و در مورد نرم افزار مالتی پلکس هم در آزمایش قبل به طور مفصل توضیح داده شده است .



Zero Equ 0C0H

One Equ 0F9H

Two Equ 0A4H

Three Equ 0B0H

Four Equ 99H

Five Equ 92H

six Equ 82H

Seven Equ 0F8H

Eight Equ 80H

Nine Equ 90H

_A Equ 88H

_B Equ 83H

_C Equ 0C6H

_D Equ 0A1H

_E Equ 86H

_F Equ 8EH



Timer0_Preload Equ -5000

seven_segment Data P0

KeypadPort Data P1

Yekan Data 35H

Dahgan Data 36H

Sadgan Data 37H

Yekan_Hezar Data 38H

Anode1 Bit P3.0

Anode2 Bit P3.1

Anode3 Bit P3.2

Anode4 Bit P3.3

;*******************************

Org 0H

Sjmp Main

;*******************************

Org 0BH

Ajmp Multiplex

;*******************************

Main: Mov Tmod,#01H

Mov IE,#82H

Mov r2,#0

Mov Yekan,#Zero

Mov Dahgan,#Zero

Mov Sadgan,#Zero

Mov Yekan_Hezar,#Zero

Mov Tl0,#low Timer0_Preload

Mov Th0,#high Timer0_Preload

Setb Tr0



Back1: Mov KeypadPort,#11110000B

Mov a,KeypadPort

Anl a,#11110000B

Cjne a,#11110000B,Back1

Back2: Acall Delay

Mov a,KeypadPort

Anl a,#11110000B

Cjne a,#11110000B,Over

Sjmp Back2

Over: Acall Delay

Mov a,KeypadPort

Anl a,#11110000B

Cjne a,#11110000B,Over1

Sjmp Back2

;* * * * * * * * * * * * * * * *

Over1: Mov KeypadPort,#11111110B

Mov a,KeypadPort

Anl a,#11110000B

Cjne a,#11110000B,Row_0

;* * * * * * * * * * * * * * * *

Mov KeypadPort,#11111101B

Mov a,KeypadPort

Anl a,#11110000B

Cjne a,#11110000B,Row_1

;* * * * * * * * * * * * * * * *

Mov KeypadPort,#11111011B

Mov a,KeypadPort

Anl a,#11110000B

Cjne a,#11110000B,Row_2

;* * * * * * * * * * * * * * * *

Mov KeypadPort,#11110111B

Mov a,KeypadPort

Anl a,#11110000B

Cjne a,#11110000B,Row_3

Ajmp Back2

;* * * * * * * * * * * * * * * *

Delay: Mov 40h,#50

Back3: Mov 41h,#100

Djnz 41h,$

Djnz 40h,Back3

Ret

;* * * * * * * * * * * * * * * *

Row_0: Mov Dptr,#Kcode0

Sjmp Find

Row_1: Mov Dptr,#Kcode1

Sjmp Find

Row_2: Mov Dptr,#Kcode2

Sjmp Find

Row_3: Mov Dptr,#Kcode3

;* * * * * * * * * * * * * * * *

Find: Rlc a

Jnc Match

Inc dptr

Sjmp Find

;* * * * * * * * * * * * * * * *

Match: Clr a

Movc a,@a+Dptr



Mov Dptr,#NumberCodes

Movc a,@a+Dptr

Mov Yekan_Hezar,Sadgan

Mov Sadgan,Dahgan

Mov Dahgan,Yekan

Mov Yekan,a

Ajmp Back1

;*******************************

Multiplex: Clr Tr0

Mov Tl0,#low Timer0_Preload

Mov Th0,#high Timer0_Preload

Setb Tr0

Inc r2



Cjne r2,#1,Show_Dahgan

Clr Anode4

Setb Anode1

Mov seven_segment,Yekan

Reti



Show_Dahgan: Cjne r2,#2,Show_Sahgan

Clr Anode1

Setb Anode2

Mov seven_segment,Dahgan

Reti



Show_Sahgan: Cjne r2,#3,Show_Yekanhezar

Clr Anode2

Setb Anode3

Mov seven_segment,Sadgan

Reti



Show_Yekanhezar: Mov r2,#0

Clr Anode3

Setb Anode4

Mov seven_segment,Yekan_Hezar

Reti

;*******************************

Cseg at 170H

Kcode0: Db 3,2,1,0

Kcode1: Db 7,6,5,4

Kcode2: Db 11,10,9,8

Kcode3: Db 15,14,13,12

;*******************************

Cseg at 180H

NumberCodes: Db Zero,One,Two,Three,Four,Five,Six,seven,Eight,Nine,_A,_B,_C,_ D,_E,_F

End



به طوری که در نقشه ی شماتیک مشاهده می کنید سطرها به 4 بیت کم ارزشتر و ستونها نیز به 4 بیت پرارزشتر پورت P1 متصل شده اند . نرم افزار مربوط به صفحه کلید را می توان به 4 قسمت تقسیم کرد که عملکرد هر قسمت به شرح ذیل است .

در ابتدا برای اطمینان از رهایی کلید قبلی به همه ی سطرها صفر اعمال شده و ستونها مرتباً خوانده و وارسی می گردند تا همه ی ستونها در سطح منطقی یک باشند . اگر همه ی ستونها در سطح یک تشخیص داده شوند برنامه قبل از رفتن به مرحله بعدی با فراخوانی زیر روال Delay مکث کرده و سپس در قسمت بعدی منتظر فشرده شدن کلید جدید می ماند .

در قسمت دوم نرم افزار ، برای یافتن کلید فشرده شده ستونها بوسیله یک حلقه نامتناهی مکرراً پویش می شوند تا یکی از آنها حاوی صفر شود . ذکر این نکته ضروری است که لچ های خروجی متصل به سطرها هنوز صفرهای خود را که در مرحله ی قبل تهیه شده اند دارند . نرم افزار پس از تشخیص فشردگی کلید ، با فراخوانی زیر روال Delay ، 20 میلی ثانیه برای حذف جهش ناشی از اتصال کلید صبر کرده و دوباره ستونها را پویش می کند . این کار دو مزیت دارد : 1- اطمینان از اینکه اولین تشخص فشردگی به دلیل پارازیت و نویز نبوده و 2- تأخیر 20 میلی ثانیه ای موجب می شود تا تا فشردن کلید مذکور بعنوان چندین فشردگی تعبیر نشود . اگر بعد از تأخیر 20 میلی ثانیه ، باز هم کلید فشرده شده تشخیص داده شد ، برنامه برای یافتن سطری که کلید فشرده شده در آن است به مرحله ی بعدی می رود و در غیر این صورت به حلقه ی تشخیص کلید فشرده شده ی واقعی بر می گردد .

در قسمت سوم ، نرم افزار به منظور تشخیص سطری که کلید فشرده شده در آن است ، هر بار فقط به یکی از سطرها صفر اعمال کرده و ستونها را بررسی می کند . اگر همه ی ستون ها در سطح بالا باشند بدین معناست که کلید فشرده شده متعلق به این سطر نیست . بنابراین به سطر بعدی صفر اعمال کرده و این عمل را تا یافتن سطر متعلق به کلید تکرار می کند . پس از مشخص شدن سطر متعلق به کلید فشرده شده ، ابتدا آدرس برچسبی که کدهای مربوط به آن سطر در آن تعریف شده اند به درون ثبات Dptr بار شده (مثلاً به صورت Mov Dptr,#Kcode0) و سپس برنامه برای یافتن کد مربوط به کلید فشرده شده به مرحله بعد می رود .

برای شناسایی کلید فشرده شده ، ثبات a که محتوی پورت متصل به صفحه کلید است ، از طریق پرچم نقلی به چپ چرخانده شده (با دستور Rlc a) و صفر بودن پرچم نقلی بررسی می شود . اگر پرچم نقلی صفر باشد ابتدا محتوای ثبات a صفر شده و سپس با دستور Movc a,@a+Dptr کد مربوط به کلید فشرده شده به درون ثبات a منتقل می شود . در صورتی که پرچم نقلی صفر نباشد ثبات Dptr برای اشاره به مکان بعدی در آدرس مورد نظر یک واحد افزایش می یابد .

در این مرحله ثبات a حاوی کد مربوط به کلید فشرده شده است که عددی بین 0 تا 15 می باشد . ولی برای نمایش این کد روی سون سگمنت می بایست به کد متناظر آن تبدیل شود که این کار نیز با استفاده از روش آدرس دهی اندیسی صورت می گیرد . البته می توان کدهای مربوط به اعداد و کاراکترها برای نمایش روی سون سگمنت را مستقیماً در محلهایی که با برچسب های Kcode0 تا 3 مشخص شده اند قرار داد تا دیگر به فرآیند تبدیل کد نیازی نباشد ولی در صورتی که بخواهیم با کدهای صفحه کلید عملیات محاسباتی انجام دهیم بایستی به همین روشی که در برنامه به کار رفته عمل کنیم .

اگر ترتیب اتصال سطرها و ستونها به پورتP1 مطابق نقشه ی شماتیک باشد ، با فشردن هر کلید عدد و یا کاراکتری که در نقشه ی شماتیک در زیر هر کلید است بر روی سون سگمنت نشان داده می شود . در صورتی که شما ترتیب دیگری را برای کلیدها انتظار دارید می توانید با دستکاری جدولی که در انتهای برنامه و با آدرسهای Kcode0 تا 3 تعریف شده به ترتیب مورد نظر برسید

منبع http://www.vis.ir
__________________
مرا سر نهان گر شود زير سنگ -- از آن به كه نامم بر آيد به ننگ
به نام نكو گر بميــرم رواست -- مرا نام بايد كه تن مرگ راست




ویرایش توسط دانه کولانه : 12-22-2008 در ساعت 05:01 PM
پاسخ با نقل قول
  #3  
قدیمی 10-20-2008
دانه کولانه آواتار ها
دانه کولانه دانه کولانه آنلاین نیست.
    مدیر کل سایت
        
کوروش نعلینی
 
تاریخ عضویت: Jun 2007
محل سکونت: کرمانشاه
نوشته ها: 12,701
سپاسها: : 1,382

7,486 سپاس در 1,899 نوشته ایشان در یکماه اخیر
دانه کولانه به Yahoo ارسال پیام
پیش فرض میکروکنترلرهای AVR و مدارات منطقی AVR Microcontroller Quick Reference Guide

میکروکنترلرهای AVR و مدارات منطقی AVR Microcontroller Quick Reference Guide

اين مقاله اطلاعات كلي در مورد ساختار داخلي و انواع مختلف ميكروهاي AVR و همچنين مزاياي آنها نسبت به نمونه هاي قبلي 8051 پرداخته است.در ترجمه آن سعي كردم بيشتر از لغات فارسي معادل استفاده كنم با اينكه خودم زياد راضي نيستم ولي چاره اي نداشتم بايد فارسي را پاس بداريم ! حتما مي دانيد كه براي برخي لغات تخصصي انگليسي هيچ معادل فارسي وجود ندارد به خاطر همين در بعضي از قسمتها خود لغت انگيسي را آورده ام كه فهم صحيح آن بستگي به تجربه ي خواننده دارد.مسلم است كه اگر شما درباره ي ميكروكنترلرها پيش زمينه اي داشته باشيد آنگاه آمادگي بيشتري براي فهم اين مقاله خواهيد داشت پس اگر يك خواننده مبتدي در ميكروكنترلرها هستيد ممكن است در درك برخي مطالب كمي دچار مشكل شويد البته كمي ! كه با پرسيدن چند سوال كوچك از كسي كه اينكاره است مي توانيد بعضي ابهامات را برطرف كنيد.اميدوارم هميشه پيروز و شاد باشيد .

مقدمه اي بر ميكروكنترلرهاي AVR
ميكروهاي AVR داراي انعطاف پذيري غير قابل مقايسه و بي همتايي هستند.آنها قادر به تركيب هر نوع كدي با يك معماري كارامد از طريق زبانهاي C و Assembly هستند و قادرند از طريق اين برنامه ها تمام پارامترهاي ممكن در يك سيكل يا چرخه ماشين را با دقت بسيار بالا هماهنگ كنند.ميكرو AVR داراي معماريي است كه ميتواند در تمام جهات مورد استفاده شما،عمل كند ميكرو AVR معماريي دارد كه براي شما كارايي 16 بيتي ارائه مي دهد كه البته قيمتش به اندازه يك 8 بيتي تمام مي شود.
بهره هاي كليدي AVR :
داراي بهترين MCU براي حافظه فلش در جهان ! (MCU: Master Control Unit)
داراي سيستمي با بهترين هماهنگي
داراي بالاترين كارايي و اجرا در CPU (يك دستورالعمل در هر سيكل كلاك)
داراي كدهايي با كوچكترين سايز
داراي حافظه خود برنامه ريز
داراي واسطه JTAG كه با IEEE 1149.1 سازگار است
(IEEE: Institute of Electrical and Electronics Engineers.)
داراي سخت افزار ضرب كننده روي خود
داراي بهترين ابزارها براي پيشرفت و ترقي
داراي حالات زيادي براي ترفيع دادن يا Upgrade .
واژگان كليدي AVR :
ميكرو كنترلر AVR به منظور اجراي دستورالعملهاي قدرتمند در يك سيكل كلاك(ساعت) به اندازه كافي سريع است و مي تواند براي شما آزادي عملي را كه احتياج داريد به منظور بهينه سازي توان مصرفي فراهم كند.
ميكروكنترلر AVR بر مبناي معماري RISC(كاهش مجموعه ي دستورالعملهاي كامپيوتر) پايه گذاري شده و مجموعه اي از دستورالعملها را كه با 32 ثبات كار ميكنند تركيب مي كند.
به كارگرفتن حافظه از نوع Flash كه AVR ها به طور يكسان از آن بهره مي برند از جمله مزاياي آنها است.
يك ميكرو AVR مي تواند با استفاده از يك منبع تغذيه 2.7 تا 5.5 ولتي از طريق شش پين ساده در عرض چند ثانيه برنامه ريزي شود يا Program شود.
ميكروهاي AVR در هرجا كه باشند با 1.8 ولت تا 5.5 ولت تغذيه مي شوند البته با انواع توان پايين (Low Power)كه موجودند.
راه حلهايي كه AVR پيش پاي شما مي گذارد، براي يافتن نيازهاي شما مناسب است:
با داشتن تنوعي باور نكردني و اختيارات فراوان در كارايي محصولات AVR، آنها به عنوان محصولاتي كه هميشه در رقابت ها پيروز هستند شناخته شدند.در همه محصولات AVR مجموعه ي دستورالعملها و معماري يكسان هستند بنابراين زماني كه حجم كدهاي دستورالعمل شما كه قرار است در ميكرو دانلود شود به دلايلي افزايش يابد يعني بيشتر از گنجايش ميكرويي كه شما در نظر گرفته ايد شود مي توانيد از همان كدها استفاده كنيد و در عوض آن را در يك ميكروي با گنجايش بالاتر دانلود كنيد.
خانواده هاي محصولات AVR :
Tiny AVR:
ميكروكنترلري با اهداف كلي و با بيش از 4 كيلو بايت حافظه فلش و 128 بايت حافظه استاتيك و قابل برنامه ريزي است.(منظور از حافظه استاتيك SRAM و حافظه قابل برنامه ريزي EEPROM است.)
Mega AVR:
اين نوع ميكروها قابليت خود برنامه ريزي دارند و مي توان آنها را بدون استفاده از مدارات اضافي برنامه ريزي كرد همچنين بيش از 256K بايت حافظه فلش و 4K بايت حافظه استاتيك و قابل برنامه ريزي دارند.
LCD AVR:
اين نوع ميكرو داراي درايور براي نمايشگر LCD با قابليت كنترل اتوماتيك تباين و مقايسه تصوير مي باشد.باعث تمديد عمر باتري مي شود و در حالت فعال داراي توان مصرفي پاييني است.
توان مصرفي پايين:
توان مصرفي پايين آنها براي استفاده بهينه از باتري و همچنين كاربرد ميكرو در وسايل سيار و سفري طراحي شده كه ميكروهاي جديد AVR با توان مصرفي كم از شش روش اضافي در مقدار توان مصرفي ، براي انجام عمليات بهره مي برند.
اين ميكروها تا مقدار 1.8 ولت قابل تغذيه هستند كه اين امر باعث طولاني تر شدن عمر باتري مي شود.
در ميكروهاي با توان پايين ، عمليات شبيه حالت Standby است يعني ميكرو مي تواند تمام اعمال داخلي و جنبي را متوقف كند و كريستال خارجي را به همان وضعيت شش كلاك در هر چرخه رها كند!
ابعاد مختلف ميكروهاي AVR را در اشكال زير مشاهده مي كنيد:
AVR هاي مدل tiny:
به خود اجازه ندهيد كه نام آن شما را گول بزند... ميكروهاي مدل tiny توانايي هاي عظيمي دارند.به خاطر كوچك بودن و داشتن MCU بسيار پر قدرت به اينگونه ميكروها نياز فراواني هست آنها به هيچ منطق خارجي نياز نداشته و به همراه يك مجتمع مبدل آنالوگ به ديجيتال و يك حافظه قابل برنامه ريزي EEPROM قابليتهاي خود را ثابت مي كنند.
نكات كليدي و سودمند مدل Tiny :
آنها به منظور انجام يك عمليات ساده بهينه سازي شده و در ساخت وسايلي كه به ميكروهاي كوچك احتياج است كاربرد فراوان دارند.
كارايي عظيم آنها براي ارزش و بهاي وسايل موثر است.
AVR هاي مدل Mega:
اگر شما به ميكرويي احتياج داريد كه داراي سرعت و كارايي بالا باشد و توانايي اجراي حجم زيادي از كد برنامه را داشته و بتواند داده هاي زيادي را سروسامان دهد بايد از AVR هاي مدل Mega استفاده كنيد آنها به ازاي هر يك مگا هرتز سرعت ، توانايي اجراي يك ميليون دستورالعمل در هر يك ثانيه را دارند همچنين قابل برنامه ريزي و بروزرساني كدها با سرعت و امنيت بسيار بالايي هستند.
نكات كليدي و سودمند مدل Mega :
حافظه سريع از نوع فلش با عملكرد خود برنامه ريز و بلوكه ي بوت (Boot Block)
دقت بسيار بالاي 8-كانال در تبديل آنالوگ به ديجيتال 10 بيتي
USART و SPI و TWI بر طبق واسطه هاي سريال
واسطه ي JTAG بر طبق IEEE 1149.1
TWI: Two Wire Interface is a byte oriented interface
USART: Universal Serial Asynchronous Receiver/Transmitter
SPI: Serial Peripheral Interface
JTAG available only on devices with 16KB Flash and up
واسط JTAG فقط در ميكروهاي با بيش از 16 كيلوبايت حافظه فلش موجود است.
AVR هاي مدل LCD:
آنها با بالاترين يكپارچگي و انعطاف پذيري ممكن طراحي شده اند و با داشتن درايور LCD و كنترلر اتوماتيك وضوح تصوير ،بهترين واسطه را با انسان دارند و داراي توان مصرفي پايين و كارايي بالايي هستند.اولين عضو اين خانواده 100 سگمنت داشت و داراي يك UART و SPI به منظور ارتباط به صورت سريال بود.
نكات كليدي وسودمند مدل LCD :
كارايي فوق العاده با سرعت يك ميليون دستورالعمل در ثانيه به ازاي يك مگاهرتز
واسطه ها براي ارتباط با انسان: وقفه هاي صفحه كليد و درايور نمايشگر LCD
آنها اين اجازه را به طراح سيستم مي دهند كه توان مصرفي را در برابر سرعت پردازش تا جايي كه امكان دارد بهينه كند.
نكات كليدي و سودمند حافظه ي فلش خود برنامه ريز:
قابليت دوباره برنامه ريزي كردن بدون احتياج به اجزاي خارجي
128 بايت كوچك كه به صورت فلش سكتور بندي شده اند
داشتن مقدار متغير در سايز بلوكه ي بوت (Boot Block)
خواندن به هنگام نوشتن
بسيار آسان براي استفاده
كاهش يافتن زمان برنامه ريزي
كنترل كردن برنامه ريزي به صورت سخت افزاري
راههاي مختلف براي عمل برنامه ريزي:
موازي يا Parallel :
يكي از سريعترين روشهاي برنامه ريزي
سازگار با برنامه نويس هاي(programmers) اصلي
خود برنامه ريزي توسط هر اتصال فيزيكي:
برنامه ريزي توسط هر نوع واسطه اي از قبيل TWI و SPI و غيره
دارا بودن امنيت صد درصد در بروزرساني و كدكردن
ISP:
واسطه سه سيمي محلي براي بروزرساني سريع
آسان و موثر در استفاده
واسطه JTAG :
واسطه اي كه تسليم قانون IEEE 1149.1 است و مي تواند به صورت NVM برنامه ريزي كند يعني هنگام قطع جريان برق داده ها از بين نروند.استفاده از فيوزها و بيتهاي قفل.
بيشتر براي ديباگ كردن آنچيپ و به منظور تست استفاده مي شود
نرم افزار ارائه شده توسط شركتATMEL به نام AVR Studio 4 :
اين نرم افزار به صورت رايگان در سايت شركت ATMEL قرار دارد مي توانيد با رجوع به آدرس http://www.atmel.com آن را دانلود كنيد.
اين نرم افزار در حقيقت يك اسمبلر براي محصولات AVR اتمل است و به صورت كاملا ويژوالي است.
مي تواند با انواع دستگاههاي برنامه نويس ميكرو ارتباط برقرار كند و كدها را در ميكرو دانلود كند.و قابليت ترجمه كدها به زبانهاي C و Assembly را دارد .

منبع http://avr-logicalcircuit.blogspot.com
__________________
مرا سر نهان گر شود زير سنگ -- از آن به كه نامم بر آيد به ننگ
به نام نكو گر بميــرم رواست -- مرا نام بايد كه تن مرگ راست



پاسخ با نقل قول
  #4  
قدیمی 10-20-2008
دانه کولانه آواتار ها
دانه کولانه دانه کولانه آنلاین نیست.
    مدیر کل سایت
        
کوروش نعلینی
 
تاریخ عضویت: Jun 2007
محل سکونت: کرمانشاه
نوشته ها: 12,701
سپاسها: : 1,382

7,486 سپاس در 1,899 نوشته ایشان در یکماه اخیر
دانه کولانه به Yahoo ارسال پیام
پیش فرض پروگرامر ميكروكنترلر هاي سري 8051

پروگرامر ميكروكنترلر هاي سري 8051
اين پروگرامر قابليت برنامه ريزي ميکروهاي سري 8051 را دارا ميباشد.
از قابليتهاي اين پروگرامر مي توان به موارد زير اشاره کرد:
-
قابليتاتصال از طريق پورت سريال
-
شناسايي ميکروکنترلر بصورت خودکار
-
بازبينياطلاعات
-
شناسايي سخت افزار بصورت خودکار
ميکروکنترلري که روي چيپ نياز است را بايد با برنامه EZ52.hex برنامه ريزي کرد .
بقيه قطعات را طبق شماتيک تهيه و از آن لذت ببريد. برگرفته از سایت IC4IR.com


http://electronic.persiangig.com/Sof...loader8051.zip
منبع اینجا
__________________
مرا سر نهان گر شود زير سنگ -- از آن به كه نامم بر آيد به ننگ
به نام نكو گر بميــرم رواست -- مرا نام بايد كه تن مرگ راست



پاسخ با نقل قول
  #5  
قدیمی 10-20-2008
دانه کولانه آواتار ها
دانه کولانه دانه کولانه آنلاین نیست.
    مدیر کل سایت
        
کوروش نعلینی
 
تاریخ عضویت: Jun 2007
محل سکونت: کرمانشاه
نوشته ها: 12,701
سپاسها: : 1,382

7,486 سپاس در 1,899 نوشته ایشان در یکماه اخیر
دانه کولانه به Yahoo ارسال پیام
پیش فرض تایمر ها در 8051

تایمر ها در 8051
تایمر ها از اجزاء پر کاربرد پروژه های 8051 می باشند.کار اصلی تایمر شمارش تعداد سیکل های کریستال می باشد.چون هر دوره تناوب کریستال در کسری از ثانیه رخ می دهد بنابراین می توان برای شمارش زمان سپری شده ، از آن استفاده کرد .
8051 دارای دو عدد تایمر 16 بیتی می باشد که با نامهای تایمر یک و تایمر صفر شناخته شده اند .هر تایمر در حقیقت از دو ثبات 8 بیتی با نام TH و TL ساخته شده است .از تایمر ها در 4 مود کاری می توان استفاده کرد:
مود 00 که از تایمر به عنوان یک شمارشگر 13 بیتی استفاده می کند .
مود 01 از تایمر به عنوان شمارشگر 16 بیتی استفاده می کند .
مود 02 به عنوان شمارشگر 8 بیتی با راه اندازی خودکار استفاده می کند.(AutoReload)
مود 03 تایمر را به دو تایمر 8 بیتی تقسیم می کند که به آن حالت تسخیر شده می گویند.

در 4 مود کاری بالا مود های یک و دو بیشترین کاربرد را در انجام پروژه ها دارند .تایمر 16 بیتی مود 01 می تواند از مقدار 0000 تا FFFFH بشمارد پس از رسیدن به مقدار FFFF تایمر پرچم خود را (TF) را یک می کند و مجددا از مقدار 0000 شروع به شمارش می کند.

در مود 2 که همان حالت AutoReload است تایمر به عنوان یک شمارشگر 8 بیتی از مقدار 00 تا FFh می شمارد البته در این مود می توان برای تایمر تعیین کرد که چه مقدار بشمارد فرضا در برنامه ای احتیاج به این پیدا می کنیم تا تایمر یک وظیفه ای را هر 100 میکرو ثانیه انجام دهد در این حالت از مود 2 استفاده می کنیم . مقدار اولیه شمارش را در ثبات TH قرار می دهیم .و سپس پس از راه اندازی تایمر این مقدار در ثبات TL قرار می گیرد و تایمر از مقدار تعیین شده تا FFh می شمارد . پس از رسیدن TL به FFh تایمر پس از یک کردن TF ، مجددا مقدارموجود در TH را در ،م کپی کرده و به همین ترتیب شمارش ادامه می یابد .

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

TMODیک ثبات 8 بیتی است که به دو قسمت 4 بیتی (nible) تقسیم می شود نیبل بالا برای تایمر 1 و نیبل پایین برای تایمر 0 مورداستفاده قرار می گیرد .اختلاف دو نیبل در همین است و غیر از این کاملا با هم مشابهند .
بیت Gate ، می توان گفت که یک نوع راه انداز تایمر است . این بیت مشابه کلید روشن و خاموش عمل می کند در صورتی که مقدار این بیت را یک قرار دهیم کنترل تایمر از طریق پالس ورودی به پایه ی INT1 صورت می گیرد یکی از کاربرد های این بیت اندازه گیری پالس خارجی اعمال شده به پایه ی INT1 می باشد.
بیت C/T نوع کارکرد تایمر را تعیین می کند که آیا تایمر برای شمارش تعداد پالس کریستال خارجی متصل به پایه T1 یا T0 مورداستفاده قرار گیرد یا برای شمارش تعداد پالس های کریستال مدار میکرو که آن هم به پایه های 18 و 19 متصل است .در حالت اول می گویند که تایمر به عنوان کانتر (شمارنده اتفاقات) عمل می کند و در حالت دوم می گویند که تایمر در حالت شمارش گر زمان کار می کند .در صورتی که بیتc/T را یک کنیم تایمر به عنوان کانتر و در صورتی که این بیت را صفر کنیم تایمر به عنوان شمارشگر واحد زمان به کار گرفته می شود.

بیتهای M1و M0 هم مود کاری را که قبلا بررسی کردیم تعیین می کند .ابتدا مود مورد نظر را تعیین می کنیم سپس مقدار معادل آن در مبنای دو را در بیتهای M1, M2 قرار می دهیم .

یک مثال برای اینکه تایمر 1در حالت AutoReload و به عنوان تایمر (شمارش گر زمان) مورد استفاده قرار گیرد :

معدل این کار دستور زیر است:

کد:
Mov Tmod,#00100000b
مرحله بعدی استفاده از تایمر تعیین چگونگی روشن و خاموش کردن تایمر است.
ثبات دیگری که در مورد تایمر مورد استفاده قرار می گیردثبات TCON است بیتهای این ثبات در شکل زیر مشخص می باشند.

بیت TF:قبلا هم در مورداین بیت صحبت کردیم هنگامی که تایمر شروع به شمارش کرد بسته به مودی که برای کار در آن تنظیم شده است پس از رسیدن به مقدار نهایی (FFh یا FFFFh یا1FFFh ) قبل از اینکه مجددا از صفر شروع به شمارش کند بیتTF را یک می کند تا نشان دهد که مقدار فعلی در دور دوم شمارش است و قبلا یک بار شمارش کامل شده است .
این بیت به صورت سخت افزاری یک می شود و ما باید به صورت نرم افزاری قبل از پایان دور دوم شمارش آن را صفر کنیم .
TF1 برای تایمر یک و TF0 پرچم شمارش برای تایمر صفر است.

بیت TR: بیت کنترل راه اندازی نامیده شده است .در صورتی که این بیت را یک کنیم تایمر شروع به شمارش می کند و در صورتی که این بیت صفر شود تایمر متوقف می شود. مانند TF، ،TR1 برای کنترل تایمر 1 و TR0 برای کنترل راه اندازی تایمر 0 مورد استفاده قرار می گیرد.

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

1.از کدام تایمر استفاده خواهیمکرد؟
2.مود کاری تایمر را تعیین کنید.
3.تایمر مورد نظر شماست یا شمارنده
3.ثبات TMOD را با معادل دودوئی آن بار گذاری کنید.
4.در صورتی که از AutoReload استفاده می کنید TH را با مقدار اولیه مناسب بار کنید.
5.تایمر را راه اندازی کنید .
7.منتظر یک شدن TF بمانید .


مثال:
برنامه ای بنویسید که یک پالس با دوره تناوب 200 میکرو ثانیه بر روی پایه ی P1.0 تولید کند.


حل:
دوره تناوب پالس 200 میکرو ثانیه عنوان شده است یک پالس در نصف دوره تناوب در حالت high و در نصف دیگر در حالت low قرار دارد . نصف دوره تناوب 100 میکرو ثانیه است و چون پالس متقارن است ما فقط به نصف دوره تناوب احتیاج داریم بنابراین مود تایمر را 2 یعنی حالت autoReload و مقدار اولیه را -100 در نظر می گیریم.
برای اینکه بفهمید چرا -100 ،توجه کنید که ما می خواهیم که تایمر 100 واحد بشمارد در حالت AutoReload چون تایمر 8 بیتی است حداکثر مقدار شمارش FFh است بنابراین :
TH=FFh-100d=9Bh
اما -100 هم دقیقا مشابه مقدار بالا است .بنابراین اگر ما به جای -100 مقدار 9Bh را در TH قرار می دادیم نیز نتیجه فرقی نمی کرد.

در این مثال فرقی نمی کند که از کدام تایمر استفاده کنیم .در حقیقت تایمر ها هیچ تفاوتی با هم ندارند .
کد:
Mov TMOD,#00100000b

Mov TH1,#-100
Setb TR1
Wait :jnb Tf1,wait
ClR TF1
CPL p1.0
Sjmp wait
همانطور که مشاهده می کنید قبل از پایان دور دوم شمارش مقدار TF باید صفر شود.
منبع:دانشگاه کردستان
__________________
مرا سر نهان گر شود زير سنگ -- از آن به كه نامم بر آيد به ننگ
به نام نكو گر بميــرم رواست -- مرا نام بايد كه تن مرگ راست



پاسخ با نقل قول
پاسخ


کاربران در حال دیدن موضوع: 1 نفر (0 عضو و 1 مهمان)
 

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

BB code is فعال
شکلک ها فعال است
کد [IMG] فعال است
اچ تی ام ال غیر فعال می باشد



اکنون ساعت 06:16 AM برپایه ساعت جهانی (GMT - گرینویچ) +3.5 می باشد.



Powered by vBulletin® Version 3.8.4 Copyright , Jelsoft Enterprices مدیریت توسط کورش نعلینی
استفاده از مطالب پی سی سیتی بدون ذکر منبع هم پیگرد قانونی ندارد!! (این دیگه به انصاف خودتونه !!)
(اگر مطلبی از شما در سایت ما بدون ذکر نامتان استفاده شده مارا خبر کنید تا آنرا اصلاح کنیم)


سایت دبیرستان وابسته به دانشگاه رازی کرمانشاه: کلیک کنید




  پیدا کردن مطالب قبلی سایت توسط گوگل برای جلوگیری از ارسال تکراری آنها