جستجو برای:
سبد خرید 0
  • Home
  • weblog
    • electronic
      • hardware
      • Integrated Circuit
      • microcontroller
      • knowledge base
      • PCB
      • book
    • power electronic
    • mechanics & aerospace
      • Exercise
      • CFD
    • computer
      • matlab
  • Courses
    • Power Engineering
    • Altium Designer
    • image processing
    • raspberry
  • shop
    • electronic
  • Cart
  • Payment
  • Contact US

ورود

رمز عبور را فراموش کرده اید؟

هنوز عضو نشده اید؟ عضویت در سایت
  • فقط تلگرام و واتس آپ : 09374187582
  • octacore.ir[at]gmail.com
perm_identity
سبد خرید 0
0
هشت هسته
  • Home
  • weblog
    • electronic
      • hardware
      • Integrated Circuit
      • microcontroller
      • knowledge base
      • PCB
      • book
    • power electronic
    • mechanics & aerospace
      • Exercise
      • CFD
    • computer
      • matlab
  • Courses
    • Power Engineering
    • Altium Designer
    • image processing
    • raspberry
  • shop
    • electronic
  • Cart
  • Payment
  • Contact US
ورود و ثبت نام

وبلاگ

هشت هسته > weblog > electronic > microcontroller > AVR > AVR Tutorial > آموزش AVR قسمت ششم

آموزش AVR قسمت ششم

access_timeمرداد 9, 1397
perm_identity ارسال شده توسط مهدی
folder_open AVR ، AVR Tutorial ، electronic ، microcontroller
visibility 684 بازدید

http://dl.octacore.ir/octacore/avr/avr-turorial/avr-tutorial3/3-1.jpg

 

سلام به همه.

تو آموزش قبلی با مفهوم مقاومت های پول آپ و پول دان آشنا شدیم ، توی اون آموزش ها از روش polling یا سرکشی استفاده کردیم که زیاد خوشایند نیست و تمام CPU رو درگیر خودش میکنه.

در این قسمت از روش interrupt استفاده میکنیم.خیلی کم و مفید در مورد اینتراپت یا وقفه:

وقتی CPU داره کار خودش رو انجام میده ، اگر وقفه ای اتفاق بیافته CPU کار خودش رو رها میکنه و به کاری که ما تعریف کردیم توی تابع وقفه میپردازه .

وقتی کار روی تابع وقفه تموم شد ، دوباره برنامه رو از همون جایی که ول کرده بود ادامه میده.

توی این پست نحوه کار با وقفه خارجی رو بررسی میکنیم.

(توی octacore.ir زیاد در مورد مفاهیم پایه توضیح نمیدم چون اینا توی سایت های داخلی خیلی خیلی زیاد هستند ، هدف فقط کدنویسی توی Atmel Studio است. اگر نیاز به توضیح اضافه دارید توی نظرات بگید.)

خب ، برای آشنایی با نحوه کار با وقفه یه پروژه به این صورت داریم :

یه برنامه مینویسیم که هر 4 ثانیه یکبار یک LED رو روشن و خاموش کنه ، وقتی که کلید زده شد و وقفه اتفاق افتاد ، یه دونه به شماره counter اضافه کنه و با فرمولی که توی ماکرو نوشته شده ، مقدار counter رو تبدیل به میلی ثانیه کنه و میزان تاخیر در روشن و خاموش شدن led رو کنترل کنه.

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

اینجا با رجیسترهای Mega8 کار داریم ، ممکنه این رجیسترها برای میکروهای دیگه فرق داشته باشه (فقط اسمشون ) از تو دیتاشیت میتونید پیدا کنید و اونا رو بنویسید.

 

بعد از اضافه کردن کتابخونه avr/interrupt.h میریم سراغ رجیستر اول ، GICR :

این رجیستر اینتراپت خارجی رو فعال میکنه ، من اینتراپت خارجی روی پایه PORTD3 رو فعال کردم که اسمش INT1 هست (PINOUT میکرو هم همینو نوشته).

با این کد اینتراپت این پایه فعال میشه:

1
GICR |=(1<<INT1);

 

http://dl.octacore.ir/octacore/avr/avr-turorial/avr-tutorial6/6-2.jpg

 

رجیستر دوم که مربوط به نحوه تولید وقفه است MCUCR :

 

http://dl.octacore.ir/octacore/avr/avr-turorial/avr-tutorial6/6-1.jpg

با فرض اینکه کلید PULL-UP شده:

اولین گزینه از جدول ، وقتی که کلید پایین نگه داشته شده وقفه تولید میکنه.(سطح منطقی 0 )

دومین گزینه:هر گونه تغییر در کلید ، وقفه تولید میکنه.

