کتاب آموزش اتمل استودیو

saalek110

Well-Known Member
کتاب آموزش اتمل استودیو

کتاب که نمیشه گفت ، یک سریpdf چهار تا ۱۰ صفحه ای است.
ولی چون سینتکس اتمل است به کار می آید.
 
آخرین ویرایش:

saalek110

Well-Known Member

پیوست ها

  • AVR کتاب آموزش و مثال بر ای (1).rar
    12.3 مگایابت · بازدیدها: 15

saalek110

Well-Known Member
شرح ضمیمه پست قبل:
شامل یک سری pdf است،15 تا pdf با شماره های ۱ تا ۱۵ و ۳ تا pdf بدون شماره.
در اولی ساختن پروژه و اولین برنامه که خاموش و روشن کردن یک پین است ، را داریم. ۱۰ صفحه.
در دومی پایه های میکروکنترلر های atmega8 و atmega16 را نشان داده. با مقداری توضیحات ، ۴ صفحه.
در سومی ، گفته چطور پایه های پورت ها را نام می بریم.


PHP:
PORTD = (1 << PD0)|(1 << PD3)|(1 << PD6);
PORTD = (1 << 0)|(1 << 3)|(1 << 6);
PORTD = 0b01001001;
PORTD = 0x49;
            //Now, let’s consider the following statements:
DDRC = 0b10110001;
PORTC = 0b10010001;
OUTPUT = 0b10010001; /*This is not a C executable line, this
 line is just for explanation*/

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

در فایل ۴ : در مورد سیمولیشن گفته و دیباگ.
در فایل ۵: در مورد موتور و راه انداز ۲۹۳ گفته.
 
آخرین ویرایش:

saalek110

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

در فایل ۶ در مورد lcd گفته و چنین کدی نوشته:
PHP:
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
int main(void)
{
 lcd_init(LCD_DISP_ON_CURSOR); /* initialize lcd, display
on, cursor on */
 /* for more options for
 /* lcd_init(), view lcd.h f
ile
 while(1) /* run continuously */
 {
 lcd_clrscr(); /* clear screen of lcd */
 lcd_home(); /* bring cursor to 0,0 */
 lcd_puts("hello"); /* type something random */
 lcd_gotoxy(0,1); /* go to 2nd row 1st col */
 lcd_puts("maxEmbedded"); /* type something random */
 _delay_ms(50); /* wait 50ms */
 }
}
من کد را تست نکردم ، فقط در pdf بود ، اینجا کپی کردم.
همچنین گفه چطور متغیرهای int و float را نمایش دهیم.
 

saalek110

Well-Known Member
فایل ۷ در مورد سنسورها مطالب نوشته ، ۳ صفحه است.
فایل ۸ در مورد Adc است ، یعنی تبدیل آنالوگ به دیجیتال.
فایل ۹ : مقدمه ای بر تایمرهای میکروکنترلر. تاپیک تایمر داریم ، می توانید اون تاپیک را هم ببینید. البته با کدویژن من کار کردم. مفاهیم فرق نداره ، چه در کدویژن باشه ، چه در اتمل استودیو ، سینتکس کد فرق داره فقط. اگر جای دیگر تایمرها را یاد بگیرید ، در این pdf سینتکس کد اتمل اش را می توانید در این pdf ببینید.
فایل ۱۰ : تایمر


PHP:
01 #include <avr/io.h>
02
03 void timer0_init()
04 {
05 // set up timer with prescaler = 1024
06 TCCR0 |= (1 << CS02)|(1 << CS00);
07
08 // initialize counter
09 TCNT0 = 0;
10 }
11
12 int main(void)
13 {
14 // connect led to pin PC0
15 DDRC |= (1 << 0);
16
17 // initialize timer
18 timer0_init();
19
20 // loop forever
21 while(1)
22 {
23 // check if the timer count reaches 124
24 if (TCNT0 >= 124)
25 {
26 PORTC ^= (1 << 0); // toggles the led
27 TCNT0 = 0; // reset counter
28 }
29 }
30 }

