راه اندازی 74hc595 با SPI !!!

در اين بخش مي‌توانيد آموزش و مثال‌های مرتبط با میکروکنترلرهای AVR را مشاهده بفرمایید

مدیران انجمن: SAMAN, sinaset, شوراي نظارت

ارسال پست
Colonel II
Colonel II
نمایه کاربر
پست: 7367
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9246 بار
سپاس‌های دریافتی: 21574 بار
تماس:

راه اندازی 74hc595 با SPI !!!

پست توسط sinaset » پنج شنبه 20 دی 1397, 11:18 am

بنام خدا
باسلام 


خیلی ساله،که این فکر به ذهنم خطور میکرد،که ایا میشود این ایسی را با SPI راه اندازی کرد! یا نه، بعد از مدتها دیشب به صورت اتفاقی ازمایشی در پرتئوس انجام دادم! و سون سگمنتی را با SPI راه اندازی کردم..!
 
تصویر
در ازمایش بالا،به کمک واحد SPI در فرکانس 4مگاهرتز، ایسی 74hc595 راه اندازی شده و اعداد 0 تا 9 را بر روی سون سگمنت تک کاتدمشترک،می شمارد و نمایش میدهد! 

*البته ازمایش روی پرتئوس جواب داده ولی هنوز به صورت سخت افزاری ازمایش نشده است! 
*فرکانس راه اندازی 16 مگاهرتز
همچنین همانطور که در تصویر می ببینید،دو عدد ایسی 595 راه اندازی شده و مشکلی از بابت تعداد بالا راه اندازی در ایسی نیست!

کد: انتخاب همه

 /*******************************************************
data :1397.10.20 
ver : spi 74hc 595 v1
by:sinaset
site:centralclubs.com
Chip type: ATmega8
AVR Core Clock frequency: 16.000000 MHz
*******************************************************/
#include <mega8.h>
#include <spi.h>
#include <delay.h> 

#define  SS  PORTB.2=1,PORTB.2=0;
flash unsigned char Segment[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};  //عدد نمايشي سون سگمنت

void main(void)
{
char i=0;
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 4000/000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);  //راه اندازي SPI
SPSR=(0<<SPI2X);

delay_ms(300);

while (1)
      {     
         spi(0x0f);         //ايسي همينطوري وصل شده!
         spi(Segment[i]);   //سون سگمنت 
         SS;                //نمايش کدها  
         
         i++;
         if(i>9)i=0; 
         
         delay_ms(500);         
      }
}[/i]


[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]برنامه به همراه شبیه ساز
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7367
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9246 بار
سپاس‌های دریافتی: 21574 بار
تماس:

Re: راه اندازی 74hc595 با SPI !!!

پست توسط sinaset » پنج شنبه 4 بهمن 1397, 2:15 pm

بنام خدا
باسلام 

تصویر
نسخه 2 و شمارش اعداد با سون سگمنت 4 قطهه ای


خوب در این طرح جدید، سون سگمنت 4 قطعه کاتد مشترک، به کمک رابط SPI میکروکنترولر با نرخ تبادل 4 مگابیت! و فرکانس میکروکنترولر 16 مگاهرتز مورد ازمایش قرار میگرید.!

در این طرح از 0 تا 9999 شمارش میشود

کدها:
 

کد: انتخاب همه

 /*******************************************************
data :1397.10.20 
ver : spi 74hc 595 v2   7segment 4 Digit
by:sinaset
site:centralclubs.com
Chip type: ATmega8
AVR Core Clock frequency: 16.000000 MHz
*******************************************************/
#include <mega8.h>
#include <spi.h>
#include <delay.h> 
#define  SS  PORTB.2=1,PORTB.2=0;
flash unsigned char Segment[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};  //عدد نمايشي سون سگمنت

char Select=0;
int i=0;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)  //وقفه تايمر 0 براي ريفرش سون سگمنت
{
TCNT0=0xB2;
         if(Select==0){spi(14);spi(Segment[i/1000]);SS;}   
         if(Select==1){spi(13);spi(Segment[i/100%10]);SS;} 
         if(Select==2){spi(11);spi(Segment[i/10%10]);SS;}                
         if(Select==3){spi(7);spi(Segment[i%10]);SS;}  
         Select++;
         if(Select>3)Select=0;
}

void main(void)
{
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// سرعت راه اندازي واحد 4 مگابيت
// SPI Type: Master
// SPI Clock Rate: 4000/000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);  //راه اندازي SPI
SPSR=(0<<SPI2X);
//تنظيم تايمر براي هر 5 ميلي ثانيه
TCCR0=(1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0xB2;
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<TOIE0);

#asm("sei")
while (1)
      { 
         i++;
         if(i>9999)i=0; 
         delay_ms(250);  
      }
}
[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]کد و برنامه و شبیه ساز.

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 4
تاریخ عضویت: سه شنبه 20 تیر 1391, 6:47 pm

Re: راه اندازی 74hc595 با SPI !!!

پست توسط mfazl22 » سه شنبه 9 بهمن 1397, 10:50 pm

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

Colonel II
Colonel II
نمایه کاربر
پست: 7367
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9246 بار
سپاس‌های دریافتی: 21574 بار
تماس:

Re: راه اندازی 74hc595 با SPI !!!

پست توسط sinaset » چهار شنبه 10 بهمن 1397, 7:43 am

سلام بر شما

کاربر محترم،سوال شما مفهومش مشخص نیست!

رابط spi یک واحد سخت افزاری درون میکروکنترولر می باشد.

در این طرح بجایی روش ارتباط نرم افزاری با ایسی 74hc595 با روش سخت افزاری که سرعت بسیار بیشتری دارد! دستورات برای ایسی فرستاده شده.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

New Member
پست: 4
تاریخ عضویت: سه شنبه 20 تیر 1391, 6:47 pm

Re: راه اندازی 74hc595 با SPI !!!

پست توسط mfazl22 » شنبه 13 بهمن 1397, 2:14 pm

من یه ماژول spi دارم 
2 تا سون سگمنت 4 تایی دارم
3 تا دکمه 
یه دونه هم آی سی حافظه 
اول می‌خواستم با مگا 16 یا 32 کار کنم
اگه بخوام با مگا 8 یا هر میکروی 32 پایه این کار رو انجام بدم پایه کم میارم تا اینکه مطلب شما رو دیدم که کلا فکر منو عوض کرد
 میخوام اگه بشه از 6 تا پایه میکرو استفاده کنم و 4 تا 595 این جوری کلی پایه زیاد میارم 
3 تا پایه برای 2 تا 595 که میره یه یه سون سگمنت
3 تا پایه دیگر هم برای 2 تا 595 که میره یه یه سون سگمنت
 
تونستم درست توضیح بدم؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Colonel II
Colonel II
نمایه کاربر
پست: 7367
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9246 بار
سپاس‌های دریافتی: 21574 بار
تماس:

Re: راه اندازی 74hc595 با SPI !!!

پست توسط sinaset » شنبه 13 بهمن 1397, 2:37 pm

سلام بر شما.
چه خوب که مقاله برای شما خوب بوده.

ولی چند نکته،اسم ماژول SPI شما چیست؟!

چرا میخواهید از 6 پایه استفاده کنید! خوب از 3 پایه استفاده کنید و سون سگمنت رو روشن کنید.. اینکه مشکلی بخصوصی ندارد!

شما می توانید تعداد بسیاری زیادی ایسی 74hc595 رو بهم وصل کنید. (فکر میکنم تا بالایی 180 ایسی!) فقط با 3 پایه ..!(میکروکنترولر)

حال اگر شد، طرح بعدی دو سون سگمنت 4 قطعه ای ، رو فقط با دو ایسی 74hc595 راه اندازی میکنم..(انشالله)

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

Colonel II
Colonel II
نمایه کاربر
پست: 7367
تاریخ عضویت: سه شنبه 26 آذر 1387, 4:20 pm
سپاس‌های ارسالی: 9246 بار
سپاس‌های دریافتی: 21574 بار
تماس:

Re: راه اندازی 74hc595 با SPI !!!

پست توسط sinaset » شنبه 13 بهمن 1397, 3:42 pm

باسلام 

نسخه 3
راه اندازی دو عدد سون سگمنت 4 قطعه ای!
تصویر
در این طرح،بر روی سون سگمنت اول،یک عدد از 9999 به صورت برعکس شمارش میشود! و به روی سون سگمنت دیگر یک عدد از 0 تا 9999 شمارش میشود.
(فرکانس و دیگر باقی مسائل مثل دو نسخه قبلی می باشد)
کدهای برنامه:

کد: انتخاب همه

 /*******************************************************
data :1397.11.13 
ver : spi 74hc 595 v3    2   7segment 4 Digit
by:sinaset
site:centralclubs.com
Chip type: ATmega8
AVR Core Clock frequency: 16.000000 MHz
*******************************************************/
#include <mega8.h>
#include <spi.h>
#include <delay.h> 


#define  SS  PORTB.2=1,PORTB.2=0;
flash unsigned char Segment[10]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F};  //عدد نمايشي سون سگمنت

char Select=0;
int i=0,m=9999;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)  //وقفه تايمر 0 براي ريفرش سون سگمنت
{
TCNT0=0x06;
         if(Select==0){spi(0xFE);spi(Segment[i/1000]);SS;}   
         if(Select==1){spi(0xFd);spi(Segment[i/100%10]);SS;} 
         if(Select==2){spi(0xFb);spi(Segment[i/10%10]);SS;}                
         if(Select==3){spi(0xF7);spi(Segment[i%10]);SS;} 
         if(Select==4){spi(0xef);spi(Segment[m/1000]);SS;} 
         if(Select==5){spi(0xdf);spi(Segment[m/100%10]);SS;} 
         if(Select==6){spi(0xbf);spi(Segment[m/10%10]);SS;} 
         if(Select==7){spi(0x7f);spi(Segment[m%10]);SS;}
         Select++;
         if(Select>7)Select=0;
}

void main(void)
{
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// سرعت راه اندازي واحد 4 مگابيت
// SPI Type: Master
// SPI Clock Rate: 4000/000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);  //راه اندازي SPI
SPSR=(0<<SPI2X);
//تنظيم تايمر براي هر 5 ميلي ثانيه
TCCR0=(1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x06;
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<TOIE0);


#asm("sei")
while (1)
      { 
         i++;    //عدد قابل نمايش به روي سون سگمنت اول
         m--;    //عدد قابل نمايش به روي سون سگمنت دوم
         if(i>9999)i=0;  
         if(m<0)m=9999;
         delay_ms(250);  
      }
}

[لینک خارجی برای کاربران مهمان مخفی است، لطفا برای مشاهده لینک ثبت نام نموده و یا وارد سایت شوید]برنامه و شبیه ساز

باتشکر.
"قرآن"(کلام خدا) ...راه سعادت و خوشبختی.

ارسال پست

بازگشت به “آموزش و مثال‌ها AVR”