کار با پین ها در اتمل استودیو

saalek110

Well-Known Member
در Atmel studio دسترسی بیتی به رجیستر ها نداریم و اگر بخواهیم یک پین از پورت را تنظیم کنیم یا از وضعیت یک پین از پورت آگاهی داشته باشیم باید به صورت زیر عمل کنیم. به عنوان مثال می خواهیم پین PC2 را به صورت ورودی تنظیم کنیم یعنی صفر باید بنویسم.

PHP:
DDRC &= ~(1<<PC2)

(1<<PC2) کد باینری 00000100 را ایجاد می کند و علامت ~ آن را به صورت 11111011 تغییر می دهد. و اگر بخواهیم به صورت خروجی تنظیم کنیم یعنی یک باید از روش زیر استفاده کنیم.

PHP:
DDRC |= (1<<PC2)

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

PHP:
a = PINC & (1<<PC2)

وضعیت PC2 در متغییر a ذخیره شد.


 

saalek110

Well-Known Member
PHP:
#ifndef F_CPU
#define F_CPU 16000000UL // 16 MHz clock speed
#endif

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  DDRC = 0xFF; //Nakes PORTC as Output
  while(1) //infinite loop
  {
    PORTC = 0xFF; //Turns ON All LEDs
    _delay_ms(1000); //1 second delay
    PORTC= 0x00; //Turns OFF All LEDs
    _delay_ms(1000); //1 second delay
  }
}

  • DDRC = 0xFF همه پین های PORTC را به صورت خروجی تنظیم می کند.
  • PORTC = 0xFF همه پین های PORTC را یک منطقی می کند (5V).
  • PORTC = 0x00 همه پین های PORTC را صفر منطقی می کند (0V).
  • delay_ms تاخیری به اندازه مقدار نوشته شده در پارانتز ایجاد می کند.
  • whie(1 یک حلقه ی بی نهایت ایجاد می کند.
 

saalek110

Well-Known Member
نحوه ی خروجی کردن پین ها برای ال ای دی



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

راه اول:

استفاده از کتابخانه ای که در پست های قبلی به شما معرفی کردیم به نام (AVRLIBDEFS).

برای انجام این کار باید کتابخانه را اضافه کنید .به صورت زیر عمل کنید :



bandicam_2020_11_25_15_48_50_897.jpg






بعد از انتخاب EXSISTING ITEM باید فایل کتابخانه به نام avrlibdefs.h را انتخاب کنید .



bandicam_2020_11_25_15_50_04_217.jpg




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

bandicam_2020_11_25_15_50_30_306.jpg


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

بعد از اضافه کردن باید کتابخانه رو توی کد تعریف کنید .

 

saalek110

Well-Known Member
ادامه پست قبل.......


بعد از اضافه کردن باید کتابخانه رو توی کد تعریف کنید .



bandicam_2020_11_25_16_04_35_237.jpg




ما در هر برنامه به کتابخانه ها یا فایل های سرایند نیاز داریم و اونها رو با واژه ی (include#) تغریف میکنیم . اگر کتابخانه رو اضافه کرده بودین باید از دابل کوتیشن ("" ) استفاده کنید به این صورت ( " محلی که اسم کتابخونه رو مینویسیم"include# ).

و اگر در خود برنامه موجود بود ( < اسم کتابخانه/اسم پوشه>include#).



برای خروجی کردن باید از عبارت (()sbi) استفاده کنیم .

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

به صورت زیر:

bandicam_2020_11_25_16_16_20_813.jpg


یادتون باشه برای ورودی خروجی کردن باید بیرون از while و داخل main بنویسین جایی که من نوشتم .

چون هرچیزی در حلقه ی while بنویسین تا ابد اجرا میشه ولی توی main فقط یک بار .

تا اینجا مشخص کردین که میخواین کدوم پین خروجی شه .

حالا باید مشخص کنیم که در چه زمانی باید پین یک بشه و در چه زمانی صفر برای همین مثل تصویر زیر عمل کنین.



bandicam_2020_11_25_16_55_03_686.jpg




باید کتابخانه delay را نیز اضافه کنید با این کتابخانه می تونین تاخیر درست کنید .

برای روشن کردن پین باید از دستور sbi استفاده کنید ا این تفاوت که در خروجی کردن برای مشخص کردن پورت از ddr استفاده میکردیم ولی اینجا از واژه ی port استفاده میکنیم .

و خروجی کردن هم cbi با تفاوتی که در بالا توضیح دادم .

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

برای این کار باید به ترتیب زیر عمل کنید:
 

saalek110

Well-Known Member
PHP:
#define F_CPU 20000000    // AVR clock frequency in Hz, used by util/delay.h
#include <avr/io.h>
#include <util/delay.h>
 
int main() {
    DDRD |= (1<<1);        // set LED pin PD1 to output
    while (1) {
        PORTD |= (1<<1);   // drive PD1 high
        _delay_ms(100);    // delay 100 ms
        PORTD &= ~(1<<1);  // drive PD1 low
        _delay_ms(900);    // delay 900 ms
    }
}

 

جدیدترین ارسال ها

بالا