اطلاعیه

Collapse
No announcement yet.

کمک در مورد سروو موتور

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

    پاسخ : کمک در مورد سروو موتور

    سلام
    برای نمایش و ذخیره اطلاعات در EEPROM در هر یک ثانیه میشه از تایمر و وقفه اون استفاده کرد ولی به خاطر مشکلاتی که قبلا گفتم کار با چند تا وقفه پیچیده میشه،
    با استفاده از تایمر (مثلا تایمر 1 با کریستال خارجی 32.768KHZ) یه تأخیر یک ثانیه ای ایجاد کنید و داخل زیربرنامه وقفه مربوطه اطلاعات را بر روی LCD نمایش و در EEPROM ذخیره کنید.
    بدون وقفه و تایمر هم میشه این کار رو انجام داد ولی یکم پیچیده میشه با استفاده از یه شمارنده تو حلقه MAIN و یه شرط برای خروج از MAIN و رفتن به زیربرنامه نمایش و دخیره در EEPROM
    بهترین کار استفاده از تایمره
    شما زندگی می کنید من بازی میکنم، زندگی شما را; زندگی بازی خدا و یک عروسکِ گِلی ست

    دیدگاه


      پاسخ : کمک در مورد سروو موتور

      نوشته اصلی توسط eMicro
      سلام
      برای نمایش و ذخیره اطلاعات در EEPROM در هر یک ثانیه میشه از تایمر و وقفه اون استفاده کرد ولی به خاطر مشکلاتی که قبلا گفتم کار با چند تا وقفه پیچیده میشه،
      با استفاده از تایمر (مثلا تایمر 1 با کریستال خارجی 32.768KHZ) یه تأخیر یک ثانیه ای ایجاد کنید و داخل زیربرنامه وقفه مربوطه اطلاعات را بر روی LCD نمایش و در EEPROM ذخیره کنید.
      بدون وقفه و تایمر هم میشه این کار رو انجام داد ولی یکم پیچیده میشه با استفاده از یه شمارنده تو حلقه MAIN و یه شرط برای خروج از MAIN و رفتن به زیربرنامه نمایش و دخیره در EEPROM
      بهترین کار استفاده از تایمره
      سلام جناب eMicro
      روزتون بخیر،بسیار متشکرم از پاسختون.
      در نتیجه طبق راه کار شما باید تایمر 1 رو مثلا با استفاده از سرریزش طوری تنظیم کنم که بعد از 1 ثانیه به روتین وقفه ی اون منتقل بشیم، و در اونجا هر گاه پرچم سریز 1 شد، اونوقت ابتدا اطلاعاتی رو که خوندن فرکانس و خوندن خروجی A/D هست رو روی lcd نمایش بدم و بعد در eeprom ذخیره کنم، درست عرض میکنم جناب مهندس؟

      یک سوال اونم اینکه به این ترتیب ما چه طور میتونیم همه ی اطلاعاتی که یک جا ذخیره شده رو، به صورت یکجا ببینیم؟ منظور این هست که مقدار فرکانسی که با برنامه ی فرکانس متر و ولتاژی که از A/D خوندیم رو به چه نحو میتونیم به صورت همزمان و یک جا در دسترس داشته باشیم و ببینیمشون؟


      زندگی برگ بودن در مسیر باد نیست
      امتحان ریشه هاست
      ریشه هم هرگز اسیر باد نیست
      زندگی چون پیچک است
      انتهایش میرسد پیش خدا!

      دیدگاه


        پاسخ : کمک در مورد سروو موتور

        نوشته اصلی توسط pama
        در نتیجه طبق راه کار شما باید تایمر 1 رو مثلا با استفاده از سرریزش طوری تنظیم کنم که بعد از 1 ثانیه به روتین وقفه ی اون منتقل بشیم، و در اونجا هر گاه پرچم سریز 1 شد، اونوقت ابتدا اطلاعاتی رو که خوندن فرکانس و خوندن خروجی A/D هست رو روی lcd نمایش بدم و بعد در eeprom ذخیره کنم، درست عرض میکنم جناب مهندس؟
        درسته
        یک سوال اونم اینکه به این ترتیب ما چه طور میتونیم همه ی اطلاعاتی که یک جا ذخیره شده رو، به صورت یکجا ببینیم؟ منظور این هست که مقدار فرکانسی که با برنامه ی فرکانس متر و ولتاژی که از A/D خوندیم رو به چه نحو میتونیم به صورت همزمان و یک جا در دسترس داشته باشیم و ببینیمشون؟
        این اطلاعات داخل متغیر مربوطه وجود داره دیگه؟
        ولتاژی که از A/D میخونید داخل یه متغیره و همین طور فرکانس اندازه گیری شده ، از همین متغیرها میشه تو زیربرنامه وقفه هم استفاده کرد.
        شما زندگی می کنید من بازی میکنم، زندگی شما را; زندگی بازی خدا و یک عروسکِ گِلی ست

        دیدگاه


          پاسخ : کمک در مورد سروو موتور

          بسیار متشکرم جناب مهندس از حضور و پاسخ مجددتون.

          نوشته اصلی توسط eMicro
          این اطلاعات داخل متغیر مربوطه وجود داره دیگه؟
          ولتاژی که از A/D میخونید داخل یه متغیره و همین طور فرکانس اندازه گیری شده ، از همین متغیرها میشه تو زیربرنامه وقفه هم استفاده کرد.
          بله، متوجهم جناب eMicro.
          منتها ابهامم اینجاست که چطور میتونم یه لیستی داشته باشم که این لیست یک قسمتش مربوط به فرکانس ما باشه که از 0 تا 130 هرتز تغییر میکنه، و در قسمت دیگه ی این لیست ولتاژ متناظر با خروجی a/d رو داشته باشیم.
          به عبارت دیگه اگه بخوام روشنتر عرض کنم به این صورت که ما فرکانس خروجی این سنسورمون وقتی فرکانس 1 هرتز رو به ما نشون میده، بنده میخوام بدونم در مقابل این فرکانس ولتاژمون که خروجی سنسور دوم هست چقدره؟
          و به همین ترتیب لیستی داشته باشیم که بازای تک تک فرکانسها در مقابلش خروجی ولتاژ اون یکی سنسور رو هم بدونیم.
          و هدف بنده این هست که همش رو یک جا ببینم، مثلا وقتی فرکانسم 5 هرتز بوده ولتاژم 3 ولت رو نشون داده، یا فرکانسم شده 12 هرتز ، اونوقت ولـتاژم شده 6 ولت،(البته به طور مثال عرض میکنم و در واقعیت حتما فرق میکنه) و همینطور تا به آخر، و نهایتا یک لیستی باشه که همش رو یک جا ببینم.

          باز هم از لطفتون یک دنیا سپاسگذارم.
          زندگی برگ بودن در مسیر باد نیست
          امتحان ریشه هاست
          ریشه هم هرگز اسیر باد نیست
          زندگی چون پیچک است
          انتهایش میرسد پیش خدا!

          دیدگاه


            پاسخ : کمک در مورد سروو موتور

            سلام
            ببخشید که دیر جواب دادم فیلترنت قطع بود
            برای این کار میشه از یه آرایه دو بعدی استفاده کرد( تو یه بعد فرکانس و تو بعد دیگر مقدار ولتاژ آنالوگ)
            ولی به دلیل محدودیت های حافظه رم میکرو تو picbasic فقط میشه آرایه یه بعدی تعریف کرد
            پس باید از دوتا آرایه یک بعدی استفاده کنید
            شما زندگی می کنید من بازی میکنم، زندگی شما را; زندگی بازی خدا و یک عروسکِ گِلی ست

            دیدگاه


              پاسخ : کمک در مورد سروو موتور

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

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

              باز هم ازتون ممنونم.



              اضافه شده در تاریخ :
              راستی دوستان بزرگوار فکر میکنم بنده خیلی بحث رو پراکنده و دور از موضوع اصلی کردم.
              اگر اساتید موافق باشند در ضمن اینکه بنده تلاش میکنم تا برنامه اصلی رو یه جوری جمعش کنم، ازتون تقاضا دارم برگردیم سر موضوع اصلی و اون 2 تا مشکلی که وجود داشت و بقیه ی کار رو با کمک و لطف اساتید بزرگوار ادامه بدم تا با همون برنامه ای که دارم ببینم به کجا میرسم و این مشکلات چه طور خواهند شد...

              پیشاپیش از لطف همه یک دنیا سپاسگذارم.
              زندگی برگ بودن در مسیر باد نیست
              امتحان ریشه هاست
              ریشه هم هرگز اسیر باد نیست
              زندگی چون پیچک است
              انتهایش میرسد پیش خدا!

              دیدگاه


                پاسخ : کمک در مورد سروو موتور

                نوشته اصلی توسط pama
                راستی دوستان بزرگوار فکر میکنم بنده خیلی بحث رو پراکنده و دور از موضوع اصلی کردم.
                اگر اساتید موافق باشند در ضمن اینکه بنده تلاش میکنم تا برنامه اصلی رو یه جوری جمعش کنم، ازتون تقاضا دارم برگردیم سر موضوع اصلی و اون 2 تا مشکلی که وجود داشت و بقیه ی کار رو با کمک و لطف اساتید بزرگوار ادامه بدم تا با همون برنامه ای که دارم ببینم به کجا میرسم و این مشکلات چه طور خواهند شد...

                پیشاپیش از لطف همه یک دنیا سپاسگذارم.
                سلام
                امیدوارم غیبت چند روزه من رو ببخشید
                این چند روز آنچنان سرم شلوغ بهست که گاهی حتی وقت غذا خوردن پیدا نمیکنم و ممکنه باز هم تا چند روز دیگه طول بکشه(چند بار چند خطی تاپیپ کردم ولی باز کاری پیش اومد و رفتم)
                ببینید نوشت در EEprom محدوده یعنی شما نمیتونید مرتبا روی این حافظه بنویسید (فکر میکنم حدود 10000 بار) بنابراین شما باید فکر بهتری برای این کار بکنید
                من پستهای شما و جناب eMicro رو نخوندم تا ببینم مشکل چیه ولی اونجوری که از پست آخر شما معلومه مسئله فعلا کنار گذاشته شده.
                خوب شما به همان ترتیبی که قرار بود کار رو پیش ببرید یعنی خواندن زوایای قبلی رو از روی Eeprom در ابتدای برنامه انجام بدهید و با هر روشی که میتونید (وقفه و یا استفاده از If)قطعی برق رو تشخیص بدید و به محض قطع برق مقادیر زوایا رو در Eeprom ذخیره کنید)
                خوب حالا مشکل کجاست تا باز کار رو شروع کنیم
                پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                دیدگاه


                  پاسخ : کمک در مورد سروو موتور

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

                  نوشته اصلی توسط امیر حسنی کاخکی
                  ببینید نوشت در EEprom محدوده یعنی شما نمیتونید مرتبا روی این حافظه بنویسید (فکر میکنم حدود 10000 بار) بنابراین شما باید فکر بهتری برای این کار بکنید
                  من پستهای شما و جناب eMicro رو نخوندم تا ببینم مشکل چیه ولی اونجوری که از پست آخر شما معلومه مسئله فعلا کنار گذاشته شده.
                  بله، فعلا تا یه مدت کوتاهی کتار گذاشته بشه، تا مساله ی اصلی کمی بهبود پیدا کنه، بعد دوباره بر گردم سر این وضوع، منتها خیلی دوست داشتم که هم فرصت میشد و هم اینکه سوادش رو داشتم که همزمان این کارها رو انجام بدم....

                  نوشته اصلی توسط امیر حسنی کاخکی
                  خوب شما به همان ترتیبی که قرار بود کار رو پیش ببرید یعنی خواندن زوایای قبلی رو از روی Eeprom در ابتدای برنامه انجام بدهید و با هر روشی که میتونید (وقفه و یا استفاده از If)قطعی برق رو تشخیص بدید و به محض قطع برق مقادیر زوایا رو در Eeprom ذخیره کنید)
                  خوب حالا مشکل کجاست تا باز کار رو شروع کنیم
                  ok، فعلا هیچی جناب کاخکی، اوامر شما رو اجرا میکنم تا ببینیم خدا چی میخواد.


                  اضافه شده در تاریخ :
                  سلام خدمت همه ی سروران گرامی و عرض معذرت فراوان بابت این همه غیبت.
                  شکر خدا کمی از مشکلات بنده مرتفع شدن و بنده میتونم تا مدتی مجددا از محضر اساتید استفاده ببرم.

                  خوشبختانه با راهنمائیهای جناب eMicro مبنی بر استفاده از آرایه ها برای نشون دادن همزمان مقدار خروجی 2 سنسور و کمک دوست گرامی جناب ابوالحسنی، مشکل فوق حل شد، و با اجازه ی دوستان برمیگردیم سر مساله ی مشکل سرووها، به امید خدا بعد از برنامه ی آرایه ها امشب برنامه رو با نوشتن در eeprom ادیت میکنم و مجددا مزاحم اساتید خواهم بود.

                  با تشکر فراوان.


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

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

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

                  کد:
                   DEFINE OSC 8
                  @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
                  
                  servo1 var byte 
                  servo2 var byte 
                  servo3 var byte 
                  servo4 var byte 
                  servo5 var byte 
                  servo6 var byte 
                  servo7 var byte
                  
                  a var byte
                  b var byte
                  f var word
                  flag var bit
                  
                  
                  ON INTERRUPT GOTO _interrupt
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                  
                    TRISD=$00
                    PORTD=$00
                    TRISc.0=1
                    TRISB=0
                  
                    
                   ;;;;;;;;;       
                   TMR1L=0
                   TMR1H=0
                   T1CON=$03 ;turn on timer1 in counter mode
                   ;;;;;;;;;
                   
                   PIR1.1=0 ; TMR2IF=0
                   TMR2=0
                   PR2=249
                   PIE1.1=1
                   T2CON=$4F
                     ;;;;;;;;;
                    INTCON.6=1  
                    INTCON.7=1  
                    
                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                   
                   servo3 = 126
                   servo4 = 126
                   
                   again:
                   
                   
                   if flag=1 then 
                  
                   if f >= 25 and f<=27 then
                   servo3 = 50
                   if b>=50 then
                   servo4 = 100
                   endif
                   endif
                   
                    if f >= 45 and f <= 47 then
                   servo3 = 250 
                   if b>=50 then
                    servo4 = 200
                    endif
                    endif
                    
                      
                   
                   if f >= 60 and f <= 62 then
                   servo3 = 100 
                   endif
                   
                   
                   if f >= 80 and f <= 82 then
                   servo3 = 250
                   if b >=50 then
                    servo4 = 100
                    endif
                    endif
                   
                    if f >= 103 and f <= 105 then
                   servo4 = 250
                   endif
                  
                  flag=0 
                  endif 
                   
                     
                  goto again
                  
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                    DISABLE 
                  _interrupt:            ; interrupt service
                  
                  if PIR1.1=1 then     ; if TMR2IF=1 then
                   
                   
                   b=b+1
                   a=a+1
                   
                   if a>=40 then 
                   F.byte1=TMR1H
                   F.byte0=TMR1L      
                   TMR1L=0
                   TMR1H=0
                   T1CON=$03
                   a=0 
                   flag=1
                   PORTB=f
                   endif  
                     
                            
                       PORTD = $01
                       PAUSEUS 990 
                       INTCON.2=0
                       TMR0 = 255-servo1
                       OPTION_REG = OPTION_REG & $c0 
                       OPTION_REG = OPTION_REG | $02 
                       while INTCON.2=0
                       wend   
                       PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;
                        PORTD=$02;
                        PAUSEUS 990 
                        INTCON.2=0
                        TMR0 = 255-servo2 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02 
                        while INTCON.2=0
                        wend
                         PORTD=$00    
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                        PORTD=$04;
                        PAUSEUS 990 
                        INTCON.2=0
                        TMR0 = 255-servo3
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$08;
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo4 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$10
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo5
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                        PORTD=$20
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo6 
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                         PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                        PORTD=$40
                        PAUSEUS 990  
                        INTCON.2=0
                        TMR0 = 255-servo7
                        OPTION_REG = OPTION_REG & $c0 
                        OPTION_REG = OPTION_REG | $02
                        while INTCON.2=0
                        wend
                        PORTD=$00
                       ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                     PIR1.1=0  ; clear TMR2IF
                     endif 
                        
                       
                    RESUME     ;return from interrapt 
                    ENABLE 
                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                  
                  end
                  البته اگر دوستان موافق باشند، اگر نه که بنده تابع اوامر اساتید هستم.

                  و اما خلاصه ی کاری که باید انجام میشد، به نظرم این طور بود:
                  بنده باید در ابتدا سخت افزار مدارم رو طبق فرمایش جناب کاخکی و به این ترتیب تغییر میدادم:

                  نوشته اصلی توسط امیر حسنی کاخکی
                  بعد از اون باید چک میشد که تغذیه کی قطع میشه،تا به محض قطع شدن اون به یک لیبلی بریم که در اون ابتدا وقفه ها رو غیر فعال کنیم و بعد مقدار سرووها در eeprom ذخیره بشه ،که طبق فرمایش جناب eMicro باید با وقفه ی خارجی و یا یک if ساده موضوع قطعی تغذیه چک میشد.

                  و بعد باید در ابتدای برنامه زوایای ذخیره شده خونده بشن، تا به این ترتیب اولین مشکل ما که مربوط به حرکت اولیه ی سرووها بود، رفع بشه، درست عرض میکنم؟

                  حالا باز هم با چند تایی سوال میخوام مزاحم محضر اساتید بشم:
                  اولی اینکه این if باید در ابتدای برنامه باشه و در هر جای برنامه که نیاز بود مقدار سرووها ذخیره بشن، پین آزاد میکرو رو 0 کنیم و یا به عبارتی تغذیه رو قطع کنیم تا بعد از اون پرش به لیبل سیو کردن در eeprom صورت بگیره، درسته عرض بنده؟

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

                  سومیش هم این که خوندن از eeprom باید دقیقا قبل از main اصلی که شرطها در اون قرار داره، صورت بگیره؟

                  امیدوارم سوالات مجدد و پیاپی بنده رو عفو بفرمائید
                  زندگی برگ بودن در مسیر باد نیست
                  امتحان ریشه هاست
                  ریشه هم هرگز اسیر باد نیست
                  زندگی چون پیچک است
                  انتهایش میرسد پیش خدا!

                  دیدگاه


                    پاسخ : کمک در مورد سروو موتور

                    نوشته اصلی توسط pama

                    باید در ابتدای برنامه زوایای ذخیره شده خونده بشن، تا به این ترتیب اولین مشکل ما که مربوط به حرکت اولیه ی سرووها بود، رفع بشه، درست عرض میکنم؟
                    کاملا درسته

                    نوشته اصلی توسط pama

                    این if باید در ابتدای برنامه باشه و در هر جای برنامه که نیاز بود مقدار سرووها ذخیره بشن، پین آزاد میکرو رو 0 کنیم و یا به عبارتی تغذیه رو قطع کنیم تا بعد از اون پرش به لیبل سیو کردن در eeprom صورت بگیره، درسته عرض بنده؟
                    در ابتدای برنامه نه بلکه داخل لوپ اصلی و البته چون از وقفه استفاده نمیکنید بهتره در چند جای لوپ اصلی استفاده بشه

                    نوشته اصلی توسط pama

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

                    نوشته اصلی توسط pama

                    سومیش هم این که خوندن از eeprom باید دقیقا قبل از main اصلی که شرطها در اون قرار داره، صورت بگیره؟
                    قبلا هم گفته بودم اولین کار پس از تعریف متغیرها خوندن از EEprom باشه.
                    پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                    دیدگاه


                      پاسخ : کمک در مورد سروو موتور

                      با سلام.
                      از حضور مجددتون در تایپیک و پاسخ گوئیهای مثل همیشتون، سپاسگذارم جناب کاخکی.

                      به هر حال این 4 خط مربوط به eeprom رو اضافه کردم، داشتم سعی میکردم با وقفه خارجی قطعی تغذیه رو بفهمم،منتها دیدم یه کم طول میکشه، برای همین برنامه ی پست قبل رو با if ادیت کردم، و امیدوارم دوستان چک کنن که کارایی که انجام دادم درست هست یا خیر...

                      برنامه شد این:

                      کد:
                      '****************************************************************
                      '* Name  : UNTITLED.BAS                   *
                      '* Author : [select VIEW...EDITOR OPTIONS]          *
                      '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                      '*     : All Rights Reserved                *
                      '* Date  : 14/02/2012                    *
                      '* Version : 1.0                        *
                      '* Notes  :                          *
                      '*     :                          *
                      '****************************************************************
                       DEFINE OSC 8
                      @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
                      
                      servo1 var byte 
                      servo2 var byte 
                      servo3 var byte 
                      servo4 var byte 
                      servo5 var byte 
                      servo6 var byte 
                      servo7 var byte
                      
                      a var byte
                      b var byte
                      f var word
                      flag var bit
                      
                      read 0, servo1
                      read 1, servo2
                      read 2, servo3
                      read 3, servo4
                      read 4, servo5
                      read 5, servo6
                      read 6, servo7
                      
                      
                      
                      ON INTERRUPT GOTO _interrupt
                      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                      
                      
                        TRISD=$00
                        PORTD=$00
                        TRISc.0=1
                        TRISB=0
                      
                        
                       ;;;;;;;;;       
                       TMR1L=0
                       TMR1H=0
                       T1CON=$03 ;turn on timer1 in counter mode
                       ;;;;;;;;;
                       
                       PIR1.1=0 ; TMR2IF=0
                       TMR2=0
                       PR2=249
                       PIE1.1=1
                       T2CON=$4F
                         ;;;;;;;;;
                        INTCON.6=1  
                        INTCON.7=1  
                        
                        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                       
                       
                       again:
                       
                       if porta.0 = 1 then save  ;taghzieh
                       
                       
                      
                      if flag=1 then 
                       
                       if f <= 25 then
                       servo3 = 250
                       endif
                      
                        if f >= 26 and f <= 40 then
                       servo3 = 50
                       if b>=50 then
                       servo4 = 100
                       endif
                       endif
                       
                      
                       if porta.0 = 1 then save  ;taghzieh
                      
                      
                        if f >= 41 and f <= 60 then
                       servo3 = 200
                       endif
                      
                       if f >= 61 and f <= 80 then
                         servo3 = 100
                       if b>=50 then
                       servo4 = 200
                       endif
                       endif
                       
                       
                       if porta.0 = 1 then save   ;taghzieh
                       
                      
                       if f >= 81 and f <= 100 then
                       servo4 =150
                       endif
                      
                       if f >= 101 and f <= 116 then
                       servo4 = 250
                       endif
                      
                       if f >= 117 then
                       servo4 = 100
                       endif
                       
                       if porta.0 = 1 then save   ;taghzieh
                       
                       
                      flag=0 
                      endif 
                         
                      goto again
                      
                      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                      
                        DISABLE 
                      _interrupt:            ; interrupt service
                      
                      if PIR1.1=1 then     ; if TMR2IF=1 then
                       
                       
                       b=b+1
                       a=a+1
                       
                       if a>=40 then 
                       F.byte1=TMR1H
                       F.byte0=TMR1L      
                       TMR1L=0
                       TMR1H=0
                       T1CON=$03
                       a=0 
                       flag=1
                       PORTB=f
                       endif  
                         
                                
                           PORTD = $01
                           PAUSEUS 990 
                           INTCON.2=0
                           TMR0 = 255-servo1
                           OPTION_REG = OPTION_REG & $c0 
                           OPTION_REG = OPTION_REG | $02 
                           while INTCON.2=0
                           wend   
                           PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;
                            PORTD=$02;
                            PAUSEUS 990 
                            INTCON.2=0
                            TMR0 = 255-servo2 
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02 
                            while INTCON.2=0
                            wend
                             PORTD=$00    
                           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                            PORTD=$04;
                            PAUSEUS 990 
                            INTCON.2=0
                            TMR0 = 255-servo3
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                            PORTD=$08;
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo4 
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                            PORTD=$10
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo5
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                            PORTD=$20
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo6 
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                            PORTD=$40
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo7
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                            PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                         PIR1.1=0  ; clear TMR2IF
                         endif 
                            
                           
                        RESUME     ;return from interrapt 
                        ENABLE 
                      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                      save:
                      
                      disable      ;gheire faal kardane vaghfeha
                      write 0, servo1
                      write 1, servo2
                      write 2, servo3
                      write 3, servo4
                      write 4, servo5
                      write 5, servo6
                      write 6, servo7
                      
                      end
                      قسمتهایی که اضافه شد، تیکه های رنگی زیر هستند:
                      .
                      .
                      flag var bit

                      read 0, servo1
                      read 1, servo2
                      read 2, servo3
                      read 3, servo4
                      read 4, servo5
                      read 5, servo6
                      read 6, servo7


                      ON INTERRUPT GOTO _interrupt
                      .
                      .

                      again:

                      if porta.0 = 1 then save ;taghzieh

                      if flag=1 then

                      if f <= 25 then
                      servo3 = 250
                      endif

                      if f >= 26 and f <= 40 then
                      servo3 = 50
                      if b>=50 then
                      servo4 = 100
                      endif
                      endif

                      if porta.0 = 1 then save ;taghzieh

                      if f >= 41 and f <= 60 then
                      servo3 = 200
                      endif

                      if f >= 61 and f <= 80 then
                      servo3 = 100
                      if b>=50 then
                      servo4 = 200
                      endif
                      endif

                      if porta.0 = 1 then save ;taghzieh

                      if f >= 81 and f <= 100 then
                      servo4 =150
                      endif

                      if f >= 101 and f <= 116 then
                      servo4 = 250
                      endif

                      if f >= 117 then
                      servo4 = 100
                      endif

                      if porta.0 = 1 then save ;taghzieh
                      flag=0
                      endif
                      goto again
                      .
                      .
                      save:

                      disable ;gheire faal kardane vaghfeha
                      write 0, servo1
                      write 1, servo2
                      write 2, servo3
                      write 3, servo4
                      write 4, servo5
                      write 5, servo6
                      write 6, servo7

                      end

                      به نظر شما کدهایی که اضافه شدند، درست هستند و جاشون همین جایی هست که بنده قرار دادم یا خیر؟

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

                      بعدیش هم این که وقتی ما در ابتدای برنامه مقادیر ذخیره شده رو میخونیم، احتیاجی به این نیست که ما کاری انجام بدیم، جهت اینکه این مقادیر با روشن شدن سرووها بهشون اعمال بشن، و خود به خود این عمل انجام میشه، درست عرض میکنم؟!

                      سومی هم اینکه برای چک کردن قطع شدن تغذیه و بد از اون پرش به لیبل save به ترتیبی که تو برنامه نوشتم، مشکلی نداره؟
                      یا اینکه از دستور gosub و return به ترتیب زیر استفاده کنم؟

                      if porta.0 = 1 then
                      gosub save
                      .
                      .
                      save:
                      disable
                      write eeprom....
                      .
                      .
                      return
                      end

                      و سوال آخر هم اینکه لیبل save همین جایی که اومده درسته یا اینکه باید بعد از لوپ اصلی بیاد؟
                      واقعا شرمنده ام از این همه مزاحمت و سوال...


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

                      کد:
                      '****************************************************************
                      '* Name  : UNTITLED.BAS                   *
                      '* Author : [select VIEW...EDITOR OPTIONS]          *
                      '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
                      '*     : All Rights Reserved                *
                      '* Date  : 27/02/2012                    *
                      '* Version : 1.0                        *
                      '* Notes  :                          *
                      '*     :                          *
                      '****************************************************************
                       DEFINE OSC 8
                      @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_OFF ,HS_OSC ,BOD_OFF
                      
                      servo1 var byte 
                      servo2 var byte 
                      servo3 var byte 
                      servo4 var byte 
                      servo5 var byte 
                      servo6 var byte 
                      servo7 var byte
                      
                      a var byte
                      b var byte
                      f var word
                      flag var bit
                      
                      read 0, servo1
                      read 1, servo2
                      read 2, servo3
                      read 3, servo4
                      read 4, servo5
                      read 5, servo6
                      read 6, servo7
                      
                      
                      
                      ON INTERRUPT GOTO _interrupt
                      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                      
                      
                        TRISD=$00
                        PORTD=$00
                        TRISc.0=1
                        TRISB=0
                        trisa.0=1
                      
                        
                       ;;;;;;;;;       
                       TMR1L=0
                       TMR1H=0
                       T1CON=$03 ;turn on timer1 in counter mode
                       ;;;;;;;;;
                       
                       PIR1.1=0 ; TMR2IF=0
                       TMR2=0
                       PR2=249
                       PIE1.1=1
                       T2CON=$4F
                         ;;;;;;;;;
                         
                        intcon = %11010000  'external interrupt
                       
                        option_reg.6 = 0
                        
                        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                       
                       
                       again:
                       
                       high porta.0
                      
                      if flag=1 then 
                       
                       if f <= 25 then
                       servo3 = 250
                       endif
                      
                        if f >= 26 and f <= 40 then
                       servo3 = 50
                       if b>=50 then
                       servo4 = 100
                       endif
                       endif
                      
                        if f >= 41 and f <= 60 then
                       servo3 = 200
                       endif
                      
                       if f >= 61 and f <= 80 then
                         servo3 = 100
                       if b>=50 then
                       servo4 = 200
                       endif
                       endif
                       
                       if f >= 81 and f <= 100 then
                       servo4 =150
                       endif
                      
                       if f >= 101 and f <= 116 then
                       servo4 = 250
                       endif
                      
                       if f >= 117 then
                       servo4 = 100
                       endif
                       
                      flag=0 
                      endif 
                         
                      goto again
                      
                      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                      
                        DISABLE 
                      _interrupt:            ; interrupt service
                      
                      if PIR1.1=1 then     ; if TMR2IF=1 then
                       
                       
                       b=b+1
                       a=a+1
                       
                       if a>=40 then 
                       F.byte1=TMR1H
                       F.byte0=TMR1L      
                       TMR1L=0
                       TMR1H=0
                       T1CON=$03
                       a=0 
                       flag=1
                       PORTB=f
                       endif  
                         
                                
                           PORTD = $01
                           PAUSEUS 990 
                           INTCON.2=0
                           TMR0 = 255-servo1
                           OPTION_REG = OPTION_REG & $c0 
                           OPTION_REG = OPTION_REG | $02 
                           while INTCON.2=0
                           wend   
                           PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;
                            PORTD=$02;
                            PAUSEUS 990 
                            INTCON.2=0
                            TMR0 = 255-servo2 
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02 
                            while INTCON.2=0
                            wend
                             PORTD=$00    
                           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                            PORTD=$04;
                            PAUSEUS 990 
                            INTCON.2=0
                            TMR0 = 255-servo3
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                            PORTD=$08;
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo4 
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                            PORTD=$10
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo5
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                            PORTD=$20
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo6 
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                             PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;;  
                            PORTD=$40
                            PAUSEUS 990  
                            INTCON.2=0
                            TMR0 = 255-servo7
                            OPTION_REG = OPTION_REG & $c0 
                            OPTION_REG = OPTION_REG | $02
                            while INTCON.2=0
                            wend
                            PORTD=$00
                           ;;;;;;;;;;;;;;;;;;;;;;;;;; 
                         PIR1.1=0  ; clear TMR2IF
                         endif 
                         
                         ;;;;;;;;;;;;;;
                         
                         if intcon.1 = 1 then
                         
                         intcon.7 = 0
                         
                         write 0, servo1
                         write 1, servo2
                         write 2, servo3
                         write 3, servo4
                         write 4, servo5
                         write 5, servo6
                         write 6, servo7
                         
                         intcon.1 = 0
                         endif
                           
                        RESUME     ;return from interrapt 
                        ENABLE 
                      
                      end
                      خدمت بزرگواران عرض کنم که راه حلی که در حال انجام اون هستیم جهت اینکه حرکت اولیه ی سرووها به محض زدن تغذیه گرفته بشه، ابهامی رو برای بنده به وجود آورده، اون هم این هست که با توجه به اینکه عمر نوشتن در eeprom کم هست و فکر میکنم در بهترین حالت ما تا 10 هزار بار میتونیم تو این حافظه بنویسیم، در صورتی که میزان عمر دستگاه ما یا به عبارتی تعداد دفعات روشن و خاموش شدن اون در طول زمان کارکرد و عمرش ، خیلی بیشتر از 10 هزار بار هست و این جای ماجرا کمی به ضرر ماست، یعنی ما بعد از اینکه عمر eeprom به سر بیاد، نباید از دستگامون انتظار کار داشته باشیم!

                      بسیار مشتاقم تا نظر اساتید رو بدونم.

                      از طرفی قیمت سرووهایی که قرار هست در دستگاه ما مورد استفاده قرار بگیره، در عرض 4 تا 5 ماه گذشته به صورت نجومی در حال افزایش هست، تا جائیکه از 32 هزار تومان در 5 ماه پیش، امشب به 60 هزار تومان رسیده!!!
                      و بدتر از همه این که گروه ما به این نتیجه رسیده که بیشتر از 7 تا، تقریبا حدود 10 تا از این موتور رو ما احتیاج داریم! و این برای تولید انبوه و اون هم یک کار دانشجویی بسیار سنگین خواهد بود...

                      و متاسفانه غیبت بنده در این مدت، و به موازات اون تعطیل کردن کار از طرف خود بنده ، همه ی این ضررها رو چند برابر کرد....

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

                      با تشکر فراوان.
                      زندگی برگ بودن در مسیر باد نیست
                      امتحان ریشه هاست
                      ریشه هم هرگز اسیر باد نیست
                      زندگی چون پیچک است
                      انتهایش میرسد پیش خدا!

                      دیدگاه


                        پاسخ : کمک در مورد سروو موتور

                        سلام
                        چون PIC بلد نیستم در مورد برنامه ها نمیتونم نظری بدم.فقط برنامه اولی ظاهرا درسته و نباید مشکلی باشه
                        در مورد تعداد محدود نوشتن در حافظه 2 کار میتونید انجام بدید
                        1-راه ساده تر اینکه از حافظه های خارجی مثل 24CXX استفاده کنید .فکر میکنم محدودیت در این آی سی ها کمتره (دفعات ذخیره حدود 10 برابر)(در بعضی دیتاشیتها صدهزار و در برخی یک میلیون بار ذکر شده)
                        2- راه حل کمی مشکل تر هم استفاده از حالتی که تعداد نوشتن در خانه خاصی از حافظه رو محدود کنه.و وقتی به حد خاصی رسید از خانه دیگری برای ذخیره استفاده کنه
                        3- که از هردو مشکل تره استفاده هردو حالت بالا با همه :redface:

                        درکل پیشنهاد میکنم زیاد خودتون رو در گیر این مسائل نکنید.همونطور که قبلا هم گفتم سعی کنید مرحله به مرحله پیش برید.این روشی که شما کار میکنید هم باعث گیج شدن و پیچیده به نظر اومدن پروژه میشه و هم باعث اتلاف زمان.پس سعی کنید یک مرحله رو تا آخر پیش برید و پس از به جواب نهایی رسیدن و قطعی شدن مرحله جدید رو شروع کنید.
                        من خودم وقتی میخوام برنامه ای بنویسم با اضافه کردن هر 5 الی10 خط برنامه رو یک بار کامپایل و در صورت امکان با پروتئوس تست و پس از پایان یافتن اون تیکه از برنامه سعی میکنم در صورت امکان به صورت یک زیر برنامه و یا تابع در برنامه اصلی ازش استفاده کنم. این روش رو به شما هم پیشنهاد میکنم.

                        در مورد سرووها هم چون شناختی ندارم پس پیشنهادی هم ندارم.فقط میدونم در ایران چیزی که گرون میشه دیگه ارزون نمیشه نمونش میکرو AVR
                        پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                        دیدگاه


                          پاسخ : کمک در مورد سروو موتور

                          با سلام امیدوارم موفق باشید .
                          خواهش میکنم در خدمتم.
                          عرض کنم که من آخرین پیغامی که براتون فرستادم آخرین ایده خودمو گفتم خدمتتون اما نمیدونم شاید پاک شده بود که شما نخوندینش ؟
                          عرض من به این شکل بود که گفتم شما به جای این که کل سروو رو خاموش و روشن کنید و این باعث هنگ کردن یا قاطی کردن سروو میشه

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

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

                          من نمیخواستم این 2 راه رو بگم چون به نظرم کمی پیچیده میومدند. اما الان که میبینم این پروژه این همه طولانی شده و راه های پر درد سر تری مطرح میشه فکر میکنم این کار ها رو انجام بدید بهتر باشه .

                          من با استفاده از eeprom به دلایل مختلف مخالفم .

                          دیدگاه


                            پاسخ : کمک در مورد سروو موتور

                            سلام دوستان
                            من برنامه وقفه خارجی رو بررسی کردم ظاهرا مشکلی نداره
                            اگه با eeprom مشکل دارید میشه از eeprom های microchip با قابلیت 100000 بار نوشتن و بیشتر استفاده کرد
                            یا از حافظه های فلش سریال با SPI یا I2C
                            این حافظه ها شاید تو ایران نباشه
                            میشه تو فلش خود میکرو اطلاعات رو ذخیره کرد
                            یا از یه میکرو دیگه به عنوان slave استفاده کنید و اطلاعات رو تو فلش اون ذخیره کنید
                            از sd/mmc هم میشه استفاده کرد ولی با PICbasic راه اندازیش سخته
                            دیگه راهی به ذهنم نمیرسه
                            یه سوال؟
                            امکان اتصال PC به دستگاه شما هست؟
                            اگه جواب مثبته اطلاعات رو به PC منتقل کنید و با vb یه برنامه بنویسید که اطلاعات رو دخیره کنه


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

                            دیدگاه


                              پاسخ : کمک در مورد سروو موتور

                              با عرض سلام و احترام خدمت همه ی سروران، و تشکر فراوون بابت لطفتون.

                              نوشته اصلی توسط امیر حسنی کاخکی
                              در مورد تعداد محدود نوشتن در حافظه 2 کار میتونید انجام بدید
                              1-راه ساده تر اینکه از حافظه های خارجی مثل 24CXX استفاده کنید .فکر میکنم محدودیت در این آی سی ها کمتره (دفعات ذخیره حدود 10 برابر)(در بعضی دیتاشیتها صدهزار و در برخی یک میلیون بار ذکر شده)
                              2- راه حل کمی مشکل تر هم استفاده از حالتی که تعداد نوشتن در خانه خاصی از حافظه رو محدود کنه.و وقتی به حد خاصی رسید از خانه دیگری برای ذخیره استفاده کنه
                              3- که از هردو مشکل تره استفاده هردو حالت بالا با همه :redface:
                              بسیار سپاسگذارم جناب کاخکی از پیشنهادات خوبتون.
                              بله، اون طور هم که بنده شنیدم تعداد دفعات خوندن و پاک کردن در حافظه های خارجی سریال بین 1 تا 10 میلیون بار تخمین زده شده، و این میتونه برای کار ما مناسب باشه.

                              جناب کاخکی متاسفانه بنده دقیقا متوجه منظورتون از توضیح شماره ی 3 نشدم، اگر امکان داره، میشه لطفا کمی بیشتر بنده رو توجیح کنید...

                              نوشته اصلی توسط eMicro
                              من برنامه وقفه خارجی رو بررسی کردم ظاهرا مشکلی نداره
                              اگه با eeprom مشکل دارید میشه از eeprom های microchip با قابلیت 100000 بار نوشتن و بیشتر استفاده کرد
                              یا از حافظه های فلش سریال با SPI یا I2C
                              این حافظه ها شاید تو ایران نباشه
                              میشه تو فلش خود میکرو اطلاعات رو ذخیره کرد
                              یا از یه میکرو دیگه به عنوان slave استفاده کنید و اطلاعات رو تو فلش اون ذخیره کنید
                              از sd/mmc هم میشه استفاده کرد ولی با PICbasic راه اندازیش سخته
                              دیگه راهی به ذهنم نمیرسه
                              یه سوال؟
                              امکان اتصال PC به دستگاه شما هست؟
                              اگه جواب مثبته اطلاعات رو به PC منتقل کنید و با vb یه برنامه بنویسید که اطلاعات رو دخیره کنه
                              متشکرم ازتون جناب مهندس، این که لطف کردید و برنامه رو چک کردید.
                              از پیشنهادهای عالی شما هم سپاسگذارم.
                              راجع به اتصال pc به دستگاه باید عرض کنم که، متاسفانه خیر، همچین امکانی در محیطی که این دستگاه مورد استفاده قرار میگیره، وجود نداره.

                              نوشته اصلی توسط moein2
                              عرض من به این شکل بود که گفتم شما به جای این که کل سروو رو خاموش و روشن کنید و این باعث هنگ کردن یا قاطی کردن سروو میشه
                              بیاید و موتور داخل سروو رو خاموش و روشن کنید . داخل سروو یه موتور دی سی معمولی وجود داره شما میتونید اون رو خاموش روشن کنید . یعنی همزمان که میکرو روشن میشه . به سروو دستور میفرسته . مدار داخل سروو هم از همون اول شروع به کار میکنه و تا آخر روشن میمونه اما موتور دی سی داخل میکرو اول کار خاموشه . و خودتون به موقع روشنش میکنید .این طوری دیگه هنگ و منگم خبری نیست و من تو اون پیغام تضمین دادم که این دیگه کار میکنه :دی . اگه کار نکرد پا میشم میام اون جا خودم درستش میکنم .تازه من هنوزم میگم هنگ یه قاطی نمیکنه چون خودم تست کرده بودم .
                              از لطف و حضور شما هم یک دنیا سپاسگذارم جناب مهندس.
                              منتها یک سوال!
                              میشه لطفا بیشتر راهنمائی بفرمائید که چطور میشه، موتور داخلی سروو رو جهت روشن و خاموش کردن، کنترل کرد؟

                              نوشته اصلی توسط moein2
                              ضمن این که شما یه کار دیگه هم میتونید بکنید . ببینید تو سرووها ی پیشرفته تر . علاوه بر این که شما به سروو ارسال میکنید . سروو هم به شما ارسال انجام میده . مثلا دما ، زاویه ، گشتاور و ... . شما میتونید از پتانسیومتر داخل سروو که وظیفه فید بک رو داره . یه فید بک هم بگیرید برای میکرو . یعنی میکرو دقیقا میدونه که در هر لحظه زاویه سروو ها کجاست . این راه حل که گفتم دیگه محشره . تازه پردازش میکرو هم بالا نمیره چون میکرو فقط در لحظه روشن شدن از رو سروو ها زاویه ها رو میخونه و دیگه باهاشون کاری نداره . و نیازی به خوندن لحظه به لحظه زاویه ها نیست چون مدار داخلی سروو این کار وبراتون انجام میده.
                              ok، بسیار جالب بود، منظورتون از این سرووها نوع داینامیکسل نیستند؟
                              راه اندازی و سیم بندی این سرووها با این تاور پروهایی که در حال کار با اون هستم، خیلی متفاوت هست؟

                              نوشته اصلی توسط moein2
                              من با استفاده از eeprom به دلایل مختلف مخالفم .
                              خدمت همه ی اساتید بزرگوار عرض کنم که نمیدونم چرا! ولی خود بنده هم نه اینکه با روشی که در حال کار با اون هستیم مشکل داشته باشم، منتها نمیدونم میتونم به eeprom اعتماد کنم یا خیر؟!
                              با توجه به صحبتهای دوستان مبنی بر روشهایی که پیشنهاد دادن، برای استفاده از حافظه ی خارجی، و قابلیتهای این نوع حافظه ها که تعداد دفعات خوندن و نوشتن در اونها حتی تا 10 میلیون بار هم تخمین زده شده، و ما بدترین حالت رو هم بخوایم در نظر بگیریم، که در اون این تعداد به 100 هزار بار هم برسه، با محاسباتی که با دوستان مکانیکی گروه داشتیم، این قابلیت امکان کار دستگاه رو تا 20 سال بهمون میدم و این خیلی عالیه.

                              امیدوارم دوستان محترم حساسیت زیاد بنده رو ببخشند ولی، با توجه به حساسیت بالای کار و مدت زمان 1 سالی که طول کشیده تا به این مرحله برسیم، بنده اگر به eeprom اعتماد کامل داشته باشم( خدای نکرده حمل بر جسارت به نظر اساتید نباشه، بگذارید به پای وسواس بنده)
                              بسیار برام بهتر هست که این سروویی که در حال کار با اون هستم رو رها نکنم و با همین ادامه بده.

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

                              با اینکه عرض کردم با توجه به این همه کش پیدا کردن این پروژه و اینکه ترجیح بنده بر ادامه با این سرووها هست، اما باز هم سر دوراهی هستم که در حال حاضر کدوم کار بهترین هست؟
                              از طرفی از لحاظ قیمت هم این 2 نوع سروو تا حدود زیادی با هم تفاوت دارند.

                              و یک موضوع دیگه که تازه یادم اومد، اون هم اینکه بنده همین سرووها رو حدود 3 هفته در محلی که بعدا قرار هست دستگاه قرار بگیره، و البته در بدترین شرایط و با وجود نویزهای فراوان، قرار دادم، و جالب بود که با قطع و وصل شدن تغذیه تا بیشتر از250 تا 300 بار، سرووها عملکرد درست داشتند و هنگ نکردند.

                              با این اوصاف نظر اساتید گرامی برای بنده ارجح هست.
                              زندگی برگ بودن در مسیر باد نیست
                              امتحان ریشه هاست
                              ریشه هم هرگز اسیر باد نیست
                              زندگی چون پیچک است
                              انتهایش میرسد پیش خدا!

                              دیدگاه


                                پاسخ : کمک در مورد سروو موتور

                                نوشته اصلی توسط pama

                                جناب کاخکی متاسفانه بنده دقیقا متوجه منظورتون از توضیح شماره ی 3 نشدم، اگر امکان داره، میشه لطفا کمی بیشتر بنده رو توجیح کنید...
                                خوب اگه منظورم از حالت اول و دوم رو فهمیده باشید تمومه .حالت سه استفاده از هردوی این راهها با همه یعنی از حافظه خارجی استفاده کنید و تعداد نوشتن در خونه های حافظه رو محدود کنید .اینطوری تقریبا بینهایت بار قابلیت نوشتن در حافظه رو پیدا میکنید.
                                درضمن دلیلی نداره که به eeprom اعتماد نکنید.مثلا برای ذخیره کانالهای تلویزیون و دستگاههای رسیور ،بایوس کامپیوتر و حتی کیلومترهای دیجیتال خودرو از حافظه های EEPROM استفاده میکنن.چند بار دیدید که برای این سیستمها مشکلی بوجود بیاد؟
                                پروردگارا: به من زیستنی عطا کن که در لحظه مرگ بر بی ثمری لحظه ای که برای زیستن گذشته است حسرت نخورم، و مردنی عطا کن که بر بیهودگیش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست میداری

                                دیدگاه

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