برنامه دیمر دیجیتال توسط میکروکنترلر Atmega8

 

برنامه این دیمر در محیط BASCOM AVR 1.11.8.1 نوشته شده است.

 

جهت تهیه نرم افزار BASCOM-AVR ، اینجا کلیک کنید.

 

$regfile = "m8def.dat"
$crystal = 4000000

همانطور که میدانید، دستوراتی که با علامت "$" در BASCOM آغاز میشوند، جزو دستورات کمپایلر به حساب می‌آیند. و در زمان کمپایل کدی را تولید نمیکنند. دو دستور فوق نیز همینگونه هستند. در دستور اول نوع میکرو برای کمپایلر تعریف میشود که در اینجا ATmega8 میباشد و در دستور بعدی فرکانس کریستال بر حسب هرتز مشخص میشود.در این برنامه مقدار فرکانس تعریفی چهار مگاهرتز است. توجه داشته باشید که من در مدار دیمر دیجیتال خود، از کریستال خارجی استفاده نکردم. لذا این دستور تعیین کننده فرکانس اسیلاتور داخلی میکروکنترلر میباشد.

 

Config Pinb.1 = Output        ' Gate Triac
Config Pind.7 = Input         ' Key Up
Config Pinb.0 = Input         ' Key Dn

در سه دستور فوق پین 1 از پورت B بعنوان خروجی پیکر بندی شده ( که جهت کنترل گیت ترایاک است ) و پین 7 از پورت D بعنوان ورودی پیکربندی شده ( که جهت خواندن وضعیت کلید Up است ) و پین صفر از پورت B بصورت ورودی پیکربندی شده ( که جهت خواندن وضعیت کلید Dn است ).

 

Config Int0 = Rising
On Int0 Int0_int

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

 

Enable Interrupts
Enable Int0

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

 

Dim E As Eram Byte
Dim B As Byte
Dim D As Byte

در دو دستور فوق متغییر های استفاده شده در برنامه تعریف گشته‌اند. متغییر E بصورت یک بایتی و در حافظه EEPROM میکرو کنترلر تعریف شده است. این متغییر جهت نگهداری وضعیت تنظیم شده دیمر توسط کاربر بکار برده شده است و همانطور که قبلاً اشاره شد، ما بعد از هر بار تنظیم و جدا کردن میکرو از تغذیه نمی‌خواهیم آخرین تنظیمات انجام شده از بین برود در نتیجه جهت نگهداری این متغییر از فضای EEPROM داخلی میکرو کنترلر استفاده شده است.

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

در سطر بعدی برنامه متغییر D بصورت یک بایتی تعریف شده است. این متغییر در روال مربوط به وقفه استفاده میشود که در آنجا به تفضیل در مورد آن صحبت میکنیم.

 

If E > 9 Then E = 9
B = E
D = 0

Set Portb.1

در دستور بالا آماده سازی‌های اولیه جهت شروع به کار میکرو انجام می‌پذیرد. در سطر اول در صورتیکه متغییر E مقدار نا معتبری ( بزرگتر از یک ) داشته باشد. مقدار آن صفر میشود.

در این مرحله مقدار متغییر E از حافظه EEPROM خوانده میشود و سپس در متغییر B قرار خواهد گرفت.

در سطر بعدی پین 1 از پورت B یک میشود. بدلیل اینکه این پورت از طریق یک ترانزیستور PNP به گیت ترایاک متصل است، لذا جهت خاموش کردن ترانزیستور در ابتدای راه‌اندازی میکرو کنترلر، بیس ترانزیستور PNP باید در سطح یک نگاه داشته شود.

 

مواردی که در بالا بررسی شد مربوط به پیکربندی و راه اندازی اولیه میکروکنترلر بود. بعد از این موارد به بدنه اصلی برنامه می‌رسیم که درون حلقه Do-Loop بدون شرط پایان است. در این حلقه میکرو بصورت متناوب وضعیت کلیدهای مدار را برر سی میکند و متناسب با آن مقدار متغییر E را تغییر میدهد. در حین انجام این عمل در صورت آمدن وقفه، دستورات مربوط به روال وقف را اجرا میکند. که در ادامه بحث هر یک را بطور جداگانه بررسی میکنیم.

 

    If Pind.7 = 0 Then
        If B > 1 Then Decr B
        Waitms 10
        E = B

    End If