کد بالا نمونه از کتاب فوق است. من تست نکردم ، فقط اینجا برای نمایش گذاشتم.
شرح مختصر کد از خودم: یک تابع قبل main تعریف کرده و دو تا رجیستر را داخلش مقدار داده.یک led به پین صفر پورت C وصل است. داخل حلقه while رجیستر tcnt را بررسی کرده ، وقتی به حدی رسیده ، پایه led را تغییر داده و رجیستر tcnt را صفر کرده.مشابه این برنامه را در تاپیک تایمرها ، در کدویژن نوشتیم. فقط سینتکس کدنویسی فرق کرده وگرنه همان کار انجام شده.
 
آخرین ویرایش:

saalek110

Well-Known Member
این هم کد فاینال این جزوه است:

PHP:
01 #include <avr/io.h>
02 #include <avr/interrupt.h>
03
04 // global variable to count the number of overflows
05 volatile uint8_t tot_overflow;
06
07 // initialize timer, interrupt and variable
08 void timer0_init()
09 {
10 // set up timer with prescaler = 256
11 TCCR0 |= (1 << CS02);
12
13 // initialize counter
14 TCNT0 = 0;
15
16 // enable overflow interrupt
17 TIMSK |= (1 << TOIE0);
18
19 // enable global interrupts
20 sei();
21
22 // initialize overflow counter variable
23 tot_overflow = 0;
24 }
25
26 // TIMER0 overflow interrupt service routine
27 // called whenever TCNT0 overflows
28 ISR(TIMER0_OVF_vect)
29 {
30 // keep a track of number of overflows
31 tot_overflow++;
32 }
33
34 int main(void)
35 {
36 // connect led to pin PC0
37 DDRC |= (1 << 0);
38
39 // initialize timer
40 timer0_init();
41
42 // loop forever
43 while(1)
44 {
45 // check if no. of overflows = 12
46 if (tot_overflow >= 12) // NOTE: '>=' is used
47 {
48 // check if the timer count reaches 53
49 if (TCNT0 >= 53)
50 {
51 PORTC ^= (1 << 0); // toggles the led
52 TCNT0 = 0; // reset counter
53 tot_overflow = 0; // reset overflow counter
54 }
55 }
56 }
57 }
در این کد دو تا تست و ریست در قسمت while داریم که می بینید. همان if ها و مساوی صفر قرار دادن ها را میگم.

بالای برنامه هم می بینید که یک متغیر گلوبال به نام tot_overflow تعریف کرده ، تا همه جا قابل استفاده باشه ، و داخل تابع init اون متغیر را صفر کرده.

کلمه volatile را در گوگل من سرچ کردم ، زیاد چیزی نفهمیدم. شاید در اتمل استودیو با این کلمه متغیر گلوبال می سازند. وگرنه اون کلمه uint8_t که فقط نوع متغیر را از لحاظ سایز نشون می دهد.
یک سایت را نگاه کردم ، گفته کلمه volatile برای همین گلوبال ساختن برای رجیسترها استفاده میشه.
گلوبال که گفتم متغیری است که همه جا شناخته شده باشه. شما فکر کنید اتمل یک جایی گیر کرده این کلمه volatile را ابداع کرده تا کارش راه بیافته. و اگر اونجا نزارید کد کار نمی کنه.

ادامه داستان: متغیر tot_overflow که گلوبال بود در تابع ISR بهش یک واحد افزوده شده.ولی من که نمی بینم جایی تابع ISR صدا زده شده باشه.

ورودی تابع ISR در این برنامه TIMER0_OVF_vect است که فکر کنم به معنی تایمر صفر اورفلو یا سرریز است. در برنامه های بعدی این جزوه ها برای تایمر ۱ و ۲ تنظیم شده.

توضیحات خود pdf در عکس ضمیمه پست هست.

Screenshot_۲۰۲۳-۱۱-۰۹_۰۲۲۹۴۶.jpg
در عکس ضممیه رجیستر TIFR را می بینیم که تا جایی که من می بینم و اگر درست بگم... اورفلوهای تایمرهای صفر و یک و دو را دارد... باقی بیت ها را فعلا کار نداریم.

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

این رجیسترها و رفتارشون را باید درک کنیم، چیزی است که ساخته شده واین طوری کار می کنه.

یک نیمچه آموزش تایمر هم اینجا نوشتیم.
 
آخرین ویرایش:

saalek110

