اطلاعیه

Collapse
No announcement yet.

مشکل در ADC و مد Free-running

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

    مشکل در ADC و مد Free-running

    سلام.
    من توی مد free-running مشکل دارم.
    نمیدونم چرا تبدیل انجام نمیشه؟!
    کد:
    #include <mega32.h>
    #include <lcd.h>
    #include <stdio.h>
    
    #asm
      .equ __lcd_port=0x15;
    #endasm
    
    void main()
    {
    lcd_init(16);
      
    ADMUX|=(1<<REFS0);
    ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0)|(1<<ADATE);
    #asm("sei")
    while(1);
    }
    
    interrupt [17] void ADC_Comp_isr()
    {
      float Result=(float)ADCW*5/1024;
      char LCD[16];
      sprintf(LCD,"Voltage: %3.2f",Result);
      lcd_clear();
      lcd_puts(LCD);
    }
    http://s5.picofile.com/file/8173384676/ADC.rar.html

    #2
    پاسخ : مشکل در ADC و مد Free-running

    سلام
    بعداز هر بار خواندن adc داخل زیر برنامه،دوباره باید دستور ADC Start Conversion رو بدید تا دوباره Adc شروع به تبدیل کنه
    کد:
    interrupt [17] void ADC_Comp_isr()
    {
      float Result=(float)ADCW*5/1024;
      char LCD[16];
      sprintf(LCD,"Voltage: %3.2f",Result);
      lcd_clear();
      lcd_puts(LCD);
    
      ADCSRA|=(1<<ADSC);///////
    }
    خط اخر رو میگم

    دیدگاه


      #3
      پاسخ : مشکل در ADC و مد Free-running

      نوشته اصلی توسط mostafa moradmoghadam
      سلام
      بعداز هر بار خواندن adc داخل زیر برنامه،دوباره باید دستور ADC Start Conversion رو بدید تا دوباره Adc شروع به تبدیل کنه
      کد:
      interrupt [17] void ADC_Comp_isr()
      {
        float Result=(float)ADCW*5/1024;
        char LCD[16];
        sprintf(LCD,"Voltage: %3.2f",Result);
        lcd_clear();
        lcd_puts(LCD);
      
        ADCSRA|=(1<<ADSC);///////
      }
      خط اخر رو میگم
      بنظرت این دیگه اسمش free mode?
      .The best question deserves a better answer
      =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
      «پناه»می برم «به خدا»
      از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
      محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

      دیدگاه


        #4
        پاسخ : مشکل در ADC و مد Free-running

        کد:
        بعداز هر بار خواندن adc داخل زیر برنامه،دوباره باید دستور ADC Start Conversion رو بدید تا دوباره Adc شروع به تبدیل کنه
        خوب اونجوری که دیگه free نیست میخوام خودش بعد از پایان تبدیل دوباره شروع کنه نمیدونم چرا نمیشه؟! :-/

        دیدگاه


          #5
          پاسخ : مشکل در ADC و مد Free-running

          ممنون میشم دوستان کمک کنند.

          دیدگاه


            #6
            پاسخ : مشکل در ADC و مد Free-running

            این کد رو قرار بدید
            کد:
            void main()
            {
            float Result;
            char LCD[16];
            
            lcd_init(16);
              
            ADMUX|=(1<<REFS0);
            ADCSRA=0xed;
            
            #asm("sei")
            
            while(1)
              {
              Result=(float)ADCW*5/1024; 
              sprintf(LCD,"Voltage: %3.2f",Result);
              lcd_clear();
              lcd_puts(LCD);
              }
            }
            
            //------------------------
            
            interrupt [17] void ADC_Comp_isr()
            {
            }
            برنامه ای داخل اینتراپت قرار دادید حجم زیادی داشت
            (sprintf(LCD,"Voltage: %3.2f",Result)) این خط توی اسمبلی نگاه کنید ببینید چه قدره
            از اون جای که در مد free اغاز تبدیل بعدی با لبه اینترابت تبدیل قبلی هستش(بیت ADIF) وقتی حجم کد داخل اینتراپت زیاد باشه به مشکل بر می خوره.چون داخل زیر برنامه اینتراپت flag اینتراپت کلی غیر فعال میشه و تا اتمام زیر برنامه اینتراپت ، اجازه اینتراپت جدید رو نمیده؛ پس اجازه شروع تبدیل جدید رو نمیده

            دیدگاه


              #7
              پاسخ : مشکل در ADC و مد Free-running

              آقا دستت دردنکنه برنامه ی توی وقفه رو گزاشتم توی حلقه ی while درست شد.
              فقط دقیقا نفهمیدم چرا برنامه قبلی درست جواب نمیداد.
              خوب مگه ما توی وقفه باشیم اگر وقفه ی دیگری درخواست شود پس از اتمام وقفه جاری اون وقفه اجرا نمیشه؟

              دیدگاه


                #8
                پاسخ : مشکل در ADC و مد Free-running

                نوشته اصلی توسط Alireza-Filter
                فقط دقیقا نفهمیدم چرا برنامه قبلی درست جواب نمیداد.
                توضیح دادم که چرا جواب نمیده :surprised:[quote author=Alireza-Filter
                link=topic=106169.msg686939#msg686939 date=1425045023]
                خوب مگه ما توی وقفه باشیم اگر وقفه ی دیگری درخواست شود پس از اتمام وقفه جاری اون وقفه اجرا نمیشه؟
                [/quote]
                نه وقتی زیر برنامه وقفه رو میکرو اجرا میکنه وقفه سراسری غیر فعال میشه وا مدن وقفه جدید رو نمی فهمه

                دیدگاه


                  #9
                  پاسخ : مشکل در ADC و مد Free-running

                  کد:
                  نه وقتی زیر برنامه وقفه رو میکرو اجرا میکنه وقفه سراسری غیر فعال میشه وا مدن وقفه جدید رو نمی فهمه
                  آخه توی ی کتاب اینو خوندم که زمانی که برنامه توی یه وقفه و وقفه دیگه ای درخواست مبشه (مثلا وقفه تایمر) علارغم این که پرچم اون وقفه یک میشه ولی چون وقفه سراسری غیرفعال هست صبر میکنه تا وقفه جاری تموم بشه بعد وقفه سراسری یا همون بیت I فعال میشه و اون وقفه که منتظر بود اجرا میشه.
                  یعنی این اشتباهه؟

                  دیدگاه


                    #10
                    پاسخ : مشکل در ADC و مد Free-running

                    دوست عزیز
                    1-این تاپیک رو تا اخر بخونید
                    http://www.eca.ir/forum2/index.php?t...7793#msg647793
                    2-مطمعا هستید کتاب درباره avr بود گمان نکنم avr این قدرت رو داشته باشه
                    برای تست شما دو تا اینتراپت خارجی رو فعال کنید داخل زیر برنامه وقفه اول delay در حد چند ثانیه بگذارید سپس ورودی وقفه دوم رو تحریک کنید منتظر بمونید تا از وقفه اول خارج بشه ببینید وقفه دوم اجرا میشه یا نه

                    دیدگاه


                      #11
                      پاسخ : مشکل در ADC و مد Free-running

                      اره بابا واسه AVR بود.
                      الان این برنامه رو نوشتم و جواب داد یعنی زمانی که توی وقفه هست و وقفه دیگری فعال میشه زمانی که وقفه جاری تموم شد وقفه دوم که حین اجرا شدن وقفه اول درخواست شده بود اجرا میشه!

                      کد:
                      #include <mega32.h>
                      #include <delay.h>
                      
                      void main()
                      {
                      DDRB.0=1;    DDRA.0=1;
                      PORTD.2=1;   PORTD.3=1;
                      MCUCR|=(1<<ISC11)|(1<<ISC01);
                      GICR|=(1<<INT0)|(1<<INT1);
                      GIFR|=(1<<INTF0)|(1<<INTF1);
                      #asm("sei")
                      while(1);
                      }
                      
                      interrupt [2] void isr()
                      {
                        PORTB.0=1;
                        delay_ms(2000);
                        PORTB.0=0;
                      }
                      
                      interrupt [3] void isr2()
                      {
                        PORTA.0=1;
                        delay_ms(500);
                        PORTA.0=0;
                      }
                      http://s5.picofile.com/file/8174064226/test.rar.html

                      دیدگاه

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