اطلاعیه

Collapse
No announcement yet.

کار با spi به صورت نرم افزاری (codevison )

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

    کار با spi به صورت نرم افزاری (codevison )

    با سلام
    من میخواستم مقادیر (ADS7816 (adc 12bit رو بخونم این ایسی 8 پایه مقادیر رو به صورت spi می فرسته برنامهای با سی نوشتم که اون رو بخونه خروجی من اصلا پایداری نداره می خواستم ببینم آیا درست نوشتم یا کار دیگه ای باید انجام بدم ممنونم
    کد:
    #include <mega16a.h>
    #include <delay.h>
    #include <stdlib.h>
    #include <stdio.h>
    #define XTAL 11059200
    #define CLK   PORTA.0
    #define CS   PORTA.1
    #define Input  PINA.2               //data reader 
    int Spi_Read(void);
    char s[5];
    void main(void)
    {
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0 
    PORTA=0x00;
    DDRA=0x03;
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 19200
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x23;
    
     
    while (1)
       {
         
       itoa(Spi_Read(),s);  
       puts(s);
       delay_ms(500); 
       }
    }
    int Spi_Read(void)
    {
     int Data=0,i;
     Data=0;
     CS=0;       //pin CS    enable
     for (i=0;i<12;i++)
     {
      CLK=1;     
       delay_us(10);
       Data=Data | Input<<11-i; 
      CLK=0; 
      delay_ms(1);
      
     
     }
    
     return Data;
      CS=1;     //pin CS   disable
      delay_us(100);
    };

    #2
    پاسخ : کار با spi به صورت نرم افزاری (codevison )

    من دیروز میخواستم پاسخ شما را بدهم ولی متاسفانه پس از تایپ پاسخ شما، سرور سایت دیگه پاسخ نداد :NO:
    از همین تریبون اعتراض خودم را نسبت به سرور سایت اعلام میکنم خلیی مواقع قطع میشه

    مشکل شما اینه که دیتاشیت را نخوندی و میخواهی درایوش کنی و انتظار داری کار هم بکنه :NO:
    درسته که دقت 12 بیته اما این دلیل نمیشه که 12تا کلاک بزنی
    کد:
    for (i=0;i<12;i++)
    چیزی که من از دیتا شیت برداشت کردم اینه :
    3تا کلاک میزنی تا خروجی دیتا فعال بشه
    12تا کلاک میزنی و دیتا را میخونی:
    کد:
    int Spi_Read(void)
    {
     int Data=0,i;
     CS=0;       //pin CS    enable
     delay_us(10);
    
    
     for (i=0;i<3;i++)
     {
      CLK=1;     
       delay_us(10);
      
      CLK=0; 
       delay_us(10);
     
     }
    
    delay_us(10);
    
     for (i=0;i<12;i++)
     {
      CLK=1;     
       delay_us(10);
       Data |= Input<<(11-i); 
      CLK=0; 
       delay_us(10);
      
     
     }
    delay_us(10);
    
      CS=1; 
    return Data;
      
    };

    در ضمن شما قواعد برنامه نویسی C را به کل فراموش کردید
    کد:
     
     return Data;
      CS=1;     //pin CS   disable
      delay_us(100);
    چرا اول return کردی و بعد CS را set کردی ؟؟؟؟؟


    موفق باشید
    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

    دیدگاه


      #3
      پاسخ : کار با spi به صورت نرم افزاری (codevison )

      ممنوم فراموش نکردم اشتباه کپی و پیست کردم باز ممنونم من سال هاست برنامه نوسی میکنم البته با سی شارپ :biggrin:

      دیدگاه


        #4
        پاسخ : کار با spi به صورت نرم افزاری (codevison )

        این کار رو انجام دادم ولی باز خروجی 0 هست با اینکه من ورودی رو به 2 ولت و ولتاژ رفرنس رو 3.2 وصل کردم

        کد:
        #include <mega16a.h>
        #include <delay.h>
        #include <stdlib.h>
        #include <stdio.h>
        #define XTAL 11059200
        #define CLK   PORTA.0
        #define CS   PORTA.1
        #define Input  PINA.2
        int Spi_Read(void);
        char s[6];
        void main(void)
        {
        
        // Input/Output Ports initialization
        // Port A initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out 
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0 
        PORTA=0x00;
        DDRA=0x03;
        
        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: Off
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud Rate: 19200
        UCSRA=0x00;
        UCSRB=0x08;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x23;
        
         
        while (1)
           {
             
           itoa(Spi_Read(),s);  
           puts(s);
           delay_ms(500); 
           }
        }
        
        int Spi_Read(void)
        {
         int Data=0,i;
         CS=0;       //pin CS    enable
         delay_us(10);
        
        
         for (i=0;i<3;i++)
         {
          CLK=1;     
           delay_ms(1);
          
          CLK=0; 
           delay_ms(1);
         
         }
        
        delay_us(10);
        
         for (i=0;i<12;i++)
         {
          CLK=1;     
           delay_ms(1);
           Data |= Input<<(11-i); 
          CLK=0; 
           delay_ms(1);
          
         
         }
        delay_us(10);
        
          CS=1; 
        return Data;
          
        };

        دیدگاه


          #5
          پاسخ : کار با spi به صورت نرم افزاری (codevison )

          نوشته اصلی توسط yashar666
          ممنوم فراموش نکردم اشتباه کپی و پیست کردم باز ممنونم من سال هاست برنامه نوسی میکنم البته با سی شارپ :biggrin:
          یک شوخی بیشتر نبود

          من قبلاً هم گفتم با این IC کار نکردم و متاسفانه در اختیار ندارم که تست کنم
          اگه به نتیجه ای رسیدم اطلاع میدم
          امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

          دیدگاه


            #6
            پاسخ : کار با spi به صورت نرم افزاری (codevison )

            ممنون میشم اعلام کنید

            اگر اساتید دیگه هستند کمک کنن

            دیدگاه


              #7
              پاسخ : کار با spi به صورت نرم افزاری (codevison )

              یعنی کسی نیست با این adc یا شبه اون کار کرده باشه اکثر سوال های spi به روش نرم افزاری در این سایت بی جوابن !!!!! چرا ؟ مگه چیزه خیلی خاصیه ؟؟؟؟ خواهش می کنم روش که من نوشتم رو تصحیح کنید

              دیدگاه


                #8
                پاسخ : کار با spi به صورت نرم افزاری (codevison )

                من کد را تست کردم مشکلی نداره
                ممکنه ADC شما مشکل داشته باشه !
                کد:
                
                #include <mega16.h>
                #include <delay.h>
                #include <stdio.h>
                #include <stdlib.h>
                
                #define XTAL 11059200
                #define CLK   PORTA.0
                #define CS   PORTA.1
                #define Input  PINA.2               //data reader 
                
                
                int Spi_Read(void);
                int val;
                char s[15];
                
                void main(void)
                {
                
                // Input/Output Ports initialization
                // Port A initialization
                // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out 
                // State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0 
                PORTA=0x00;
                DDRA=0x03;
                
                // USART initialization
                // Communication Parameters: 8 Data, 1 Stop, No Parity
                // USART Receiver: Off
                // USART Transmitter: On
                // USART Mode: Asynchronous
                // USART Baud Rate: 19200
                UCSRA=0x00;
                UCSRB=0x08;
                UCSRC=0x86;
                UBRRH=0x00;
                UBRRL=0x23;
                
                 
                while (1)
                   {       
                   val = Spi_Read();
                    sprintf(s,"Value:%03d\r\n",val);  
                    puts(s);
                    delay_ms(500); 
                   }
                }
                int Spi_Read(void)
                {
                 int Data=0,i;
                 CS=0;       //pin CS    enable
                 delay_us(10);
                
                
                 for (i=0;i<3;i++)
                 {
                  CLK=1;     
                   delay_us(10);
                  
                  CLK=0; 
                   delay_us(10);
                 
                 }
                
                delay_us(10);
                
                 for (i=0;i<12;i++)
                 {
                  CLK=1;     
                   delay_us(10);
                   Data |= Input<<(11-i); 
                  CLK=0; 
                   delay_us(10);
                  
                 
                 }
                delay_us(10);
                
                  CS=1; 
                return Data;
                  
                };

                موفق باشید
                امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                دیدگاه


                  #9
                  پاسخ : کار با spi به صورت نرم افزاری (codevison )

                  منم هم برنامه رو چک کردم مشکل اینجاست فرض کنید من ولتاژ رفرنس رو 3.2 ولت انتخاب کردم بعد به v in حدود 1.65 ولت میدم خروجی باید حدود 2000 باشه ولی در عمل یا 0 یا 4095 و گاهی حدود 2000 هست معمولا به ازای هر 4 ثانیه !! این در حالی که من هر 500 میلی ثانیه تابع رو صدا میکنم !!! for اول رو که 2 میکنم تعداد بیشتری 2000 میده ولی بازم ثابت نیست

                  دیدگاه


                    #10
                    پاسخ : کار با spi به صورت نرم افزاری (codevison )

                    حل شد ظاهرا باید vref با vcc برابر باشه !! اگه میشه در مورد اون 3 کلاک و 1.5 و 2 کلاک که دو دیتا شیت نوشته توضیح بدید ؟؟

                    فقط اینو بگم اون تابعی که شمت برای فرمت بندی و تبدیل string گذاشتید (sprintf) حجم زیادی از میکرو رو اشغال میکنه بهتره از همون تابع itoa که من استفاده کردم استفاده کنید با sprint f با میکرو مگا 16 9.8 درصد میکرو رو اشغال میکنه (کل برنامه ) با itoa فقط 3.4 درصد

                    دیدگاه

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