اطلاعیه

Collapse
No announcement yet.

اشکال در نمایش متغیر float در ارتباط spi

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

    اشکال در نمایش متغیر float در ارتباط spi

    سلام
    من دو میکرو atmega32 را از طریق پروتکل SPI با موفقیت به هم مرتبط کرده ام ولی مشکل من در تبادل متغیرها از نوع float می باشد.به عنوان مثال میکرو slave عدد 12.52 را به سمت میکرو master ارسال می کند ولی مقدار نمایش داده شده توسط میکرو master روی lcd عدد 12 است!مقدار اعشار آن حذف میشود.لطفا از دوستان عزیز میخواهم که با توجه به سورس برنامه زیر مرا راهنمایی کنند:
    Slave MCU
    کد:
    #include <mega32.h>
    #include <spi.h>
    #include <stdlib.h>
    float data_send,data_get;
     
    void main(void)
    {
    PORTB=0x00;
    DDRB=0x40;
    ACSR=0x80;
    SFIOR=0x00;
    SPCR=0B01100100;
    SPSR=0x00;
    
    while (1)
       { 
       data_send=12.52;
    data_get=spi(data_send);
       };
    }
    Master MCU
    کد:
    #include <mega32.h>
    #asm
      .equ __lcd_port=0x15 ;PORTc
    #endasm
    #include <lcd.h>
    #include <spi.h>
    #include <stdlib.h>
    unsigned char buffer[10];
    float data_send,data_get;
    void main(void)
    {
    PORTB=0x00;
    DDRB=0xB0 | 0b00000001;
    SPCR=0B01110111;
    SPSR=0x00;
    lcd_init(16);
    data_get=spi((float)data_send);
    ftoa(data_get,2,buffer);
    lcd_puts(buffer);
    while (1)
       {
       };
    }

    #2
    پاسخ : اشکال در نمایش متغیر float در ارتباط spi

    با سلام
    عدد اعشاری 4 بایت نیاز دارد.
    با union یا رشته ، عدد اعشاری را به 4 بایت مستقل جدا کنید.
    4 بایت را به صورت مرتب و متوالی ارسال کنید و در گیرنده دریافت و ترکیب کنید.
    با سپاس
    گشتی در لاله زار
    http://www.eca.ir/forum2/index.php?topic=76138.0

    http://www.eca.ir/forum2/index.php?topic=76141

    دیدگاه


      #3
      پاسخ : اشکال در نمایش متغیر float در ارتباط spi

      نوشته اصلی توسط Solsal
      با سلام
      عدد اعشاری 4 بایت نیاز دارد.
      با union یا رشته ، عدد اعشاری را به 4 بایت مستقل جدا کنید.
      4 بایت را به صورت مرتب و متوالی ارسال کنید و در گیرنده دریافت و ترکیب کنید.
      با سپاس

      سلام
      با تشکر از راهنماییتون،امکانش هست تغییر گفته شده را در برنامه Slave و Master اعمال کنید چون من به نتیجه نرسیدم

      دیدگاه


        #4
        پاسخ : اشکال در نمایش متغیر float در ارتباط spi

        با سلام
        شبیه این کد:

        SLAVE

        کد PHP:
        //slave spi testx

        #include <mega32.h>
        #include <spi.h>
        #include <stdlib.h>

        #define    UCHAR        unsigned char    // unsigned char 8bit
        #define    U_INT        unsigned short    // unsigned int 16 bit
        #define    L_INT        long int    // long int 32 bit
        #define    UL_INT        unsigned long int // 32 bit


        union    float_long_int_char    {
                    
        float    f ;
                    
        L_INT    l2i ;
                    
        U_INT    i[2] ;
                    
        UCHAR    ch[4] ;
                    } ;

        union float_long_int_char send32 get32 ;

        float data_send,data_get;


        void some_delayUCHAR dly )
            {
            while ( 
        dly )
                {
                
        dly-- ;
                }
            }
         
        void main(void)
        {
        PORTB=0x00;
        DDRB=0x40;
        ACSR=0x80;
        SFIOR=0x00;
        SPCR=0B01100100;
        SPSR=0x00;

        while (
        1)
           { 
           
        // data_send=12.52;
             
        send32 12.52 ;
             
        //data_get=spi(data_send);
             
        get32 ch[0] = spi(send32 ch[0]);
             
             
        //some_delay( 200 ) ;
             
        get32 ch[1] = spi(send32 ch[1]);
             
             
        //some_delay( 200 ) ;     
             
        get32 ch[2] = spi(send32 ch[2]);
             
             
        //some_delay( 200 ) ;
             
        get32 ch[3] = spi(send32 ch[3]);
           };



        و MASTER

        کد PHP:

        //master spi testx

        #include <mega32.h>
        #asm
          
        .equ __lcd_port=0x15 ;PORTc
        #endasm
        #include <lcd.h>
        #include <spi.h>
        #include <stdlib.h>
        unsigned char buffer[10];
        float data_send,data_get;


        #define    UCHAR        unsigned char    // unsigned char 8bit
        #define    U_INT        unsigned short    // unsigned int 16 bit
        #define    L_INT        long int    // long int 32 bit
        #define    UL_INT        unsigned long int // 32 bit


        union    float_long_int_char    {
                    
        float    f ;
                    
        L_INT    l2i ;
                    
        U_INT    i[2] ;
                    
        UCHAR    ch[4] ;
                    } ;

        union float_long_int_char send32 get32 ;

        float data_send,data_get;


        void some_delayUCHAR dly )
            {
            while ( 
        dly )
                {
                
        dly-- ;
                }
            }



        void main(void)
        {
        PORTB=0x00;
        DDRB=0xB0 0b00000001;
        SPCR=0B01110111;
        SPSR=0x00;
        lcd_init(16);

        // data_get=spi((float)data_send);

            
        send32 l2i 0x01020304 ;

             
        get32 ch[0] = spi(send32 ch[0]);
             
             
        some_delay200 ) ;
             
        get32 ch[1] = spi(send32 ch[1]);
             
             
        some_delay200 ) ;     
             
        get32 ch[2] = spi(send32 ch[2]);
             
             
        some_delay200 ) ;
             
        get32 ch[3] = spi(send32 ch[3]);
             
        //ftoa(data_get,2,buffer);
            
        ftoa(get32 ,2,buffer);

        lcd_puts(buffer);
        while (
        1)
           {
           };



        با سپاس

        پ.ن:
        اشکال های مذکور در پست های ذیل برطرف شد.
        گشتی در لاله زار
        http://www.eca.ir/forum2/index.php?topic=76138.0

        http://www.eca.ir/forum2/index.php?topic=76141

        دیدگاه


          #5
          پاسخ : اشکال در نمایش متغیر float در ارتباط spi

          با سلام خدمت شما دوست عزیز
          با تشکر از همکاری صمیمانتون و اینکه به این سرعت جواب میدید.
          من برنامه شما را با کامپایلر codevision AVR V2.03.9 کامپایل کردم ولی در زمان کامپایل برای عبارت my_flich خطای undefined symbol رخ میدهد.این متغیر یا prefix تعریف نشده؟
          با تشکر


          دیدگاه


            #6
            پاسخ : اشکال در نمایش متغیر float در ارتباط spi

            بسیار سپاسگذارم
            در برنامه master مفهوم لاین زیر چیست؟
            send32 . l21 = 0x01020304 ;
            در زمان کامپایل به لاین فوق خطای undefined member داده شد ولی با حذف آن و کامپایل مجدد برنامه به درستی جواب داد
            با تشکر

            دیدگاه


              #7
              پاسخ : اشکال در نمایش متغیر float در ارتباط spi

              نوشته اصلی توسط rezamicro
              بسیار سپاسگذارم
              در برنامه master مفهوم لاین زیر چیست؟
              send32 . l21 = 0x01020304 ;
              در زمان کامپایل به لاین فوق خطای undefined member داده شد ولی با حذف آن و کامپایل مجدد برنامه به درستی جواب داد
              با تشکر
              با سلام

              - اشتباه تایپی بود.
              - یک داده بی کاربرد است./ لیکن عدد معینی را در متغیر ذخیره می کند. که می تواند در اسلیو برای امور سکانس(شمارش و ترتیب) استفاده شود.

              // send32 . l21 = 0x01020304 ;

              send32 . l2i = 0x01020304 ;

              با سپاس
              گشتی در لاله زار
              http://www.eca.ir/forum2/index.php?topic=76138.0

              http://www.eca.ir/forum2/index.php?topic=76141

              دیدگاه


                #8
                پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                سلام
                بعد از مقدار دهی اعشاری به متغییر send32 . f در برنامه Slave مربوط به میکروی Slave با موفقیت آن را در میکرو Master دریافت کردم ولی الان که قصد دارم متغیر Float را که یک عدد اعشاری است (دمای محیط که توسط سنسور SMT160 اندازه گیری شده) در متغییر send32 . f قرار دهم در میکرو Master مقدار 0.00 نمایش داده میشود.برنامه سنسور به درستی بدون استفاده از ارتباط SPI جواب میدهد ولی زمانی که آن را به برنامه میکروی Slave اضافه میکنم در میکروی Master مقدار 0.00 نمایش داده میشود.
                سورس برنامه بصورت زیر میباشد:
                کد:
                #include <mega32.h>
                #include <stdlib.h>
                #include <stdio.h>
                #include <delay.h>
                
                #define  UCHAR   unsigned char  // unsigned char 8bit
                #define  U_INT   unsigned short  // unsigned int 16 bit
                #define  L_INT   long int  // long int 32 bit
                #define  UL_INT   unsigned long int // 32 bit
                // SPI functions
                #include <spi.h>
                
                // Declare your global variables here
                unsigned int full,half;
                unsigned char edge=1;
                float dutycycle,temprature,temp_buf;
                
                // External Interrupt 1 service routine
                interrupt [EXT_INT1] void ext_int1_isr(void)
                {
                TCCR1B=0x00;
                if(edge>0)
                  {//10
                  full=TCNT1;
                  MCUCR =0x08;      // Set interrupt on falling edge  
                  edge=0;
                  }
                else
                  {
                  half=TCNT1;
                  MCUCR =0x0c;      // Set interrupt on rising edge
                  edge=1;  
                  }
                TCNT1=0;  
                TCCR1B=0x01;
                
                }
                
                 
                union  float_long_int_char  {
                     float  f ;
                     L_INT  l2i ;
                     U_INT  i[2] ;
                     UCHAR  ch[4] ;
                     } ;
                
                union float_long_int_char send32 , get32 ;
                
                
                
                void main(void)
                {
                // Declare your local variables here
                char i;
                // 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=In Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                // State7=T State6=0 State5=T State4=T State3=T State2=T State1=T State0=T 
                PORTB=0x00;
                DDRB=0x40;
                
                // 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=0XF7;
                // 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: 8000.000 kHz
                // 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=0x01;
                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: On
                // INT1 Mode: Rising Edge
                // INT2: Off
                GICR|=0x80;
                MCUCR=0x0C;
                MCUCSR=0x00;
                GIFR=0x80;
                
                // Timer(s)/Counter(s) Interrupt(s) initialization
                TIMSK=0x00;
                
                // Analog Comparator initialization
                // Analog Comparator: Off
                // Analog Comparator Input Capture by Timer/Counter 1: Off
                ACSR=0x80;
                SFIOR=0x00;
                
                // SPI initialization
                // SPI Type: Slave
                // SPI Clock Rate: 2000.000 kHz
                // SPI Clock Phase: Cycle Start
                // SPI Clock Polarity: Low
                // SPI Data Order: LSB First
                SPCR=0x64;
                SPSR=0x00;
                
                // Global enable interrupts
                #asm("sei")
                
                while (1)
                   {
                   temp_buf=0;
                 for(i=0;i<10;i++){            
                	#asm("cli");
                	dutycycle=(float)half/(float)(full+half);
                	#asm("sei");
                	temprature= dutycycle;
                	temprature-=0.31924;
                	temprature/=0.00472;
                	temp_buf+=temprature;
                	}
                	temp_buf/=10;
                
                   send32 . f =.032 ;
                   //data_get=spi(data_send);
                   get32 . ch[0] = spi(send32 . ch[0]);
                  
                   //some_delay( 200 ) ;
                   get32 . ch[1] = spi(send32 . ch[1]);
                  
                   //some_delay( 200 ) ;  
                   get32 . ch[2] = spi(send32 . ch[2]);
                  
                   //some_delay( 200 ) ;
                   get32 . ch[3] = spi(send32 . ch[3]);
                   };
                }
                همانطور که دوستان مشاهده میکنند من از تایمر 1 و وقفه 1 برای اندازه گیری حرارت از روی خروجی پالس SMT160 استفاده کرده ام.
                با تشکر

                دیدگاه


                  #9
                  پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                  کسی نظری در این مورد نداره؟
                  من احساس میکنم یک اشکال در زمان استفاده از وقفه 1 با SPI وجود دارد چون با حذف وقفه برنامه کار میکنه!

                  دیدگاه


                    #10
                    پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                    با سلام

                    در ارتباط SPI چون هماهنگی و فرماندهی و تنظیم و اختیار زمان ارسال و دریافت داده با MASTER است،
                    لذا SLAVE باید مرتبا گوش به زنگ باشد و ظرفیت پردازشی خود را به اندازه کافی خالی و آماده باش نگه دارد ،
                    تا در زمان نامعینی که مستر اقدام به تبادل داه می کند، اسلیو خبر دار شده و به موقع پاسخ مناسب را فراهم کند.
                    در غیر اینصورت داده ها گم شده و نامرتب می شوند.

                    "زمان نامعین" : اسلیو نمی داند که چه موقعی مستر شروع به ارسال و دریافت توام ، اولین و دومین و ...N امین بایت ، می کند.

                    قاعده این است:( پیش آماده سازی اسلیو )

                    1- اسلیو باید بر اساس اینتراپت SPI کار کند.
                    2- اگر اینتراپت های دیگری در کار هستند، باید ، درون آنها ، با sei اجازه ورود اینتراپت SPI داده شود.( هیچ گاه از cli استفاده نکنید ، برای جلوگیری از گم شدن داده)
                    3- در آغاز برنامه و نیز در پایان هر دوره تبادل N بایتی، رجیستر SPDR در اسلیو باید با اولین بایت از N بایت ، مقدار دهی شود. و یک شمارنده صفر شود.
                    ( تا هر موقع مستر شروع کرد، داده صحیح از اسلیو فراهم شود.)
                    4- با اینتراپت پایان انتقال هر بایت در اسلیو ، آن شمارنده اضافه شود و بایت بعدی از N بایت ، در رجیستر SPDR اسلیو قرار داده شود.
                    5- سرعت اسیلاتور میکرو و سرعت بیت ریت SPI باید متناسب باشد تا میکرو فرصت کافی بین بایتها برای پردازش داشته باشد.
                    6- مستر ، بین انتقال هر بایت تا بایت بعدی ، زمانی به اندازه دو برابر نیاز پردازشی اسلیو باید تاخیر ایجاد کند ، تا اسلیو بتواند کار خود را به انجام برساند.

                    با سپاس

                    پ.ن:
                    در کد شما ، از روتین spi() استفاده شده و نیز قبل از آن محاسبات float دما انجام شده که تا حدود 10*50ms = 5ms زمان نیاز دارد.
                    در این فاصله ، مستر ، تبادل خود را بدون توجه به عدم آماده بودن اسلیو انجام داده ، و روتین بی خبر spi() متناسب با نیاز کار شما طراحی نشده است.

                    پ.ن2:
                    مطالب آبی رنگ اضافه و تصحیح شد.
                    گشتی در لاله زار
                    http://www.eca.ir/forum2/index.php?topic=76138.0

                    http://www.eca.ir/forum2/index.php?topic=76141

                    دیدگاه


                      #11
                      پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                      نوشته اصلی توسط Solsal
                      با سلام

                      در ارتباط SPI چون هماهنگی و فرماندهی و تنظیم و اختیار زمان ارسال و دریافت داده با MASTER است،
                      لذا SLAVE باید مرتبا گوش به زنگ باشد و ظرفیت پردازشی خود را به اندازه کافی خالی و آماده باش نگه دارد ،
                      تا در زمان نامعینی که مستر اقدام به تبادل داه می کند، اسلیو خبر دار شده و به موقع پاسخ مناسب را فراهم کند.
                      در غیر اینصورت داده ها گم شده و نامرتب می شوند.

                      "زمان نامعین" : اسلیو نمی داند که چه موقعی مستر شروع به ارسال و دریافت توام ، اولین و دومین و ...N امین بایت ، می کند.

                      قاعده این است:( پیش آماده سازی اسلیو )

                      1- اسلیو باید بر اساس اینتراپت SPI کار کند.
                      2- اگر اینتراپت های دیگری در کار هستند، باید ، درون آنها ، با sei اجازه ورود اینتراپت SPI داده شود.( هیچ گاه از cli استفاده نکنید ، برای جلوگیری از گم شدن داده)
                      3- در آغاز برنامه و نیز در پایان هر دوره تبادل N بایتی، رجیستر SPDR در اسلیو باید با اولین بایت از N بایت ، مقدار دهی شود.
                      ( تا هر موقع مستر شروع کرد، داده صحیح از اسلیو فراهم شود.)
                      4- با اینتراپت پایان انتقال هر بایت در اسلیو ، شمارنده ای اضافه شود و بایت بعدی از N بایت ، در رجیستر SPDR اسلیو قرار داده شود.
                      5- سرعت اسیلاتور میکرو و سرعت بیت ریت SPI باید متناسب باشد تا میکرو فرصت کافی بین بایتها برای پردازش داشته باشد.
                      6- مستر ، بین انتقال هر بایت تا بایت بعدی ، زمانی به اندازه دو برابر نیاز پردازشی اسلیو باید تاخیر ایجاد کند ، تا اسلیو بتواند کار خود را به انجام برساند.

                      با سپاس

                      پ.ن:
                      در کد شما ، از روتین spi() استفاده شده و نیز قبل از آن محاسبات float دما انجام شده که تا حدود 10*50ms = 5ms زمان نیاز دارد.
                      در این فاصله ، مستر ، تبادل خود را بدون توجه به عدم آماده بودن اسلیو انجام داده ، و روتین بی خبر spi() متناسب با نیاز کار شما طراحی نشده است.

                      دوست عزیز بسیار از توضیح کاملتون ممنونم.
                      اگر ممکن است کد مربوط به موارد 2و3و4 را به برنامه من اضافه کنید.

                      دیدگاه


                        #12
                        پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                        سلام
                        دوست عزیز آقا/خانم Solsal اگر برایتان امکان دارد کدهای مربوطه را به برایم ارسال کنید
                        با تشکر

                        دیدگاه


                          #13
                          پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                          با سلام

                          دوست من، کد آماده ای که کاملا منطبق با کار شما باشد ، در دسترس نیست.
                          ( به عبارتی ، من هم باید نیاز کار شما را تحلیل کنم و کد بنویسم. که کمک زیادی برای یادگیری نخواهد بود.)
                          لطفا بر اساس نوشته های پست های بالایی ، خودتان کدها را بنویسید و تست کنید،
                          اگر نیاز به راهنمایی بود ، و کمکی از دست اعضای سایت بر بیاید ، حتما کمک می کنند.

                          با سپاس
                          گشتی در لاله زار
                          http://www.eca.ir/forum2/index.php?topic=76138.0

                          http://www.eca.ir/forum2/index.php?topic=76141

                          دیدگاه


                            #14
                            پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                            یک کد صرفا نمونه و فقط محض راهنمایی؛ رو میشه این جوری نوشت:


                            #include <mega32.h>

                            typedef unsigned char uint8_t;

                            volatile uint8_t spi_rptr;
                            volatile uint8_t spi_wptr;
                            uint8_t spi_buf[256];

                            // SPI interrupt service routine
                            interrupt [SPI_STC] void spi_isr(void)
                            {
                            uint8_t data;
                            uint8_t n;

                            data=SPDR;
                            n = spi_wptr + 1;
                            if( n != spi_rptr )
                            {
                            spi_buf[spi_wptr] = data;
                            spi_wptr = n;
                            }
                            }

                            void spi_read(void *buf, uint8_t len)
                            {
                            uint8_t *p = (uint8_t *)buf;

                            for(; len; len--, p++)
                            {
                            while(spi_rptr == spi_wptr)
                            continue;
                            *p = spi_buf[spi_rptr];
                            #asm("cli"
                            spi_rptr++;
                            #asm("sei"
                            }
                            }

                            void spi_write(void *buf, uint8_t len)
                            {
                            uint8_t *p = (uint8_t *)buf;

                            for(; len; len--, p++)
                            {
                            while(!(SPSR & (1<<SPIF)));
                            SPDR = *p;
                            }
                            }

                            float f;

                            void main(void)
                            {
                            DDRB.6 = 1;
                            PORTB.6= 0;

                            // SPI initialization
                            // SPI Type: Slave
                            // SPI Clock Rate: 2000.000 kHz
                            // SPI Clock Phase: Cycle Half
                            // SPI Clock Polarity: Low
                            // SPI Data Order: MSB First
                            SPCR=0xC0;
                            SPSR=0x00;

                            // Clear the SPI interrupt flag
                            #asm
                            in r30,spsr
                            in r30,spdr
                            #endasm

                            // Global enable interrupts
                            #asm("sei&quot


                            // write data (master mode)
                            spi_write(&f, sizeof(f));

                            // read data (slave mode)
                            spi_read(&f, sizeof(f));
                            }


                            اما این کد به خودی خود دردی رو دوا نمیکنه.
                            برای کارایی خوب در شرایط عمومی خیلی چیزای دیگه ای باید بهش اضافه بشه.
                            مثلا زمانبندی و مانیتور کردن timeout.

                            دیدگاه


                              #15
                              پاسخ : اشکال در نمایش متغیر float در ارتباط spi

                              با سلام خدمت همه دوستان عزیز
                              اگه مشکل مربوط به نامشخص بودن زمان درخواست اطلاعات از سمت Master است برای حل مشکل میشه جای Master و Slave را عوض کرد؟
                              یعنی Master فرستنده اطلاعات Slave گیرنده باشد؟
                              اگر جواب مثبت است من برنامه قبل رو با همون متغییر ثابت عددی به صورت زیر تغییر دادم ولی روی LCD پارامتری نمایش داده نمیشود!

                              SLAVE MCU
                              کد:
                              #include <mega32.h>
                              #asm
                                .equ __lcd_port=0x15 ;PORTc
                              #endasm
                              #include <lcd.h>
                              #include <spi.h>
                              #include <stdlib.h>
                              unsigned char buffer[10];
                              
                              
                              #define  UCHAR   unsigned char  // unsigned char 8bit
                              #define  U_INT   unsigned short  // unsigned int 16 bit
                              #define  L_INT   long int  // long int 32 bit
                              #define  UL_INT   unsigned long int // 32 bit
                              
                              
                              union  float_long_int_char  {
                                   float  f ;
                                   L_INT  l2i ;
                                   U_INT  i[2] ;
                                   UCHAR  ch[4] ;
                                   } ;
                              
                              union float_long_int_char send32 , get32 ;
                              
                              
                              
                              void some_delay( UCHAR dly )
                                {
                                while ( dly )
                                 {
                                 dly-- ;
                                 }
                                }
                              
                              
                              
                              void main(void)
                              {
                              PORTB=0x00;
                              DDRB=0xB0 | 0b00000001;
                              SPCR=0x64;
                              SPSR=0x00;
                              lcd_init(16);
                              
                              // data_get=spi((float)data_send);
                              
                              
                                 get32 . ch[0] = spi(send32 . ch[0]);
                                
                                 some_delay( 200 ) ;
                                 get32 . ch[1] = spi(send32 . ch[1]);
                                
                                 some_delay( 200 ) ;  
                                 get32 . ch[2] = spi(send32 . ch[2]);
                                
                                 some_delay( 200 ) ;
                                 get32 . ch[3] = spi(send32 . ch[3]);
                                
                              //ftoa(data_get,2,buffer);
                                ftoa(get32 . f ,2,buffer);
                              
                              lcd_puts(buffer);
                              while (1)
                                 {
                                 };
                              }


                              MASTER MCU

                              کد:
                              #include <mega32.h>
                              #include <spi.h>
                              #include <stdlib.h>
                              
                              #define  UCHAR   unsigned char  // unsigned char 8bit
                              #define  U_INT   unsigned short  // unsigned int 16 bit
                              #define  L_INT   long int  // long int 32 bit
                              #define  UL_INT   unsigned long int // 32 bit
                              
                              
                              union  float_long_int_char  {
                                   float  f ;
                                   L_INT  l2i ;
                                   U_INT  i[2] ;
                                   UCHAR  ch[4] ;
                                   } ;
                              
                              union float_long_int_char send32 , get32 ;
                              
                              
                              
                              
                              void main(void)
                              {
                              PORTB=0x00;
                              DDRB=0x40;
                              ACSR=0x80;
                              SFIOR=0x00;
                              SPCR=0x77;
                              SPSR=0x00;
                              
                              while (1)
                                 {
                                 // data_send=12.362;
                                 send32 . f = 12.362 ;
                                 //data_get=spi(data_send);
                                 get32 . ch[0] = spi(send32 . ch[0]);
                                
                                 //some_delay( 200 ) ;
                                 get32 . ch[1] = spi(send32 . ch[1]);
                                
                                 //some_delay( 200 ) ;  
                                 get32 . ch[2] = spi(send32 . ch[2]);
                                
                                 //some_delay( 200 ) ;
                                 get32 . ch[3] = spi(send32 . ch[3]);
                                 };
                              }
                              با تشکر

                              دیدگاه

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