اطلاعیه

Collapse
No announcement yet.

ارتباط spi در میکرو avr

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

    #16
    پاسخ : ارتباط spi در میکرو avr

    پاسخ : ارتباط spi در میکرو avr
    نوشته اصلی توسط محمد یارمحمدی
    سلام
    فکر میکنم من قبلا یه برنامه نمونه توی سایت گذاشتم :agree:
    سرچ کنید،اگر پیدا نکردید بگید تا دوباره بذارمش
    سلام . آقا این برنامه نمونه spi را می تونید بزارین تو تالار ؟ من پیداش نکردم.
    ممنون

    دیدگاه


      #17
      پاسخ : ارتباط spi در میکرو avr

      نوشته اصلی توسط ali2914
      پاسخ : ارتباط spi در میکرو avrسلام . آقا این برنامه نمونه spi را می تونید بزارین تو تالار ؟ من پیداش نکردم.
      ممنون
      سلام
      اینم هم یک مقاله در مورد SPI :
      فایل های پیوست شده

      دیدگاه


        #18
        پاسخ : ارتباط spi در میکرو avr

        نوشته اصلی توسط tryforfriendship
        سلام
        من میخوام از خاصیت ارتباط spi میکرو avr استفاده کنم فقط می دونم که از تابع spi() باید استفاده کنم و هیچ اطلاعات دیگه ای ندارم.چطوراطلاعات راروی پورت بذارم وازروی پورت بردارم؟چطورباتابع spi کارکنم؟
        ممنون
        یه pdf خودم نوشتم از لینک زیر دانلود کنید.کمکتون میکنه.
        https://www.dropbox.com/s/t468f57sxuv2s40/spi.zip
        خوشبختی یعنی اینکه از زمان خوب استفاده کنی....

        دیدگاه


          #19
          پاسخ : ارتباط spi در میکرو avr

          نوشته اصلی توسط uruf59
          تا حالا کسی تونسته با slave به master اطلاعات بفرسته؟
          من که ...
          به لینک زیر برو یه pdf گذاشتم دانلود کن.البته فکر کنم باید با فیلتر شکن بری.
          موفق باشی
          https://www.dropbox.com/s/t468f57sxuv2s40/spi.zip
          خوشبختی یعنی اینکه از زمان خوب استفاده کنی....

          دیدگاه


            #20
            پاسخ : ارتباط spi در میکرو avr

            سلام دوستان
            وقت بخیر.
            من کد یه مستر اسلیو رو زدم که مستر و اسلیو هر دو ال سی دی دارن.
            امستر اطلاعات کانال یک adc اش رو میخونه و رو ال سی دی اش می نویسه و برا اسلیو هم میفرسته که اونم روی ال سی دی اش بنویسه.
            توی پروتیوس همه چی اکیه به جز یه warning که میده و میگه:avr spi) clock frequency changed while in master mode)
            ولی توی عمل اجرا نمیشه.چون عمل نمایش روی نمایشگر رو توی اسلیو توی وقفه انجام دادم، ظاهرا اسلیو به وقفه نمیره چون السی دی روش هیچی نیست.
            ممنون میشم کمکم کنید
            کد مستر:
            کد:
            
            #include <mega16a.h>
            
            
            // Alphanumeric LCD functions
            #include <alcd.h>
            #include <delay.h>
            #include <stdio.h>
            #define SS_LCD PORTB.4
            #define SS_ADC PORTB.3
            #define spi_status SPSR.7
            #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR))
            // Declare your global variables here
            
            
            unsigned char spi(unsigned char,unsigned char chanel);
            unsigned int read_adc(unsigned char );
            
            
            void main(void)
            {
            DDRD.7=1;
            PORTD.7=0;
            //PORT INITIAALIZATION
            DDRC=255;
            DDRB=0;
            PORTB=0;
            DDRB.3=1;
            DDRB.4=1;
            DDRB.5=1;
            DDRB.7=1;
            //
            
            
            //SPI INITIALIZATION
            SPCR.7=0;//SPIE
            SPCR.6=1;//SPE
            SPCR.5=1;//DORD
            SPCR.4=1;//MSTR
            SPCR.3=1;//CPOL
            SPCR.2=0;//CPHA
            SPCR.1=1;//SPR1
            SPCR.0=1;//SPR0
            //SPSR
            SPSR.0=0;//SPI2X
            //
            
            
            
            
            // ADC initialization
            ADMUX=ADC_VREF_TYPE;
            ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
            SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
            
            
            
            
            
            
            lcd_init(16);
            
            
            // Global enable interrupts
            #asm("sei")
            PORTB.3=1;
            PORTB.4=1;
            while (1)
                  {          
                  char str[20];         
                  unsigned int data;
                  
                  data=(unsigned long)read_adc(0)*255/1023;
                  
                  sprintf(str,"adc=%d    ",data );
                  lcd_gotoxy(0,0);
                  lcd_puts(str);  
                  
                  spi(data,'l');  
                  delay_ms(1);
            
            
                  }
            }
            
            
            
            
            unsigned char spi(unsigned char send_data,unsigned char chanel)
            {
                if (chanel=='l')
                {
                SS_LCD=0;
                SS_ADC=1;
                delay_us(100);
                SPDR=send_data;
                while(spi_status==0);
                return SPDR;
                } 
                else if(chanel=='a')
                {
                SS_LCD=1;
                SS_ADC=0;
                delay_us(100);
                SPDR=send_data;
                while(spi_status==0);
                return SPDR;
                }       
                else
                {
                return 0;
                }         
                 
                SS_LCD=1;
                SS_ADC=1;
                delay_us(50);
                
            }
            
            
            
            
            
            
            unsigned int read_adc(unsigned char adc_input)
            {
            ADMUX=adc_input | ADC_VREF_TYPE;
            // Delay needed for the stabilization of the ADC input voltage
            delay_us(10);
            // Start the AD conversion
            ADCSRA|=(1<<ADSC);
            // Wait for the AD conversion to complete
            while ((ADCSRA & (1<<ADIF))==0);
            ADCSRA|=(1<<ADIF);
            return ADCW;
            }
            کد اسلیو:
            کد:
            #include <mega16a.h>
            
            
            // Alphanumeric LCD functions
            #include <alcd.h>
            
            
            // Declare your global variables here
            
            
            
            
            // SPI functions
            #include <stdio.h>
            #include <delay.h>
            
            
            
            
            
            
            interrupt [SPI_STC] void spi_isr(void)
            {
            char str[32]; 
            
            
            
            
            
            
            
            
            sprintf(str,"in Data:%i       ",SPDR);
            lcd_gotoxy(0,0);
            lcd_puts(str);
            
            
            
            
            PORTD.7=1;
            
            
            }
            
            
            
            
            
            
            void main(void)
            {
            
            
            
            
            ////PORT INITIALIZATIONS
            DDRA=255;
            DDRC=255;
            DDRD.7=1;
            ///-SPI
            DDRB.4=0;
            PORTB.4=0;
            
            
            DDRB.5=0;
            PORTB.5=0;
            
            
            DDRB.6=1;
            
            
            DDRB.7=0;
            PORTB.7=0;
            //
            
            
            // SPI initialization
            // SPI Type: Master
            // SPI Clock Rate: 2*2000.000 kHz
            // SPI Clock Phase: Cycle Start
            // SPI Clock Polarity: Low
            // SPI Data Order: MSB First
            SPCR.7=1;//SPIE
            SPCR.6=1;//SPE
            SPCR.5=1;//DORD
            SPCR.4=0;//MSTR
            SPCR.3=1;//CPOL
            SPCR.2=0;//CPHA
            SPCR.1=0;//SPR1
            SPCR.0=0;//SPR0
            //SPSR
            SPSR.0=0;//SPI2X
            
            
            
            
            
            
            
            
            
            
            #asm("sei")
            lcd_init(16);
            PORTD.7=0;
            while (1)
                  {
            
            
            
            
                  }
            }
            اینم عکس شبیه سازی
            ین دو خانه یک برد بورد (به علت وجود پلاستیک عایق بین آنها) یک خازن کوچک وجود دارد که خیلی سریع شارژ میشود.

            به این دلیل در مدارات فرکانس بالا که سرعت تغییرات زیاد است نمیتوان از برد بورد استفاده نمود. چون زمان شارژ خازن کوچک محسوس میشود.
            http://www.botlobby.com/PishAzEftetah/

            دیدگاه


              #21
              پاسخ : ارتباط spi در میکرو avr

              نوشته اصلی توسط ali9 نمایش پست ها
              سلام دوستان
              وقت بخیر.
              من کد یه مستر اسلیو رو زدم که مستر و اسلیو هر دو ال سی دی دارن.
              امستر اطلاعات کانال یک adc اش رو میخونه و رو ال سی دی اش می نویسه و برا اسلیو هم میفرسته که اونم روی ال سی دی اش بنویسه.
              توی پروتیوس همه چی اکیه به جز یه warning که میده و میگه:avr spi) clock frequency changed while in master mode)
              ولی توی عمل اجرا نمیشه.چون عمل نمایش روی نمایشگر رو توی اسلیو توی وقفه انجام دادم، ظاهرا اسلیو به وقفه نمیره چون السی دی روش هیچی نیست.
              ممنون میشم کمکم کنید


              اینم عکس شبیه سازی
              این حل شد
              یکی از علتاش این بود که من اول اجیستر اینیبل SPI رو ست کرده بودم و بعد رجیسترای مقسم فرکانسی رو تنظیم کرده بودم.
              همین باعث میشد فرکانس وسط برنامه عوض بشه
              ین دو خانه یک برد بورد (به علت وجود پلاستیک عایق بین آنها) یک خازن کوچک وجود دارد که خیلی سریع شارژ میشود.

              به این دلیل در مدارات فرکانس بالا که سرعت تغییرات زیاد است نمیتوان از برد بورد استفاده نمود. چون زمان شارژ خازن کوچک محسوس میشود.
              http://www.botlobby.com/PishAzEftetah/

              دیدگاه

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