NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3535 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 17 از 17

موضوع: Spi نرم افزاری در کدویژن

  1. #1
    عضو جدید
    تاریخ عضویت
    Oct 2007
    نوشته ها
    13
    تشکر
    7
    تشکر شده 4 بار در 3 پست

    پیش فرض Spi نرم افزاری در کدویژن

    ا سلام
    من spi را به صورت سخت افزاری در کد ویژن راه اندازی کردم و 2 تا میکرو را به هم متصل کردم . اما حالا می خوام spi را نرم افزاری کانفیگ کنم . کسی می تونه منو راهنمایی کنه؟

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدیر انجمن Division آواتار ها
    تاریخ عضویت
    Jan 2010
    نام
    افشین علیزاده
    نوشته ها
    628
    تشکر
    206
    تشکر شده 1,013 بار در 407 پست

    پیش فرض

    سلام

    براي استفاده از اينترفيس spi تو كدويژن يه تابع كتابخونه اي پيش بيني شده كه اسمش spi.h هستش .

    کد:
    #include <spi.h>
    تنها تابع كاربردي تو اين كتابخونه تابع زير هستش :

    کد:
    unsigned char spi (unsigned char data)
    فرمت كلي استفاده از اين تابع هم تو دستور بالا براتون آوردم و همون طور كه مطلع هستيد اينترفيس spi يه پروتكل full duplex هستش و ميتونه ارتباط دو طرفه همزمان برقرار كنه كه اين مسئله و نحوه استفاده ازش تو قرمت تابع ذكر شده كاملاً مشهوده ...

    مقدار بازگشتي تابع بالا = ديتاي دريافتي
    مقدار وردي = ديتاي ارسالي


    فقط ميمونه كانفيگ رجيستري هاي كنترلي واحد spi كه اينم بستگي به نوع و ويژگي هاي پروژه تون داره .
    سادگی نهایت کمال است
    یه مدتی میشه که نیستم... ولی به زودی بر می گردم...

  4. کاربران : 3 تشکر کرده اند از شما Division برای ارسال این پست سودمند:


  5. #3
    عضو جدید
    تاریخ عضویت
    Oct 2007
    نوشته ها
    13
    تشکر
    7
    تشکر شده 4 بار در 3 پست

    پیش فرض

    سلام
    ممنون اما همونطور که گفتم من به صورت سخت افزاری SPI را راه اندازی کردم. در بسکام شما می تونید از هر پورتی که بخواهید از طریق SPI متصل بشین و کافیه یه سری تنظیمات نرم افزاری انجام بدین . در Codevision این قابلیت وجود داره؟ مثلا من 3 تا Device دارم که از SPI به میکرو وصل می شن . چطوری می تونم از طریق 9 پین متفاوت این Device ها را از طریق نرم افزاری متصل کنم؟در تابع SPI() من هیچ قابلیتی که بشه از پین خاصی به جر پین های سخت افزاری مخصوص SPI را برقرار کرد ندیدم. آیا راهی وجود داره یا اینکه مجبورم روی باس سخت افزاری SPI همه را متصل کنم و با بالا و پایین بردن SS اسلیوها را انتخاب کنم؟

  6. #4
    عضو جدید
    تاریخ عضویت
    Oct 2007
    نوشته ها
    13
    تشکر
    7
    تشکر شده 4 بار در 3 پست

    پیش فرض

    نقل قول نوشته اصلی توسط ali2914 نمایش پست ها
    سلام
    ممنون اما همونطور که گفتم من به صورت سخت افزاری spi را راه اندازی کردم. در بسکام شما می تونید از هر پورتی که بخواهید از طریق spi متصل بشین و کافیه یه سری تنظیمات نرم افزاری انجام بدین . در codevision این قابلیت وجود داره؟ مثلا من 3 تا device دارم که از spi به میکرو وصل می شن . چطوری می تونم از طریق 9 پین متفاوت این device ها را از طریق نرم افزاری متصل کنم؟در تابع spi() من هیچ قابلیتی که بشه از پین خاصی به جر پین های سخت افزاری مخصوص spi را برقرار کرد ندیدم. آیا راهی وجود داره یا اینکه مجبورم روی باس سخت افزاری spi همه را متصل کنم و با بالا و پایین بردن ss اسلیوها را انتخاب کنم؟
    بررسی کردم ظاهرا کدویژن چنین قابلیتی نداره!

  7. #5
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    با سلام

    من میخوام توی کدویژن از یه آی سی با پروتکل spi دیتا بخونم

    اگه ممکنه یه نمونه کد بزارید تا به صورت عملی ببینم چطور میشه دیتا گرفت

    ممنون

  8. #6
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    من یه کد پیدا کردم که توی کدویژن کار میکنه فقط یه خطا داره که ممنون میشم اگه دوستان یه نگاه بندازن و مشکلو برطرف کنن

    کد:
    #include <mega16.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <delay.h>
    #include <string.h>
    #include <math.h>  
    // Alphanumeric LCD Module functions
    #asm
       .equ __lcd_port=0x15 ;PORTC
    #endasm
    #include <lcd.h>
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // SPI functions
    #include <spi.h>
    
    // Declare your global variables here  
       int Temp ;
    char LCD_txt[16];//Buffer for LCD to display text
    char Display_LCD[16];//Buffer to display on the LCD
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTA=0x00;
    DDRA=0x00;
    
    // Port B initialization
    // Func7=Out Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
    // State7=0 State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T 
    PORTB=0x00;
    DDRB=0xB0;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud rate: 9600
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x19;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 1000.000 kHz
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First
    SPCR=0x50;
    SPSR=0x00;
    
    // LCD module initialization
    lcd_init(16);
    
    while (1)
          {
          
            ftoa(Temp,2,Display_LCD); 
            sprintf(LCD_txt,"Power = %s",Display_LCD);
            lcd_gotoxy(0,0);
            lcd_puts(LCD_txt);
            delay_ms(1000); 
            lcd_clear();
    
          };
    }
     
     void USART_Init( unsigned int baud )
    {
    
    UBRRH = (unsigned char)(baud>>8);  // set baud rate
    UBRRL = (unsigned char)baud;  // enable receive
    UCSRC = (1<<URSEL)|(3<<UCSZ0);   // set frame format
    }
    
    void USART_Transmit( unsigned char data )
    {
    
    while ( !( UCSRA & (1<<5)) );   // Wait for empty transmit buffer 
    UDR = DATA;   // Put data into buffer, sends the data
    }
       
    void SPI_MasterInit(void)
    {
    
    DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK); //Set MOSI and SCK output, all others input
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //Enable SPI, Master, set clock rate fck/16
    }
    void SPI_MasterTransmit(char cData)
    {
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)))
    ;
    }
    
    void SPI_SlaveInit(void)
    {
    /* Set MISO output, all others input */
    DDR_SPI = (1<<DD_MISO);
    /* Enable SPI */
    SPCR = (1<<SPE);
    }
    char SPI_SlaveReceive(void)
    {
    /* Wait for reception complete */
    while(!(SPSR & (1<<SPIF)))
    ;
    /* Return data register */
    return SPDR;
    }

  9. #7
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    دوستان اگه ممکنه یه راهنمایی بفرمایید

    فقط یه کپی توی کدویژن بکنید ببینید مشکل از کجاست

    با تشکر

  10. #8
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    سلام
    من کاراکتر R توسط SPI در کدویژن میفرستم و توی پروتئوس به درستی دریافت میکنم حالا میخوام حرف بعدی رو بفرستم باید چطوری استفاده کنم

    کد:
    data_send='R';
    data_get=spi(data_send);
    مثلا میخوام کد R0D4 رو بفرستم

  11. #9
    کاربر فعال hamidam آواتار ها
    تاریخ عضویت
    Apr 2012
    نام
    حمید مومنی
    نوشته ها
    130
    تشکر
    534
    تشکر شده 157 بار در 60 پست

    پیش فرض

    نقل قول نوشته اصلی توسط saeidhp نمایش پست ها
    سلام
    من کاراکتر R توسط SPI در کدویژن میفرستم و توی پروتئوس به درستی دریافت میکنم حالا میخوام حرف بعدی رو بفرستم باید چطوری استفاده کنم

    کد:
    data_send='R';
    data_get=spi(data_send);
    مثلا میخوام کد R0D4 رو بفرستم
    سلام
    کمی برنامه ات اشکال دارد.

    تک تک کاراکتر ها را با spi بفرست . موقع ذخیره هم در یک آرایه ذخیره کن.

    کد:
    spi('R');
    spi('0');
    ...
    ....
    خط اول کد R را میفرستد
    خط دوم کد 0 را می فرستد

    در میکروی دریافت کننده

    کد:
    data_get[1]=spi();
    data_get[2]=spi();
    ...
    ....
    خط اول دیتا را از spi دریافت و در [data_get[1 ذخیره میکند.
    خط دوم دیتا را از spi دریافت و در [data_get[2 ذخیره میکند.

  12. کاربران : 2 تشکر کرده اند از شما hamidam برای ارسال این پست سودمند:


  13. #10
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    ممنون از شما به خاطر جواب
    اما بازهم نشد من اینکارو به صورت دستی هم انجام داده بودم (به جای آرایه) اما بازهم فقط مقدار آخرین رشته ارسالی رو به صورت درست محاسبه میکنه و بقیه رو اشتباه میزنه

    فایل پروتئوس و کدویژن رو میزارم به همراه عکس مربوطه لطفا یه نگاه بندازید
    فايل هاي پيوست شده فايل هاي پيوست شده

  14. کاربران : 2 تشکر کرده اند از شما saeidhp برای ارسال این پست سودمند:


  15. #11
    کاربر فعال naatamam آواتار ها
    تاریخ عضویت
    Apr 2009
    نام
    حسن معماری
    نوشته ها
    283
    تشکر
    287
    تشکر شده 877 بار در 286 پست

    پیش فرض

    من این برنامت را دیدم
    در برنامه برای spi باید یک بار برای master برنامه بنویسی و یک بار هم برای salve
    من به شبیه سازی پروتئوس کاری ندارم ولی شما یک دیتا را با spi فرستادی درست ولی باز دیتا را دریافت کردی در همان برنامه در حالی که spi را بظاهر mastet تعریف کردی.
    برنامه تان درست است اما در صورتی spi دیتا دریافت میکند که از میکروی دیگری دیتا رسیده باشد.

    در ضمن به شکل زیر دقت کن چند جا تنظیمات اشکال دارد.
    تصاوير کوچک فايل پيوست تصاوير کوچک فايل پيوست برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Prog spi test.jpg
مشاهده: 86
حجم: 148.7 کیلو بایت  

  16. کاربران : 2 تشکر کرده اند از شما naatamam برای ارسال این پست سودمند:


  17. #12
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    من میخوام از یه آی سی دیتا بگیرم

    اون رشته ای که نوشته R0d4 آدرس یه رجیستر از اون آی سی هست

    الان مشکل من اینه که نمیتونم این عبارت رو بفرستم

    در مورد عکسی که گذاشتید من یک میکرو دارم و اونهم مستر تعریف شده

    اگه ممکنه در مورد ارسال این رشته راهنمایی بفرمایید

    اینکه گفتید باید هم برای Master بنویسم هم برای Slave الان طرز صحیح ارسال چطوری میشه ؟ این طور که نوشتم اشتباهه؟

  18. #13
    کاربر فعال naatamam آواتار ها
    تاریخ عضویت
    Apr 2009
    نام
    حسن معماری
    نوشته ها
    283
    تشکر
    287
    تشکر شده 877 بار در 286 پست

    پیش فرض

    نقل قول نوشته اصلی توسط saeidhp نمایش پست ها
    من میخوام از یه آی سی دیتا بگیرم

    اون رشته ای که نوشته R0d4 آدرس یه رجیستر از اون آی سی هست

    الان مشکل من اینه که نمیتونم این عبارت رو بفرستم

    در مورد عکسی که گذاشتید من یک میکرو دارم و اونهم مستر تعریف شده

    اگه ممکنه در مورد ارسال این رشته راهنمایی بفرمایید

    اینکه گفتید باید هم برای Master بنویسم هم برای Slave الان طرز صحیح ارسال چطوری میشه ؟ این طور که نوشتم اشتباهه؟
    سلام

    دوست گرامی این آدرس R0d4 درست نیست. ما کد هگزی که اولش R باشد در زبان سی نداریم. شاید منظور 0x0d4 بوده.

    شما یک کتاب avr بگیر و بخش spi انرا خوب بخون , همه چی دستگیرت میشه.
    در دیتا شیت آی سی مورد نظر شما هم چگونگی ارتباط را حتما" توضیح داده....

  19. کاربران : 2 تشکر کرده اند از شما naatamam برای ارسال این پست سودمند:


  20. #14
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    سلام
    من این مثال دیتاشیت رو براتون پیوست کردم

    من هم شک داشتم که باید Hex بفرستم یا همین کد رو

    اما وقتی R رو به صورت تنهایی مینویسم توی Spi Debuger که به صورت باینری نشون میده معادل 52Hex میشه که برابر با R هست
    تصاوير کوچک فايل پيوست تصاوير کوچک فايل پيوست برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: spi.jpg
مشاهده: 33
حجم: 76.1 کیلو بایت  
    ویرایش توسط saeidhp : 14-05-2012 در ساعت 10:27

  21. #15
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    دوستانی که میتونن لطفا کمک کنن کارم توی این قسمت گیر کرده

  22. #16
    کاربر فعال saeidhp آواتار ها
    تاریخ عضویت
    Apr 2011
    نام
    سعید
    نوشته ها
    155
    تشکر
    665
    تشکر شده 76 بار در 44 پست

    پیش فرض

    یعنی کسی از اساتید توی کدویژن با spi کار نکرده من خیلی سرچ کردم ولی چیزی که بدردم بخوره ندیدم

    ممنون میشم یکی از دوستان راهنمایی کنه

  23. #17
    تازه وارد
    تاریخ عضویت
    Sep 2013
    نوشته ها
    1
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام.
    چه طوری میتونیم یه متن رو بفرستیم؟ با تابع spiکه فقط میشه کاراکتر فرست..

موضوعات مشابه

  1. چاپ یک آرایه 4*4 در کدویژن
    توسط abbasalifix در انجمن برنامه نویسی کامپیوتر/کنترل با کامپیوتر
    پاسخ: 1
    آخرين نوشته: 08-06-2014, 02:06
  2. کلاس آنلاین میکروکنترلر آرم اتمل(با تخفیف ویژه)
    توسط kavir در انجمن کلاس های آنلاین شرکت
    پاسخ: 8
    آخرين نوشته: 24-07-2013, 01:57
  3. برنامه نقاشی ویندوز 7 را به ویندوزهای ویستا و ایکس پی اضافه کنید
    توسط arsalan681 در انجمن ترفندهای کامپیوتری/معرفی نرم افزار های مفید
    پاسخ: 1
    آخرين نوشته: 20-01-2010, 15:43
  4. نواز وظیفه ویندوزهای ایکس پی و ویستا را به نوار وظیفه ویندوز 7 تبدیل کنید
    توسط arsalan681 در انجمن ترفندهای کامپیوتری/معرفی نرم افزار های مفید
    پاسخ: 0
    آخرين نوشته: 19-01-2010, 13:39
  5. Xp ویندوزهای ویندوز 2003 سرور را دقیقا به ویندوز 7 تبدیل نمائید
    توسط arsalan681 در انجمن ترفندهای کامپیوتری/معرفی نرم افزار های مفید
    پاسخ: 0
    آخرين نوشته: 19-01-2010, 12:59

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •