اطلاعیه

Collapse
No announcement yet.

پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

  • MM320
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نوشته اصلی توسط aashkanpasha نمایش پست ها
    متاسفانه مشکل اینه که من درمورد تایمر و بحث پرچم اصلا اطلاعاتی ندارم. نمدونم کلا چیه.
    فکر کنم برا همین نمیفهمم چه کدی باید بنویسم.
    شما قبلا گفتید از اتمل استدیو استفاده می کنید یه کاری بکن بیا کدویژون نصب کن کدویژون ویزارد داره که خوش با توجه تنظیمات کاربر میاد رجیستر ها رو مقدار دهی می کنه شما این مقادیر رو توی اتمل استفاده کن
    جدیدترین ویرایش توسط MM320; 2019/08/11, 21:57.

    یک دیدگاه بنویسید:


  • MM320
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    شما وقتی از spi در مد اسلیو استفاده می کنید میکرو منتظر دریافت بایت از مستر میشه بعد دریافت اولین کلاک از مستر دیتا ها بیت به بیت در رجستر spi اسیلو (در هر کلاک مستر) قرار می گیره برنامه شما تازه شروع به اسکن سون سگنمت می کنه و دوباره منتظر دریافت spi میشههمین طور که در تاپیک سون سگمنت و کیپد گفتم برنامه نباید وقفه یا ایستی نداشته باشه در صورت اعداد روی نمایشکر بصورت تاخیری که چشم انسان اونو ببنه میشه یا روی یک رقم می ایسته .راه حل:یا از آیسی MAX7219 استفاده کنن که خودش سون سگمنت راه اندازی می کنه یا اینه از تایمر ها استفاده کن به این صورت که هر 1ms یک رقم نشان بده و وقتی منتظر دریافت spi هست نمایشگر متوقف نمیشه.
    جدیدترین ویرایش توسط MM320; 2019/08/11, 21:33.

    یک دیدگاه بنویسید:


  • aashkanpasha
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

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

    نوشته اصلی توسط hossein.m98 نمایش پست ها
    خوب چیزی که منم گفتم منافاتی با این قضیه نداره! شما باید هربار پرچم داده spi رو چک کنید و اگر داده ای رسید اون رو توی یه متغیر قرار بدید. تایمر هم با توجه به اون متغیر داده رو روی سون سگمنت بذاره. حتی میتونید از وقفه spi استفاده کنید که نیازی به چک گردن پرچم در برنامه اصلی نباشه.

    Sent from my LG-H870S using Tapatalk

    یک دیدگاه بنویسید:


  • hossein.m98
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نوشته اصلی توسط aashkanpasha نمایش پست ها
    نه دوست عزیز.
    مشکل این نیست. سون سگمنت وقتی عدد رو نشون میده (وقتی ارتباط SPIندارم) همه چی اوکیه- و قسنگ ثابت دیده میشه. مشکل تو سون سگمنتها نیست.
    مشکل جای دیگس-
    ببینین عدد از کیپد وارد میشه و بازدن کلید مربع به میکرو دوم ومنتقل میشه و تابع سگمنت اون عدد رو نشون میده- ولی چون تابع سگمنت تو حلقه نیست یه بار نشون میده تموم میشه
    باید بذارم تو یه حلقه .
    اون حلقه باید بگه که تا عدد جدید نیومده همین عدد رو نشون بده. یعنی طرف عدد رو زد مربع رو زد باید عدد رو سگمنت بمونه تا زمانی که عدد بعدی بیاد که معلوم نیست کی بیاد.
    باید دستور تو ارتباط رو عوض کنم:
    کاری کنم که همون عدد رو تو حلقه هی نمایش بده هی نمایش بده تا زمانی که عدد بعدی رو منتق کنه.
    الان مشکل اینه که عدد منتق میشه و نمیدونم تو چه حلقه ای بزارم با چه شرطی. باید کاری کنم که میکرو دوم بگه به میکرو اول عدد اومد کارتو ادامه بعد بعد اون دوباره عدد فرستاد اونو بگیره.
    تونستم برسونم؟
    خوب چیزی که منم گفتم منافاتی با این قضیه نداره! شما باید هربار پرچم داده spi رو چک کنید و اگر داده ای رسید اون رو توی یه متغیر قرار بدید. تایمر هم با توجه به اون متغیر داده رو روی سون سگمنت بذاره. حتی میتونید از وقفه spi استفاده کنید که نیازی به چک گردن پرچم در برنامه اصلی نباشه.

    Sent from my LG-H870S using Tapatalk

    یک دیدگاه بنویسید:


  • aashkanpasha
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نه دوست عزیز.
    مشکل این نیست. سون سگمنت وقتی عدد رو نشون میده (وقتی ارتباط SPIندارم) همه چی اوکیه- و قسنگ ثابت دیده میشه. مشکل تو سون سگمنتها نیست.
    مشکل جای دیگس-
    ببینین عدد از کیپد وارد میشه و بازدن کلید مربع به میکرو دوم ومنتقل میشه و تابع سگمنت اون عدد رو نشون میده- ولی چون تابع سگمنت تو حلقه نیست یه بار نشون میده تموم میشه
    باید بذارم تو یه حلقه .
    اون حلقه باید بگه که تا عدد جدید نیومده همین عدد رو نشون بده. یعنی طرف عدد رو زد مربع رو زد باید عدد رو سگمنت بمونه تا زمانی که عدد بعدی بیاد که معلوم نیست کی بیاد.
    باید دستور تو ارتباط رو عوض کنم:
    کاری کنم که همون عدد رو تو حلقه هی نمایش بده هی نمایش بده تا زمانی که عدد بعدی رو منتق کنه.
    الان مشکل اینه که عدد منتق میشه و نمیدونم تو چه حلقه ای بزارم با چه شرطی. باید کاری کنم که میکرو دوم بگه به میکرو اول عدد اومد کارتو ادامه بعد بعد اون دوباره عدد فرستاد اونو بگیره.
    تونستم برسونم؟
    نوشته اصلی توسط hossein.m98 نمایش پست ها
    یعنی روشن و خاموش کردن سون سگمنت ها رو با وقفه تایمر انجام بدید. کافیه تایمر رو جوری تنظیم کنید که حدودا هر 20 میلی ثانیه وارد وقفه بشه و وضعیت سون سگمنت ها رو تغییر بده. این عدد 20 میلی ثانیه رو دقیقا یاد ندارم درسته یا نه ولی حدودا باید همین مقدار باشه.
    با اینکار وقتی برنامه در یک حلقه هم گرفتار شده باشه، تایمر کار اسکن سون سگمنت رو انجام میده و کاربر متوجه تغییر در نوع نمایش سون سگمنت نمیشه

    Sent from my LG-H870S using Tapatalk

    یک دیدگاه بنویسید:


  • hossein.m98
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نوشته اصلی توسط aashkanpasha نمایش پست ها
    یعنی چکار کنم. ؟؟؟چطوری؟
    یعنی روشن و خاموش کردن سون سگمنت ها رو با وقفه تایمر انجام بدید. کافیه تایمر رو جوری تنظیم کنید که حدودا هر 20 میلی ثانیه وارد وقفه بشه و وضعیت سون سگمنت ها رو تغییر بده. این عدد 20 میلی ثانیه رو دقیقا یاد ندارم درسته یا نه ولی حدودا باید همین مقدار باشه.
    با اینکار وقتی برنامه در یک حلقه هم گرفتار شده باشه، تایمر کار اسکن سون سگمنت رو انجام میده و کاربر متوجه تغییر در نوع نمایش سون سگمنت نمیشه

    Sent from my LG-H870S using Tapatalk

    یک دیدگاه بنویسید:


  • aashkanpasha
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    یعنی چکار کنم. ؟؟؟چطوری؟
    نوشته اصلی توسط hossein.m98 نمایش پست ها
    اسکن سون سگمنت رو به عهده تایمر بذارید تا وقفه ای در کارش ایجاد نشه.

    یک دیدگاه بنویسید:


  • hossein.m98
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نوشته اصلی توسط aashkanpasha نمایش پست ها
    ممنونم.
    من تونستم ارتباط psi مقدار عدد مورد نظرمو انتقال بدم. عددی که سمت میکروی اول وارد شده و 16 بیت داره رو با شیفت و اند کردن به دو قسمت تقسیم کردم و منتقل کردم.
    اینور هم تو میکرو دومم که سون سگمنت بهش وصله عدد رو بگیرم. نمایش بده- باتشکر از راهنمایی شما.
    اما الان عدد رو فقط یک ثانیه نشون میده و خاموش میشه تا عدد بعدی وارد بشه- مخام عدد تا ورود عدد بعدی بمونه-از صبحه اینور اونورش مکنم نمدونم چی میشه. هرچیه تو نوع نمایش عدد spi شدس.
    کد سمت سلیو یا سون سگمنته این.

    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    #define F_CPU 1000000




    unsigned char state=0;
    unsigned int number=0;
    unsigned int num_h,num_l;
    int a,b,c;


    unsigned char spi(unsigned char data){ //spi is function to recived and send
    SPDR=data;
    while((SPSR&(1<<SPIF))==0);
    return SPDR;
    }


    void segment(number){ //segment is function to show int number on segment
    DDRD=0xff; //d port is output
    DDRC=0xff; // c port is output
    a=number/100;
    number=number%100;
    b=number/10; //a,b,c is digits of entered number
    number=number%10;
    c=number;

    switch(a){
    case 0:PORTD=0xfe; PORTC=0X3F;break;
    case 1:PORTD=0xfe;PORTC=0X06;break;
    case 2:PORTD=0xfe;PORTC=0X5B;break;
    case 3:PORTD=0xfe;PORTC=0X4F;break;
    case 4:PORTD=0xfe;PORTC=0X66;break;
    case 5:PORTD=0xfe;PORTC=0X6D;break;
    case 6:PORTD=0xfe;PORTC=0X7D;break;
    case 7:PORTD=0xfe;PORTC=0X07;break;
    case 8:PORTD=0xfe;PORTC=0X7F;break;
    case 9:PORTD=0xfe;PORTC=0X6F;break;
    }
    _delay_ms(10); PORTD=0xff; PORTC=0X00;

    switch(b){
    case 0:PORTD=0xfd;PORTC=0X3F;break;
    case 1:PORTD=0xfd;PORTC=0X06;break;
    case 2:PORTD=0xfd;PORTC=0X5B;break;
    case 3:PORTD=0xfd;PORTC=0X4F;break;
    case 4:PORTD=0xfd;PORTC=0X66;break;
    case 5:PORTD=0xfd;PORTC=0X6D;break;
    case 6:PORTD=0xfd;PORTC=0X7D;break;
    case 7:PORTD=0xfd;PORTC=0X07;break;
    case 8:PORTD=0xfd;PORTC=0X7F;break;
    case 9:PORTD=0xfd;PORTC=0X6F;break;
    }
    _delay_ms(10); PORTD=0xff; PORTC=0X00;

    switch(c){
    case 0:PORTD=0xfb;PORTC=0X3F;break;
    case 1:PORTD=0xfb;PORTC=0X06;break;
    case 2:PORTD=0xfb;PORTC=0X5B;break;
    case 3:PORTD=0xfb;PORTC=0X4F;break;
    case 4:PORTD=0xfb;PORTC=0X66;break;
    case 5:PORTD=0xfb;PORTC=0X6D;break;
    case 6:PORTD=0xfb;PORTC=0X7D;break;
    case 7:PORTD=0xfb;PORTC=0X07;break;
    case 8:PORTD=0xfb;PORTC=0X7F;break;
    case 9:PORTD=0xfb;PORTC=0X6F;break;
    }
    _delay_ms(10); PORTA=0xff; PORTC=0X00;

    }


    int main(void)
    {
    DDRB=0X40; //config spi port
    PORTB=0X00;

    while (1)
    {
    SPCR=0X43; //control register config
    SPSR=0X00; //select register config
    num_h=spi(0x00); //take upper bits
    number=num_h;
    number=(number<<8);
    num_l=spi(0x00); //take lower bits
    number=(number|num_l); //create number by bits
    PORTB|=(1<<4); //ss port should be 1 after reciveing
    segment(number); //show number on 7segment

    }
    }
    اسکن سون سگمنت رو به عهده تایمر بذارید تا وقفه ای در کارش ایجاد نشه.

    یک دیدگاه بنویسید:


  • aashkanpasha
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    ممنونم.
    من تونستم ارتباط psi مقدار عدد مورد نظرمو انتقال بدم. عددی که سمت میکروی اول وارد شده و 16 بیت داره رو با شیفت و اند کردن به دو قسمت تقسیم کردم و منتقل کردم.
    اینور هم تو میکرو دومم که سون سگمنت بهش وصله عدد رو بگیرم. نمایش بده- باتشکر از راهنمایی شما.
    اما الان عدد رو فقط یک ثانیه نشون میده و خاموش میشه تا عدد بعدی وارد بشه- مخام عدد تا ورود عدد بعدی بمونه-از صبحه اینور اونورش مکنم نمدونم چی میشه. هرچیه تو نوع نمایش عدد spi شدس.
    کد سمت سلیو یا سون سگمنته این.

    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    #define F_CPU 1000000




    unsigned char state=0;
    unsigned int number=0;
    unsigned int num_h,num_l;
    int a,b,c;


    unsigned char spi(unsigned char data){ //spi is function to recived and send
    SPDR=data;
    while((SPSR&(1<<SPIF))==0);
    return SPDR;
    }


    void segment(number){ //segment is function to show int number on segment
    DDRD=0xff; //d port is output
    DDRC=0xff; // c port is output
    a=number/100;
    number=number%100;
    b=number/10; //a,b,c is digits of entered number
    number=number%10;
    c=number;

    switch(a){
    case 0:PORTD=0xfe; PORTC=0X3F;break;
    case 1:PORTD=0xfe;PORTC=0X06;break;
    case 2:PORTD=0xfe;PORTC=0X5B;break;
    case 3:PORTD=0xfe;PORTC=0X4F;break;
    case 4:PORTD=0xfe;PORTC=0X66;break;
    case 5:PORTD=0xfe;PORTC=0X6D;break;
    case 6:PORTD=0xfe;PORTC=0X7D;break;
    case 7:PORTD=0xfe;PORTC=0X07;break;
    case 8:PORTD=0xfe;PORTC=0X7F;break;
    case 9:PORTD=0xfe;PORTC=0X6F;break;
    }
    _delay_ms(10); PORTD=0xff; PORTC=0X00;

    switch(b){
    case 0:PORTD=0xfd;PORTC=0X3F;break;
    case 1:PORTD=0xfd;PORTC=0X06;break;
    case 2:PORTD=0xfd;PORTC=0X5B;break;
    case 3:PORTD=0xfd;PORTC=0X4F;break;
    case 4:PORTD=0xfd;PORTC=0X66;break;
    case 5:PORTD=0xfd;PORTC=0X6D;break;
    case 6:PORTD=0xfd;PORTC=0X7D;break;
    case 7:PORTD=0xfd;PORTC=0X07;break;
    case 8:PORTD=0xfd;PORTC=0X7F;break;
    case 9:PORTD=0xfd;PORTC=0X6F;break;
    }
    _delay_ms(10); PORTD=0xff; PORTC=0X00;

    switch(c){
    case 0:PORTD=0xfb;PORTC=0X3F;break;
    case 1:PORTD=0xfb;PORTC=0X06;break;
    case 2:PORTD=0xfb;PORTC=0X5B;break;
    case 3:PORTD=0xfb;PORTC=0X4F;break;
    case 4:PORTD=0xfb;PORTC=0X66;break;
    case 5:PORTD=0xfb;PORTC=0X6D;break;
    case 6:PORTD=0xfb;PORTC=0X7D;break;
    case 7:PORTD=0xfb;PORTC=0X07;break;
    case 8:PORTD=0xfb;PORTC=0X7F;break;
    case 9:PORTD=0xfb;PORTC=0X6F;break;
    }
    _delay_ms(10); PORTA=0xff; PORTC=0X00;

    }


    int main(void)
    {
    DDRB=0X40; //config spi port
    PORTB=0X00;

    while (1)
    {
    SPCR=0X43; //control register config
    SPSR=0X00; //select register config
    num_h=spi(0x00); //take upper bits
    number=num_h;
    number=(number<<8);
    num_l=spi(0x00); //take lower bits
    number=(number|num_l); //create number by bits
    PORTB|=(1<<4); //ss port should be 1 after reciveing
    segment(number); //show number on 7segment

    }
    }
    نوشته اصلی توسط MM320 نمایش پست ها
    اطلاعی در مورد مچ بند ها توی بازارندارم ولی اگه بخوانین طراحی کنید احتمالا باید بتونید قطعات smd کوچک مثل سون سگمنت تو بازار پیدا کنید من که شهرستان هستم از بازار تهران خبری ندارم.همنطور که می دونید باید سایز مچ بندتون در حالت استاندارد مچ بندهای توی بازار طراحی کنید.موفق باشید...
    جدیدترین ویرایش توسط aashkanpasha; 2019/08/11, 18:34.

    یک دیدگاه بنویسید:


  • MM320
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    اطلاعی در مورد مچ بند ها توی بازارندارم ولی اگه بخوانین طراحی کنید احتمالا باید بتونید قطعات smd کوچک مثل سون سگمنت تو بازار پیدا کنید من که شهرستان هستم از بازار تهران خبری ندارم.همنطور که می دونید باید سایز مچ بندتون در حالت استاندارد مچ بندهای توی بازار طراحی کنید.موفق باشید...

    یک دیدگاه بنویسید:


  • aashkanpasha
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نوشته اصلی توسط MM320 نمایش پست ها
    لصفا برنامه اینجا بزارید تا بهتر بتونم کمک کنم
    ببخشید من دیشب متوجه منظورتون نشده بودم. امروز فهمیدم جریان چیه. دیشب خسته بودم نمیگرفتم. ببخشید. در حال انجامشم اگه موردی بود خیر میدم. مننونم
    فقط یه سوال متفرقه: من مخام یه مچبند سون سگمنت بسازم. مثل ساعت مچی ولی توش سون سگمنا که بتونم باهاش ارتباط nrf با قطعات دیگه بگیرم. همچین ملزوماتی هست تو بازار؟ تجهیزات ساعت مچی یا سگمنت سایز خیلی کوچک فرستده گیرنده اون سایزی. ؟؟؟

    یک دیدگاه بنویسید:


  • MM320
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    لصفا برنامه اینجا بزارید تا بهتر بتونم کمک کنم

    یک دیدگاه بنویسید:


  • aashkanpasha
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نوشته اصلی توسط MM320 نمایش پست ها
    دوست غریز شما وقتی عدد وارد مقدارذ باینری درون متتغییر ریخته میشه مگر اینکه شما از آرایه استفاده کردید مقدار تک تک عداد وارده از کیپد جدا جدا درون آرایه ریختید ولی تا اونجای یادم برنامه کیپد رو براتون نوشتم مقدار داخل متغییر می ریزه مثلا شما 999 که وارد می کنید معادل باینری میشه 1111 1110 0111 شما هشت بیت پایین یاLSB جدا می کنید میشه این 11101111 بعد بایت بالا جدا میکنید که MSB میشه
    00001110
    ببینین من تک تکً اعداد رو با کیپد زدم. داخل ارایه ریختم. بعد از زدن کلید تایید دستوری نوشتم که اعداد اون ارایه رو یک عدد واحد تیدیل کردم. مثلا ٣و٦و٧ رو تبدیل به ٣٦٧ کرد و اینو فرستاد به ال سی دی و چون لازمه حتما بعد زدن تایید این عدد فرستاده شه نه خین وارد کردن عدد. لذا نمتونم اعضای ارایه رو بفرستم. باید همین متغیر number که از نوع اینته رو بفرستم بره. لذا باید اون عدد رو نمدونم ١ یا ٩٩٩ بتونم هشت بیتش کنم. درسته؟ یعنی چه دستورس برای number بنویسم که بشه هشت بیت صفرو یک.

    یک دیدگاه بنویسید:


  • MM320
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    دوست غریز شما وقتی عدد وارد مقدارذ باینری درون متتغییر ریخته میشه مگر اینکه شما از آرایه استفاده کردید مقدار تک تک عداد وارده از کیپد جدا جدا درون آرایه ریختید ولی تا اونجای یادم برنامه کیپد رو براتون نوشتم مقدار داخل متغییر می ریزه مثلا شما 999 که وارد می کنید معادل باینری میشه 1111 1110 0111 شما هشت بیت پایین یاLSB جدا می کنید میشه این 11101111 بعد بایت بالا جدا میکنید که MSB میشه
    00001110

    یک دیدگاه بنویسید:


  • aashkanpasha
    replied
    پاسخ : پروتکل ارتباطی spi بین دو میکرو برای انتقال محتوایی یک متغیر

    نوشته اصلی توسط MM320 نمایش پست ها
    نیازی به تبدیل باینری نیست شما کافیه مقدار متغییر رو هشت بیت هشت بیت با دستور AND و شیفت جدار و درون متغییر بریزید و مقدار هشت بیتها رو به واحد SPI بدید
    اخه معلوم نمیکنه عدد چند کیپد میزنه.
    تک رقمی میزنن دو رقمی میزنن سه رقمی میزنن. معلوم نمکنه.
    من میگیم تابعی بنویسم که کلا عدد رو به باینری تبدیل کنه. بعد اونو بفرسته. ٩٩٩ باینریش چنده؟

    یک دیدگاه بنویسید:

لطفا صبر کنید...
X