گزینه سوم ، گزینه مورد علاقه من : وقتی که کلید پایین زده شد ، وقفه تولید میکنه (لبه پایین رونده تغییرات ولتاژ ) ، (یعنی فقط در لحظه خیلی کوتاهی که کلید به سمت پایین حرکت میکنه وقفه تولید میشه)

گزینه آخر که قابل حدس زدن هست و نمیگم !!!

من کدهای مربوط به اینتراپت خارجی رو داخل این تابع ریختم:

1
2
3
4
5
6
void init_int1()
{
GICR |=(1<<INT1); //فعال کردن وقفه 1 خارجی
MCUCR|=(1<<ISC11); //حساس به لبه پایین رونده
sei(); // فعال کردن کلی اینتراپت
}

نکته : حتما اینتراپت کلی رو فعال کنید.

خب ما تونستیم اینتراپت خارجی رو تنظیم کنیم.

برای اینکه اینتراپت رخ داد و یک سری کار های مد نظر ما انجام بشه از Interrupt Service Routine استفاده میکنیم .

این تابع با توابع معمولی فرق میکنه و هر موقع اینتراپت رخ داد اجرا میشه.

1
2
3
4
5
6
7
8
9
10
11
ISR (INT1_vect)
{
_delay_ms(1); //تاخیر برای نادیده گرفتن نویز کلید
if (bit_is_clear(PIND , 3)) // اگر همچنان کلید پایین نگه داشته شده
{
counter++; // اضافه کردن یک واحد به شمارنده
counter &=0b00000111; // محدود کردن شمارنده از 0 تا 7
Delay=LED_DELAY(counter); // عوض کردن مقدار تاخیر روشن و خاموش شدن ال ای دی
}
}

توضیحات داخل برنامه هست و فقط در مورد INT1_vect توضیح میدم:

این دستور به تابع اینتراپت میگه که هر وقت اینتراپت 1 اتفاق افتاد ، اجرا بشه.

برای اینتراپت 0 از INT0_vect استفاده میکنیم.

توی avr بخش ها مختلفی اینتراپت تولید میکنن که در بخش های دیگه به اونا اشاره میکنیم.

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

وقتی برنامه اجرا شد ، در ابتدا LED هر 4 ثانیه یکبار روشن و خاموش میشه.وقتی که کلید زده شد ، وقفه رخ میده و مقدار کانتر 1 میشه ، و مقدار Delay 1000 میلی ثانیه میشه.

اگر کلید همینطور زده بشه و مقدار counter به نهایت خودش که 7 هست ، برسه ، مقدار تاخیر به 4000 میلی ثانیه میرسه و اگر یکبار دیگه کلید زده بشه ، مقدار کانتر 0 شده و مقدار تاخیر 500 میلی ثانیه میشه.

برنامه کلی:

نکته: این برنامه تست شده و هیچ ایرادی نداره!!! سخت افزار من ایراد داشت و خوب کار نمیکرد که با درست کردن سخت افزار ، کل برنامه به خوبی کار میکنه.(دیباگ کردنش 3 ساعت طول کشید!!!)

تمام توضیحات داخل برنامه هست.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
* avr-tutorial6.c
*
* Created: 7/31/2018 9:10:29 AM
* Author : Mahdi OCTACORE.IR ADMIN
*/
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/sfr_defs.h>
// پین 0 از پرت بی ، برای روشن و خاموش کردن ال ای دی
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED PORTB0
//تعریف ماکرو برای تبدیل عدد به میلی ثانیه
#define LED_DELAY(A) ((A+1)*500)
 
 
void init_int1();
void delay_ms(double milisec);
 
volatile uint16_t Delay=4000; // تاخیر بر حسب میلی ثانیه
volatile uint8_t counter;
 
int main(void)
{
   PORTD |= (1<<3); //فعال کردن پول آپ پین 3 از پرت دی ، برای اتصال کلید
   LED_DDR |= (1<<LED);
   init_int1();
    while (1)
    {
LED_PORT ^= (1<<LED);
delay_ms(Delay);
    }
}
 
void init_int1()
{
GICR |=(1<<INT1); //فعال کردن وقفه 1 خارجی
MCUCR|=(1<<ISC11); //حساس به لبه پایین رونده
sei(); // فعال کردن کلی اینتراپت
}
 
ISR (INT1_vect)
{
_delay_ms(1); //تاخیر برای نادیده گرفتن نویز کلید
if (bit_is_clear(PIND , 3)) // اگر همچنان کلید پایین نگه داشته شده
{
counter++; // اضافه کردن یک واحد به شمارنده
counter &=0b00000111; // محدود کردن شمارنده از 0 تا 7
Delay=LED_DELAY(counter); // عوض کردن مقدار تاخیر روشن و خاموش شدن ال ای دی
}
}
 
void delay_ms(double milisec)
{
while (milisec--)
{
_delay_ms(1);
}
}

 

