به نام خدا : موضوع این جلسه : چند تا پروژه در زمینه spi؛ تو جلسه قبل از سری مطالب آموزش جامع avr در مورد spi یه توضیح کوچیکی!
پروژه avr یک :
همون طور که تو عکس زیر میبینید یکی از میکروکنترلر ها فرستنده هست( میکروکنترلر avr سمت راستی) و اون یکی میکروکنترلر گیرنده هستش( میکروکنترلر avr سمت چپی).
که گیرنده اطلاعات رو دریافت و در lcd نشون میده.
کد های MASTER یا همون فرستنده
کد های زیر چیز خاصی نداره فقط :
۱) به نحوه مقدار دهی و پایه PORTB دقت کنید (البته در جلسه قبل در موردش توضیح دادم)
۲) نحوه مقدار دهی ریجستر ها هم مهمه(اینم تو جلسه قبل در موردش صحبت کردم.)
۳) اطلاعات رو به وسیله تابع SPI ارسال میکنیم.
۴) اگه از کد های مربوط به LCD چیزی نمیدونید و تا حالا هم با LCD کار نکردید مطلب زیر رو بخونید :
آموزش جامع کار با LCD کاراکتری
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 | #include <mega16.h> #include <delay.h> #include <stdlib.h> #include <spi.h> #include <lcd.h> #asm .equ __lcd_port=0x1b //porta #endasm void main(void) { int send_data; PORTB=0X00; DDRB=0XB0; PORTD=0Xff; DDRD=0X00; SPCR=0X53; SPSR=0X00; lcd_init(16); while (1) { send_data=PIND; spi(send_data); delay_ms(250); }; } |
کد های SLAVE یا همون گیرنده
اینم کاش چیز خاصی نداره فقط این که :
اطلاعات دریافتی در متغییر get_data ذخیره شده و (چون این متغییر رو نمیشه در lcd نشون داد) میاییم و این متغییر رو به وسیله تابع itoa در آرایه lcd_buffer قرار میدیم و بعد این آرایه رو تو lcd نشون میدیم.
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 | #include <mega16.h> #include <delay.h> #include <stdlib.h> #include <spi.h> #include <lcd.h> #asm .equ __lcd_port=0x1b //porta #endasm void main(void) { char lcd_buffer[16]; int get_data; PORTB=0X00; DDRB=0X40; PORTD=0Xff; DDRD=0X00; SPCR=0X43; SPSR=0X00; lcd_init(16); while (1) { get_data=spi(0); lcd_clear(); lcd_puts("NUMBER IS : "); itoa(get_data,lcd_buffer); lcd_puts(lcd_buffer); delay_ms(250); }; } |
پروژه avr دو:
این پروژه رو دیگه من توضیح نمیدم-حال توضیح دادنشم رو هم ندارم-چیز خاصی هم نداره-اگه پروژه قبلی رو خوب خونده باشید و یاد گرفته باشید این پروژه چیز خاصی نداره.تو این پروژه هر دو تا میکو هم فرستنده هستند و هم گیرنده.>>>در زیر کد های master و slave رو قرار میدم این دو تا کد هر دوشون هم کار فرستادن و گرفتن اطلاعات رو انجام میدن و تنها تفاوتشون اینه که کد های تابع slave اول اطلاعات رو دریافت و بعد اطلاعات ارسال میکنند و کد های مربوط به master اول اطلاعات میفرستند و بعد اطلاعات دریافت میکنن.>>>در کل چیز خاصی نداره ولی اگه مشکل داشتید توش>>همین جا اعلام کنید (در قسمت نظرات)
کد های MASTER یا همون فرستنده
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 | #include <mega16.h> #include <delay.h> #include <stdlib.h> #include <spi.h> #include <lcd.h> #asm .equ __lcd_port=0x1b //porta #endasm void main(void) { int send_data,get_data; char lcd_buffer[16]; PORTD=0Xff; DDRD=0X00; lcd_init(16); while (1) { DDRB=0XB0;PORTB=0X00; SPCR=0X53;SPSR=0X00; send_data=PIND; spi(send_data); delay_ms(250); DDRB=0X40;PORTB=0X00; SPCR=0X43;SPSR=0X00; get_data=spi(0); lcd_clear(); lcd_puts("NUMBER IS : "); itoa(get_data,lcd_buffer); lcd_puts(lcd_buffer); delay_ms(250); }; } |
کد های SLAVE یا همون گیرنده
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 | #include <mega16.h> #include <delay.h> #include <stdlib.h> #include <spi.h> #include <lcd.h> #asm .equ __lcd_port=0x1b //porta #endasm void main(void) { int send_data,get_data; char lcd_buffer[16]; PORTD=0Xff; DDRD=0X00; lcd_init(16); while (1) { DDRB=0X40;PORTB=0X00; SPCR=0X43;SPSR=0X00; get_data=spi(0); lcd_clear(); lcd_puts("NUMBER IS : "); itoa(get_data,lcd_buffer); lcd_puts(lcd_buffer); delay_ms(250); DDRB=0XB0;PORTB=0X00; SPCR=0X53;SPSR=0X00; send_data=PIND; spi(send_data); delay_ms(250); }; } |
مهمان
سلام من این پروژه رو دانلود کردم ولی یکی از lcd ها کار میکنه .
به نظر میاد slave نمیتونه اطلاعات به master بده ….آیا باید تنظیماتی رو روی آنها اعمال کنم ؟
ممنون میشم جواب بدهید با تشکر از سایت خوبتون
مهمان
سلام ممنون از مطالبتون
چطوری میتونم یه رشته رو ارسال و دریافت کنم؟
مهمان
با سلام و خسته نباشید
آقا اون صفر در (spi(0 معنیش اینه که موقع دریافت هیچی ارسال نکن؟
مهمان
سلام آقا مهدی
میگم اگه دیتای ارسالی بیش از 8 بیت باشه میشه از این پروتکل برای انتقال استفاده کرد یا خیر؟چون spi در هر بار ارسال فقط 8 بیت دیتا رو ارسال میکنه
مثلا اگه خروجی ی ماژول 12 بیت دیتا باشه این ماژول میتونه دیتای خودش رو با spi ارسال کنه؟؟؟
نویسنده این مطلب
سلام – خب میای 2 تا بسته داده پشت سر هم ارسال میکنه!
8 + 4
مهمان
سلام ، من میخوام ترموکوپل رو با max6675 با یه میکرو atmega 16 راه اندازی کنم ، ارتباط spi رو هپ برقرار کردم ، فقط نمیدونم چطور باید اطلاعات رو ازش بخونم ، به این صورتی هم که آموزش دادین تست کردم جواب نمیده ، امکانش هست یه کوچولو راهنماییم کنید..
سپاس از سایت فوقالعاده مفیدتون ، با ارزوی موفقیت روز افزون
نویسنده این مطلب
سلام
همین پروژه تو نت هستش
مهمان
همه پروژها رو گشتم همچین چیزی نیست فقط ویدیویی از پروژه تو آپارت هستش
نویسنده این مطلب
والا چی بگم – من خودم هم کار نکردم با این سنسور
تو سایتای خارجی بزن.
مهمان
سلام
تونستید با max6675 دما رو بخونید؟؟
مهمان
نه هنوز نتونستم…

مهمان
سلام ببخشید تو شبکه سریال برای ارسال ارایه باید چیکار کرد
نویسنده این مطلب
سلام-خون هاشو یکی یکی ارسال کن.