Well-Known Member
کد پست قبل با حذف اعداد اول سطر:

PHP:
 #include <avr/io.h>

 #include <avr/interrupt.h>



 // global variable to count the number of overflows

 volatile uint8_t tot_overflow;



 // initialize timer, interrupt and variable

 void timer0_init()

 {

 // set up timer with prescaler = 256

 TCCR0 |= (1 << CS02);



 // initialize counter

 TCNT0 = 0;



 // enable overflow interrupt

 TIMSK |= (1 << TOIE0);



 // enable global interrupts

 sei();



 // initialize overflow counter variable

 tot_overflow = 0;

 }



 // TIMER0 overflow interrupt service routine

 // called whenever TCNT0 overflows

 ISR(TIMER0_OVF_vect)

 {

 // keep a track of number of overflows

 tot_overflow++;

 }



 int main(void)

 {

 // connect led to pin PC0

 DDRC |= (1 << 0);



 // initialize timer

 timer0_init();



 // loop forever

 while(1)

 {

 // check if no. of overflows = 12

 if (tot_overflow >= 12) // NOTE: '>=' is used

 {

 // check if the timer count reaches 53

 if (TCNT0 >= 53)

 {

 PORTC ^= (1 << 0); // toggles the led

 TCNT0 = 0; // reset counter

 tot_overflow = 0; // reset overflow counter

 }

 }

 }
 

saalek110

Well-Known Member
فایل ۱۱ ، در مورد تایمر ۱ است.

PHP:
01 #include <avr/io.h>
02 #include <avr/interrupt.h>
03
04 // global variable to count the number of overflows
05 volatile uint8_t tot_overflow;
06
07 // initialize timer, interrupt and variable
08 void timer1_init()
09 {
10 // set up timer with prescaler = 8
11 TCCR1B |= (1 << CS11);
12
13 // initialize counter
14 TCNT1 = 0;
15
16 // enable overflow interrupt
17 TIMSK |= (1 << TOIE1);
18
19 // enable global interrupts
20 sei();
21
22 // initialize overflow counter variable
23 tot_overflow = 0;
24 }
25
26 // TIMER1 overflow interrupt service routine
27 // called whenever TCNT1 overflows
28 ISR(TIMER1_OVF_vect)
29 {
30 // keep a track of number of overflows
31 tot_overflow++;
32
33 // check for number of overflows here itself
34 // 61 overflows = 2 seconds delay (approx.)
35 if (tot_overflow >= 61) // NOTE: '>=' used instead of '=='
36 {
37 PORTC ^= (1 << 0); // toggles the led
38 // no timer reset required here as the timer
39 // is reset every time it overflows
40
41 tot_overflow = 0; // reset overflow counter
42 }
43 }
44
45 int main(void)
46 {
47 // connect led to pin PC0
48 DDRC |= (1 << 0);
49
50 // initialize timer
51 timer1_init();
52
53 // loop forever
54 while(1)
55 {
56 // do nothing
57 // comparison is done in the ISR itself
58 }
59 }

کد بالا ، مشابه کد تایمر صفر است. و نیاز به توضیح ندارد.
 

saalek110

Well-Known Member
فایل ۱۲ در مورد تایمر ۲ است.
کدش هم مشابه کد تایمر صفر است که در پستهای قبل شرح دادیم.

باید این کدها را در اتمل استودیو atmel studio کامپایل کنیم بریزیم در میکروکنترلر. من فعلا این کارو نکردم.
 
آخرین ویرایش:

saalek110

Well-Known Member
فایل ۱۳ در مورد CTC Mode است.که در مورد تایمر ها است هنوز.
جزوه ۹ صفحه است. شاید بعدا در این مورد اینجا نوشتم.

فایل ۱۴ ، در مورد pwm است.
فایل ۱۵ ، هم ادامه pwm است.

۳ تا فایل بی شماره هم هست در مورد میکروکنترلر و چیزهای مورد نیاز گفته.مثل پروگرمر.
 
آخرین ویرایش:

saalek110

Well-Known Member
مصور ، ۱۲ صفحه ، در مورد چگونگی استفاده از امکانات برنامه
 

پیوست ها

  • CProgrammingInAtmelStudio7.pdf
    1.3 مگایابت · بازدیدها: 7

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

بالا