اطلاعیه

Collapse
No announcement yet.

تغییر وضعیت دادن ناگهانی خروجی های pic

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

    تغییر وضعیت دادن ناگهانی خروجی های pic

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

    #2
    پاسخ : تغییر وضعیت دادن ناگهانی portb

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

    دیدگاه


      #3
      پاسخ : تغییر وضعیت دادن ناگهانی portb

      قربان شما آقا شاهرخ.خیلی مخلصیم. سرباز شدیم رفت!! شرایط کاری عادی هستش. روی چندتا مدار مختلف هم متوجه این موضوع شدم. اصلا به ذهنم واقعا هیچی قد نمیده!!! نمیدونم رجیستر خاصی هستش که اگه تنظیم نشه خروجیامون نا پایدار بشن!! توی دیتاشیت که خیلی گشتم چیزی پیدا نکردم. هم با اسمبلی و هم با سی این مشکل داشتم
      طب اسلامی

      دیدگاه


        #4
        پاسخ : تغییر وضعیت دادن ناگهانی portb

        حالت پروگرم low voltage رو غیرفعال کردین؟ چون پورتB واسه پروگرم کردنه،شاید به حالتهای پروگرم شدن مربوط باشه.

        دیدگاه


          #5
          پاسخ : تغییر وضعیت دادن ناگهانی portb

          بله آقا شاهین.غیر فعاله.نمیدونم چرا هیچکس نمیدونه این مشکل من چیه
          طب اسلامی

          دیدگاه


            #6
            پاسخ : تغییر وضعیت دادن ناگهانی portb

            نوشته اصلی توسط mahdifaheca
            بله آقا شاهین.غیر فعاله.نمیدونم چرا هیچکس نمیدونه این مشکل من چیه
            منظورتون شاهرخ هست دیگه؟!! :mrgreen:

            PORTB رو مستقیم وصل نکنین.با لچ یا اپتو کوپلر وص کنین ببینین باز هم همین اتفاق میفته؟

            هیچ توجیه منطقی به ذهنم نمیرسه. oo:

            دیدگاه


              #7
              پاسخ : تغییر وضعیت دادن ناگهانی portb

              آقا شاهرخ این حالت lvp نباید فعال باشه؟ کلا غیر فعاله گذینش توی نرم افزار پروگرمر.

              طب اسلامی

              دیدگاه


                #8
                پاسخ : تغییر وضعیت دادن ناگهانی portb

                امکان داره از مقاومتهای pull down ورودیم باشه؟؟ با توجه به اینکه فرکانس کریستالم 20 مگ هستش و مقاومت پول دان 10 کیلو میزارم. امکان داره به نظر شما اونا نویز بگیرن و فرمان بدن به صورت ورودی؟؟؟
                طب اسلامی

                دیدگاه


                  #9
                  پاسخ : تغییر وضعیت دادن ناگهانی portb

                  بله،LVP باید غیرفعال باشه.
                  والله بعید میدونم.آخه مگه چقدر میخواد نویز بندازه رو مدار! نهایتش اینه که فاصله ی کریستال از میکرو باید حداقل باشه.
                  ولی شرایط کاری مداری که این اتفاق براش افتاده رو نگفتی؟

                  دیدگاه


                    #10
                    پاسخ : تغییر وضعیت دادن ناگهانی portb

                    والا شرایط کاریش خاص نیستش زیاد. مثلا یکیشون واس اتاقمه که چشمی بهش وصل کردم تا هر وقت رفتم توی اتاق چراغا روشن بشن. ولی نمیدونم چرا بعد از 1 ماه مثلا 1هو روشن میشه و بعد از تایمی که واسش تعریف کردم دوباره خاموش میشه!!!!! نمیدونم چرا. این پورتای خروجی هیچ شرایط خاصی ندارن یعنی که من در نظر نمیگیرم!!!!!!
                    طب اسلامی

                    دیدگاه


                      #11
                      پاسخ : تغییر وضعیت دادن ناگهانی portb

                      WDT رو روشن کن.
                      منبع تغذیه مدار وضعش چطوره؟
                      تو اول برنامه یه سری مقدار دهی های اولیه رو احتیاطا انجام بده(البته احتمال زیاد انجام دادی)
                      شاید بهتر بشه! هر چند که همه ی اینها به نوعی یه سری حدس هست.

                      دیدگاه


                        #12
                        پاسخ : تغییر وضعیت دادن ناگهانی portb

                        شاید مشکل از مدار ورودی هات باشه که بی موقع تحریک میشن.

                        برای بررسی بیشتر کد و شماتیک ساده ترین مداری که این مشکل رو داره بذار.

                        دیدگاه


                          #13
                          پاسخ : تغییر وضعیت دادن ناگهانی portb

                          اینم یه برنامه سادم. البته منظور من کل خروجی هام هستش. یعنی فقط portb اینجوری نیست. همه ی پورتای خروجیم اینجورن. wdt هم نمیتونم روشن کنم.روشن کنم طرز کار برنامم به هم میریزه.البته فکنم بشه توی جاهایی که کار خاصی انجام نمیدم wdtرو روشن بزارم و بعدش که کار خاصی خاستم بکنم روشنش کنم . البته اگه یه خروحی روشن شه و wdt ریست کنه خروجیم خاموش میشه که. فایده نداره فکنم

                          کد:
                          #include <16f72.h>
                          #device adc=10
                          #use delay(clock=20Mhz)
                          #fuses hs,nowdt,BROWNOUT,protect
                          #use fast_io(b)
                          //----------------------------------------------------------
                          //#define swich pin_b0
                          #define cheshme1 pin_b6
                          //#define cheshme2 pin_b7
                          #define out1 pin_c4
                          #define out2 pin_c5
                          //----------------------------------------------------------
                          #byte T1CON = getenv("SFR:T1CON") 
                          #bit TMR1ON = T1CON.0 
                          #bit t1oscen = T1CON.3
                          #bit tmr1cs=t1con.1
                          #bit t1sync = T1CON.2 
                          
                          //-----#byte t1con=0x10
                          //-----------------------------------------------------
                          int1 out11=0,out22=0;int16 to1,to2;int32 roshan; //to1 yani timer out1
                          int32 ir,mir;   ///mir : motehgayere girande ir hastesh
                          //----------------------------------------------------------
                          #int_timer1
                          void Timer1_isr()
                          {
                          if (out11==1)to1+=1;
                          if (out22==1)to2+=1;
                          set_timer1(0);
                          }
                          //-----------------------------------------------------------
                          #int_rb
                          void rb_isr()
                          {if (input(cheshme1)){output_high(out1);output_high(out2);out11=1;to1=0;}
                          
                          tmr1on=1;
                          enable_interrupts(INT_RB );
                          
                          }
                          
                          //-----------------------------------------------------------
                          void main(){
                          t1oscen=0;
                          t1sync =1;
                          tmr1cs=0;output_c(0b0);
                          setup_adc_ports( ANALOG_RA3_REF);
                          setup_adc(ADC_CLOCK_INTERNAL );
                           setup_timer_1 ( T1_internal | T1_DIV_BY_8 );
                          
                          tmr1on=0;
                          disable_interrupts(INT_TIMER0);
                          enable_interrupts(INT_TIMER1);
                           clear_interrupt(int_rb);
                           enable_interrupts(INT_RB );
                           enable_interrupts(GLOBAL); 
                           //...........................................................
                           
                          set_tris_b(0b11111111);
                          set_tris_a(0b11111111);
                          set_tris_c(0b00);
                          
                          while(true){
                          
                          set_adc_channel(2);
                          delay_ms(20);
                          roshan=read_adc();
                          roshan*=25;
                          
                          set_adc_channel(1);
                          delay_ms(20);
                          mir=read_adc();
                          mir/=10;
                          
                          set_adc_channel(0);
                          delay_ms(20);
                          ir=read_adc();ir*=.95;
                          ir/=10;
                          
                          if (out11==0&&ir<=mir)disable_interrupts(INT_RB );
                          if (out11==0&&ir>mir) enable_interrupts(INT_RB );
                          if (input(cheshme1))to1=0;
                          if (to1>=roshan&&!input(cheshme1)){output_low(out1);output_low(out2);out11=0;to1=0;}
                          
                          if (out11==0)tmr1on=0;
                          }}
                          طب اسلامی

                          دیدگاه


                            #14
                            پاسخ : تغییر وضعیت دادن ناگهانی خروجی های pic

                            1.شماتیک نذاشتی.
                            2. کدت خیلی نامرتب بود سر در نیاوردم. یه چند تا ایراد کوچیک هم داره.
                            3. brownout رو غیر فعال کنی بنظرم بهتره.
                            4.مطمئن باش تغذیه ات درسته. خازن تغذیه. خازن کریستال. مقاومت 4.7 کیلو برای ریست یادت نره. سیم کشی ات کوتاه باشه.
                            5. دلیل ایراد میتونه یکی از موارد زیر باشه:
                            ریست میکرو
                            تحریک ورودی ها
                            ایراد در منطق برنامه

                            دیدگاه


                              #15
                              پاسخ : تغییر وضعیت دادن ناگهانی خروجی های pic

                              عزیز brownout رو غیر فعال کردم. توی اینجا اشتب زدم. تغذیم درسته. خازنم داره. خازن کریستالمم درسته. مقاومتم واس ریست گذاشتم. سیم کشیمم خیلی کوتاهه. فقط توی یکی از مدارام که فرکانسش 20 مگ هست مقاومت pulldown رو 10کیلو گذاشتم که احتمال میدم از این باشه .ولی توی یه مدار دیگم که گیرنده ریموتای 433مگاهرتز هستش توی اون دیگه وورودیم با کلید کنترل نمیشه. بلکه با گیرندم کنترل میشه خروجیم و اگر کد ورودیم درست بودش پایه خروجیم یک میکنه. توی اون موندم که چرا خروجی خود به خود بعضی وقتا یک میشه. زمان لرن شدن ریموت هم مطمینم نویز نمیگیره. لطفا راهنمایی کنید
                              طب اسلامی

                              دیدگاه

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