اطلاعیه

Collapse
No announcement yet.

اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

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

    اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

    با سلام به دوستان عزیز و استادان محترم عضو سایت مخصوصأ آقای سپاس یار عزیز
    من یک پروژه دارم که در اون بین 8 عدد میکرو ATmega16 که در مود SLAVE هستند با یک میکرو ATmega32 که MASTER اونهاست باید اطلاعاتی را ردو بدل کنن
    قسمت بعد اینه که زمان خاصی این ارسالها ندارن و ترتیب مشخصی هم ندارن
    من تقریبا مدار رو تکمیل کردم و درباره برنامه میکروها هم همه اونها با مود وقفه SPI را درایو می کنن که وقتی MASTER دیتا به SLAVE ها می فرسته اونها یعنی SLAVE ها دریافت می کنن کامل و بدون هیچ
    مشکلی کدها را می گیرند و کار مخصوص خود رو انجام می دن اما مشکل از اونجا شروع می شه که SLAVE ها می خواهن جواب به MASTER بدن. هر کاریشون می کنم جواب نمی ده .
    توی Proteus هم جواب نمی ده. هم MASTER و هم SLAVE در مود وقفه SPI کار می کنن کامپایلر هم CODEVISION است.
    کمک کنید صواب داره.
    با تشکر
    گر مسلماني از اين است كه حافظ دارد واي اگر از پس امروز بود فردايي

    #2
    پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

    1. SPI در پروتئوس های قبل از 7، مدل نشده است.
    2. زمانی که Master یک بایت برای Slave می فرستد، یک بایت نیز دریافت می کند که این می تونه پاسخ Slave باشه (البته باید SS اش صفر باشه و دیتا رو در SPDR بنویسه).

    There is nothing so practical as a good theory. — Kurt Lewin, 1951

    دیدگاه


      #3
      پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

      آقای سپاس یار ممنون از توجهتون
      نگارش Protues که استفاده کردم 7.2 است.
      برنامه را طوری نوشتم که زمانی که Master در حال ارسال است فقط Slave مورد نظرش دریافت کننده است و برعکس یعنی با هم ارسال نمی کنند.
      شما مثالی دارید که Slave دیتا برای Master ارسال کنه و Master در حالت وقفه دیتا رو دریافت کنه ؟ اگه دارید ممنون می شم ببینم.

      با تشکر
      گر مسلماني از اين است كه حافظ دارد واي اگر از پس امروز بود فردايي

      دیدگاه


        #4
        پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

        نوشته اصلی توسط امیر حسین شریفی فر
        آقای سپاس یار ممنون از توجهتون
        نگارش Protues که استفاده کردم 7.2 است.
        برنامه را طوری نوشتم که زمانی که Master در حال ارسال است فقط Slave مورد نظرش دریافت کننده است و برعکس یعنی با هم ارسال نمی کنند.
        شما مثالی دارید که Slave دیتا برای Master ارسال کنه و Master در حالت وقفه دیتا رو دریافت کنه ؟ اگه دارید ممنون می شم ببینم.

        با تشکر
        Slave:

        کد:
        #include <mega32.h>
        
        // SPI interrupt service routine
        interrupt [SPI_STC] void spi_isr(void)
        {
        unsigned char data;
        data=SPDR;
        // Place your code here
        
        }
        
        // Declare your global variables here
        
        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=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=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;
        
        // 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 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")
        
        while (1)
           {
           // Place your code here
        
           };
        }

        Master:

        کد:
        #include <mega32.h>
        # include <delay.h>
        // SPI functions
        #include <spi.h>
        
        // Declare your global variables here
        
        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=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
        // State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T 
        PORTB=0x00;
        DDRB=0xF0;
        
        // 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;
        
        // 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: 2000.000 kHz
        // SPI Clock Phase: Cycle Half
        // SPI Clock Polarity: Low
        // SPI Data Order: MSB First
        SPCR=0x50;
        SPSR=0x00;
        
        while (1)
           {
           // Place your code here
        	spi(0xFF)		// Send dummy value
        	delay_ms(10);
           };
        }
        There is nothing so practical as a good theory. — Kurt Lewin, 1951

        دیدگاه


          #5
          پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

          باز هم ممنون اما این هم برای برنامه MASTER از وقفه استفاده نکرده !؟
          گر مسلماني از اين است كه حافظ دارد واي اگر از پس امروز بود فردايي

          دیدگاه


            #6
            پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

            دوستان !
            کسی در MASTER از مود وقفه یعنی استفاده نکرده ؟
            حالا یک سوال دیگه توی PIC هم درایو کردن SPI هم به همین شکله !؟ ( منظورم مود وقفه اونهاست ؟ یا شاید هم کسی .... )

            با تشکر
            گر مسلماني از اين است كه حافظ دارد واي اگر از پس امروز بود فردايي

            دیدگاه


              #7
              پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

              :wow:
              درست شد !
              Master هم در حالت وقفه :applause:
              سایت شما پر از اطلاعات جالب و تجربهآ‌های ارزشمند هست.
              خیلی ممنون از همه دوستانی که در Post های دیگه هم درباره SPI صحبت کردند تقریبأ همه آنها رو خوندم :agree: oo:
              جمع همش + تجربه شخصی خودم = جواب درست !
              گر مسلماني از اين است كه حافظ دارد واي اگر از پس امروز بود فردايي

              دیدگاه


                #8
                پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

                دوست عزیز میشه فایل هاتو بذاری تا مشکل منم حل بشه؟
                اديسون : من هفتصد بار اشتباه نکرده ام ، من يکبار هم اشتباه نکرده ام من زماني موفق شدم که ،هفتصد راهي را که موفقيت آميز نبود اصلاح کردم.
                Gmail: Jsoltanii@gmail.com

                دیدگاه


                  #9
                  پاسخ : اشکال در SPI در حالت فعال بودن وقفه در میکرو AVR

                  متاسفانه آقای شریفی فر مشکلش که حل شد رفت و دیگه نیومد! کس دیگه می تونه این مشکل را حل کنه؟ وقفه SPI در حالت Master را کسی می تونه پیاده کنه؟ تنظیماتش به چه نحو انجام می شه؟

                  دیدگاه

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