در شرط If بالا وضعیت پین 7 از پورت D بررسی میشود. این پین میکروکنترلر به کلید Up متصل است و همانطور که از نام آن پیداست، با هر بار فشردن این کلید باید مقدار بیشتری از سیگنال برق شهر ورودی به بار در خروجی دیمر منتقل شود. در نتیجه بایستی میکروکنترلر در زاویه کمتری دستور آتش را به ترایاک بدهد. لذا با هر بار فشردن این کلید، در صورتی که مقدار متغییر B از 1 کمتر نباشد، یک واحد از آن کم میشود. توجه داشته باشیم که مقدار مجاز متغییر B در این برنامه بین صفر تا نه تعریف شده است، بنابراین مقدار سیگنال خروجی در دیمر در 10 سطح مختلف قابل تنظیم خواهد بود. از آنجایی که سرعت اجرای دستور العمل ها در میکروکنترلر بسیار بالاست در صورت فشار دادن کلید برای یک لحظه بسیار کم باعث تغییر بسیار زیاد در متغییر B خواهد شد. لذا درون دستورات شرط If مربوط به چک وضعیت کلید، یک دستور تاخیر قرار داده شده است، تا از سرعت میکرو کم شود و با نگه داشتن کلید مقدار ولتاژ خروجی به آرامی افزایش یابد.توجه داشته باشید که بدلیل تغییر کردن متغییر B در این مرحله مقدار این متغییر در E ذخیره میشود.

 

    If Pinb.0 = 0 Then
        If B < 9 Then Incr B
        Waitms 10
        E = B

    End If

در شرط If بالا وضعیت پین صفر از پورت D بررسی میشود. این پین میکروکنترلر به کلید Dn متصل است و همانطور که از نام آن پیداست، با هر بار فشردن این کلید باید مقدار کمتری از سیگنال برق شهر ورودی به بار در خروجی دیمر منتقل شود. در نتیجه بایستی میکروکنترلر در زاویه یبیشتری دستور آتش را به ترایاک بدهد. لذا با هر بار فشردن این کلید، در صورتی که مقدار متغییر B از 9 بزرگتر نباشد، یک واحد به آن اضافه میشود.

 

Int0_int:

Set Portb.1
For D = 0 To B
    Waitus 200
Next D
Reset Portb.1
 
Return

روال فوق مربوط به وقفه موجود در میکروکنترلر می‌باشد و همانطور که میدانید این وقفه توسط مدار آشکار ساز عبور از صفر تولید میگردد. در نتیجه در ابتدای شروع هر نیم سیکل دستورات موجود در روال این وقفه اجرا میشود. در این وقفه میکروکنترلر در ابتدا ترانزیستور PNP مدار را با یک کردن پین 1 از پورت B خاموش میکند. در نتیجه در ابتدای شروع هر نیم سیکل ترایاک خاموش خواهد بود. سپس با توجه به مقدار متغییر B که تعیین کننده زاویه آتش ترایاک است، دستور تاخیر موجود در حلقه For-Next چند بار اجرا میشود و بعد از تاخیر فوق با ریست شدن  پین 1 از پورت B ترانزیستور PNP مدار روشن شده و ترایاک را آتش میکند. حال هر چه مقدار متغییر B اضافه شود، مقدار این تاخیر ( زاویه آتش ) زیاد شده و بخش کمتری از سیگنال ورودی به خروجی دیمر منتقل خواهد شد و بالعکس با کم شدن مقدار B، مقدار این تاخیر ( زاویه آتش ) کم شده و بخش بیشتری از سیگنال ورودی به خروجی دیمر منتقل خواهد شد.

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

 

'*********************************************
'* This Program Writing By : Hossein Lachini *
'* Digitally Dimer With ATmega8              *
'* For to get more details visit :           *
'*                
www.HLachini.Com          *
'* Contact to me by :
eLachini@Gmail.Com     *
'*********************************************

$regfile = "m8def.dat"
$crystal = 4000000

Config Pinb.1 = Output        ' Gate Triac
Config Pind.7 = Input         ' Key Up
Config Pinb.0 = Input         ' Key Dn

Config Int0 = Rising
On Int0 Int0_int

Enable Interrupts
Enable Int0

Dim E As Eram Byte
Dim B As Byte
Dim D As Byte

If E > 9 Then E = 9
B = E
D = 0
Set
Portb.1

Do
    If Pind.7 = 0 Then
        If B > 1 Then Decr B
        Waitms 10
        E = B

    End If

    If Pinb.0 = 0 Then
        If B < 9 Then Incr B
        Waitms 10
        E = B

    End If
Loop
End 'end program

Int0_int:

Set Portb.1
For D = 0 To B
    Waitus 200
Next D
Reset Portb.1
 
Return

 

جهت سهولت شما در ساخت این مدار، من برای شما فایل برنامه دیمر نوشته شده در نرم افزار BASCOM-AVR به همراه فایل Hex آنرا بصورت فشرده در یک فایل Zip قرار دارم. برای دانلود فایل فوق از لینک زیر استفاده کنید.

 

 Í


جهت دانلود فایلهای فوق اینجا کلیک کنید.

حجم فایل : 1،17 کیلو بایت

فرمت فایل Zip

 

 

جهت تهیه  پروگرمر ، اینجا کلیک کنید.

 

7 جهت بازگشت به صفحه قبلی اینجا کلیک کنید.