چند نکته :

برای تاخیر (تابع Delay ) از متغیر فرار استفاده شده ، برای اینکه کامپایلر و CPU متوجه بشن که در هر زمان امکان تغییر کردن این متغییر وجود داره و مقدار تغییر داده شده رو توی بخش های مد نظر استفاده کنن.

 

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

 

حتما مقاومت پول آپ پایه مربوط به اینتراپت رو فعال کنید.

 

چون توابع کتابخوانه util/delay.h مقدارهای متغیر برای تاخیر رو قبول نمیکنن مجبوریم خودمون تابع تاخیر رو بنویسیم.

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

 

خدا قوت…

این آموزش هم تموم شد و اگر فکر میکنید که نکته ای جا افتاده بگید تا اضافه کنم .

موفق باشید…

 

 

 

اشتراک گذاری:
برچسب ها: atmega8atmel studioatmel studio 6atmel studio 7avravr studiogicrinterruptmcucrmega8octacorepdfsfr_defs.huartآموزشآموزش atmelآموزش atmel studioآموزش atmel studio 6آموزش atmel studio 7آموزش atmel studio فارسیآموزش avrآموزش اتمل استودیوآموزش حرفه ایآموزش حرفه ای avrآموزش رایگانآموزش وقفهآموزش وقفه حارجیاموزش اتملدانلود آموزشدانلود آموزش avrکابخانه وقفهکتابخانه interruptماکرو در atmel studioوقفه خارجیوقفه خارجی atmelوقفه خارجی در atmel studioوقفه در avrوقفه در vr
درباره مهدی

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

نوشته های بیشتر از مهدی
22 درصدتخفیف
post
تخفیف استثنائي فروشگاه هشت هسته ، پروگرامر stk500 با کمترین قیمت و بالاترین کیفیت ! 187 تومان
مشاهده محصول
مطالب زیر را حتما بخوانید
  • راه اندازی سنسور دما و رطوبت dht11

    100 بازدید

  • why FPGA

    130 بازدید

  • Image_Processing_By_Verilog

    153 بازدید

  • دانلود نسخه سالم نرم افزار HSPICE + آموزش نصب

    226 بازدید

  • Driving MCP4922_DAC By Verilog

    148 بازدید

جدید تر دانلود رایگان کاربردی ترین کتابخانه های Altium Designer
قدیمی تر موسسه مهندسان برق و الکترونیک

دیدگاهتان را بنویسید لغو پاسخ

قوانین ثبت دیدگاه

  • اگر امکان داره دیدگاهتون رو به صورت فینگلیش ننویسید!
  • لطفا دیدگاهتون متناسب با مطلب باشه!
  • لطفا دیدگاه تکراری ننویسید!
  • اگر سوالی هم دارید همین جا میتونید بپرسید و مشکلی نداره.

جستجو برای:
سرفصل مطالب سایت
  • biomedical engineering
  • hardware
    • article
    • Source Code
  • other
    • business
    • practical software
  • power electronic
  • software engineering
    • image processing
  • weblog
    • electronic
      • book
      • knowledge base
      • microcontroller
        • AVR
          • AVR Library
          • AVR Tutorial
      • PCB
      • programming
    • mechanics & aerospace
      • ariplane designe
      • book
      • Exercise
آخرین دیدگاه‌ها
  • Homa Zarei Zohdy در شهرهای هوشمند و شبکه های برق
  • Homa Zarei Zohdy در شهرهای هوشمند و شبکه های برق
  • Homa Zarei Zohdy در شهرهای هوشمند و شبکه های برق
  • japanese platform beds در شهرهای هوشمند و شبکه های برق
  • erotik در شهرهای هوشمند و شبکه های برق
آخرین مطالب
  • شهرهای هوشمند و شبکه های برق
  • راه اندازی سنسور دما و رطوبت dht11
  • نیروگاه بادی منفصل از شبکه
  • فشرده سازی تصاویر ثابت و متحرک (قسمت دوم )
  • روش های پیشنهادی برای کنترل ریزشبکه ها
دسترسی سریع به وبلاگ
  • electronic
  • mechanics & aerospace
  • biomedical engineering
اطلاعات تماس
  • location_on
    شماره تماس فقط برای ارتباط از طریق واتس آپ یا تلگرام میباشد.
  • phone_android
    09374187582
  • email
    octacore.ir@gmail.com
دسترسی به فروشگاه
  • فروشگاه
  • حساب کاربری من
  • پرداخت
  • سبد خرید
پیوندهای مفید
  • تماس با ما

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

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

ما رو حتما دنبال کنین ..

© تمام حقوق برای octacore.ir محفوظ است.کپی بدون ذکر منبع لینکدار مجاز نمیباشد.
keyboard_arrow_up