ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





  1. #71
    تاریخ عضویت
    2008/07/08
    بابلسر
    3,746
    109

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

    ای ول دایی جان
    ایدیت می کنم:
    if a = 40 then
    f = tmr0
    tmr0 = 0
    a = 0
    endif

    تنظیمات باید قبل حلقه اصلی برنامه انجام بشه. متغیر های لازم هم باید اونجا مقدار اولیه بگیرن تا وقتی وارد حلقه اصلی برنامه میشن باعث تغییر نابجا نشن. مثلا f=0 رو باید قبل main بنویسی. اگه همه متغیرها باید صفر بشن می تونی از یه دستور خاصی که توی بیسیک هست و من نمی دونم استفاده کنی.
    با عرض پوزش خدمت دایی های عزیزم تا اطلاع ثانوی به اینترنت دسترسی ندارم.
  2. #72
    تاریخ عضویت
    2011/05/01
    566
    5

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

    نقل قول نوشته اصلی توسط ahmadmn
    ای ول دایی جان
    ایدیت می کنم:
    if a = 40 then
    f = tmr0
    tmr0 = 0
    a = 0
    endif

    تنظیمات باید قبل حلقه اصلی برنامه انجام بشه. متغیر های لازم هم باید اونجا مقدار اولیه بگیرن تا وقتی وارد حلقه اصلی برنامه میشن باعث تغییر نابجا نشن. مثلا f=0 رو باید قبل main بنویسی. اگه همه متغیرها باید صفر بشن می تونی از یه دستور خاصی که توی بیسیک هست و من نمی دونم استفاده کنی.
    سلام جناب مهندس کوهستانی.
    و بسیار سپاسگذارم از اینکه هنوزم حوصله ی بنده رو دارید.
    ok،ممنونم از توضیحاتتون.
    منتها مهندس ما f رو هیچ جا صفر نمیکنیم فکر میکنم منظورتون متغیر a هست، درست عرض میکنم؟

    علاوه بر این هم ظاهرا بنده یک سوتی خیلی بزرگ دادم!
    اونم اینکه از تایمر صفر به عنوان کانتر برای فرکانس متراستفاده کردم در صورتی که جناب مهندس perfect قبلا از این تایمر برای کنترل سرووها استفاده کرده بودند.
    برای همین اگر تایمر 1 رو به عنوان کانتر به صورت زیر در نظر بگیرم درست هست؟

    f var word
    temp var byte
    t1con = %00000010
    temp = 0
    'و به قول فرمایش شما a = 0 هم باید اینجا بیاد، درست عرض میکنم؟!
    main :
    tmr1h = 0
    tmr1l = 0
    pir1.0 = 0
    t1con.0 = 1
    if a = 40 then
    t1con.0 = 0
    f.byte1 = tmr1h
    f.byte0 = tmr1l
    endif

    حالا اینجا ifها بیان و ادامه ی ماجرا...
    برنامه ی جدید رو تنظیم میکنم و در پست بعدی میارم...
    زندگی برگ بودن در مسیر باد نیست
    امتحان ریشه هاست
    ریشه هم هرگز اسیر باد نیست
    زندگی چون پیچک است
    انتهایش میرسد پیش خدا!
  3. #73
    تاریخ عضویت
    2011/01/21
    ساری - ایران
    150
    8

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

    از تایمر1 قبلاً در ماژول CCP1 جهت تولید وقفه در هر 20ms استفاده شده. با توجه به اینکه تنها تایمر آزاد فعلی تایمر2 است و این تایمر قابلیت کار به عنوان کانتر را ندارد به نظر میرسه تغییرات اساسی و فوری باید در برنامه ایجاد کنید. برای این کار دو انتخاب دارید:
    1- از تایمر1 همچنان جهت تولید وقفه در هر 20ms استفاده کنید و در روتین وقفه مربوطه هم به جای تایمر 0 از تایمر 2 استفاده کنید و از تایمر 0 به عنوان کانتر و جهت شمارش فرکانس استفاده کنید. ولی باید توجه داشت با توجه به 8بیتی بودن این تایمر در حالت عادی فقط قادر به اندازه گیری تا فرکانس 255Hz خواهید بود مگر اینکه منتظر پرچم OVF آن باشید یا از وقفه استفاده کنید که در این صورت کار کنترل سرووها در روتین وقفه رو سخت تر میکنه .
    2- راه دوم و بهتر اینه که از تایمر2 جهت ایجاد وقفه در هر 20ms استفاده کنید و از تایمر 1 هم در مد کانتر جهت شمارش فرکانس استفاده بشه که باتوجه به 16 بیتی بودنش تا فرکانس 65535hz قابل اندازه گیری خواهد بود. و تایمر0 هم برای همون منظور قبلی در روتین وقفه 20ms استفاده بشه.
  4. #74
    تاریخ عضویت
    2011/05/01
    566
    5

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

    سلام.
    بسیار متشکر و سپاسگذارم از لطف و توجه و راهنمائیهای خوبتون جناب perfect.
    تاخیر بنده رو ببخشید که دلیل بر قصور بنده نیست و 2 روزی سرور سایت قطع بود.

    نقل قول نوشته اصلی توسط Perfect
    از تایمر1 قبلاً در ماژول CCP1 جهت تولید وقفه در هر 20ms استفاده شده. با توجه به اینکه تنها تایمر آزاد فعلی تایمر2 است و این تایمر قابلیت کار به عنوان کانتر را ندارد به نظر میرسه تغییرات اساسی و فوری باید در برنامه ایجاد کنید. برای این کار دو انتخاب دارید:
    بله، کاملا درست میفرمائید نباید مادامی که از تایمر 0 و 1 در کنترل سرووها استفاده میشه از اون برای فرکانس متری هم استفاده کنم و این اشتباه بنده بود.
    نقل قول نوشته اصلی توسط Perfect
    1- از تایمر1 همچنان جهت تولید وقفه در هر 20ms استفاده کنید و در روتین وقفه مربوطه هم به جای تایمر 0 از تایمر 2 استفاده کنید و از تایمر 0 به عنوان کانتر و جهت شمارش فرکانس استفاده کنید. ولی باید توجه داشت با توجه به 8بیتی بودن این تایمر در حالت عادی فقط قادر به اندازه گیری تا فرکانس 255Hz خواهید بود مگر اینکه منتظر پرچم OVF آن باشید یا از وقفه استفاده کنید که در این صورت کار کنترل سرووها در روتین وقفه رو سخت تر میکنه .

    2- راه دوم و بهتر اینه که از تایمر2 جهت ایجاد وقفه در هر 20ms استفاده کنید و از تایمر 1 هم در مد کانتر جهت شمارش فرکانس استفاده بشه که باتوجه به 16 بیتی بودنش تا فرکانس 65535hz قابل اندازه گیری خواهد بود. و تایمر0 هم برای همون منظور قبلی در روتین وقفه 20ms استفاده بشه.
    بسیار متشکرم از توضیحات دقیقتون.
    بله جناب مهندس بنده هم برای ایجاد تغییرات با روش دوم موافقترم .
    از لحاظ فرکانس هم باید عرض کنم که فرکانس ما تا 135 هرتز بیشتر نیست منتها مدام در حال تغییر هست در واقع در مدت زمان فرضا 4 یا 5 ساعتی که دستگاه مورد نظر ما در حال کار کردن هست این فرکانس در این بازه 0 تا 130 هرتز که عرض کردم تغییر میکنه و نوسان خواهد داشت، و ما باید طبق فرکانسی که در هر زمان میخونیم برای حرکت سرووها تصمیم بگیریم یا بگیم در هر فرکانس خاصی یه سری از سرووها در زاویه ی خاص خودشون باشند که میشه همون شرطهامون.
    این مساله که مشکلی ایجاد نمیکنه و تایمر 16 بیتیه 1 برای این کار مناسبه جناب مهندس درسته؟!

    ولی راجع به نحوه ی استفاده از تایمر2 جهت ایجاد وقفه در هر 20 میلی ثانیه یه سری ابهامات برام وجود داره:
    یکی اینکه اینی که شما میفرمائید اگر تایمر 2 بیاد برای کنترل سروو، اونوقت 20 میلی ثانیمون خیلی دقیق نمیشه،میخوام بدونم این زمان خیلی به هم میریزه یا اینکه خیر طوری نیست که روی عملکرد سرووها تاثیر بسزایی بگذاره؟

    از طرفی اگر این 20 میلی ثانیه به هم بریزه تایم 800 میلی ثانیه هم خراب میشه!!

    و حالا اگر به هم ریختن این زمان خیلی محسوس نباشه برای این که تایمر 2 برای کنترل سرووها و تایمر 1 برای شمردن فرکانس استفاده بشه در این صورت باید در تنظیمات اول برنامه این تغییرات داده بشه، درست عرض میکنم؟!
    به جای TMR1L=0 و TMR1H=0 از TMR2=0 استفاده بشه.
    و به جای T1CON=$01 از T2CON.2=1 استفاده بشه.
    ولی نمیدونم رجیستر CCP1CON باید به چه نحوی تنظیم بشه؟ و آیا CCPR1H , CCPR1L همونطور مثل قبل باید مقدار دهی بشن؟

    مطمئنم جناب perfect که شما و جناب کوهستانی با توجه به مشغله های فراوانی که دارید با حوصله پاسخ گوی سوالات پیاپی بنده هستید از این بابت ازتون بسیار بسیار متشکرم .
    زندگی برگ بودن در مسیر باد نیست
    امتحان ریشه هاست
    ریشه هم هرگز اسیر باد نیست
    زندگی چون پیچک است
    انتهایش میرسد پیش خدا!
  5. #75
    تاریخ عضویت
    2011/01/21
    ساری - ایران
    150
    8

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


    سلام. بعد از کمی بررسی متوجه شدم تایمر 2 هم میتونه به طور دقیق همون سیگنال وقفه در هر 20ms رو تولید کنه و از این نظر مشکلی نیست.
    دستورات مورد نیاز برای تولید وقفه توسط تایمر2 در هر 20ms :
    کد:
    PIR1.1=0 ; TMR2IF=0
    TMR2=0
    PR2=249
    PIE1.1=1 ; Enable timer2 interrupt
    T2CON=$4F
    بیتهای فعال کننده سراسری وقفه یعنی GIE و PEIE قبلاً در برنامه set شدن. در روتین وقفه بجای چک کردن بیت پرچم وقف ماژول CCP1 ( یعنی PIR1.2 ) باید بیت پرچم تایمر2 (یعنی TMR2IF ) رو چک کنید. ضمناً دستورات مربوط به پیکره بندی این ماژول رو هم از برنامه حذف کنید. اگر وقت پیدا کردم برنامه رو تغییر میدم و در اختیارتون میزارم. تا اون موقع ببینید خودتون میتونید حلش کنید؟


    اضافه شده در تاریخ :
    در برنامه زیر تایمر 1 در مد شمارنده پیکره بندی شده که پالس ورودی باید به پین RC0 اعمال بشه و تایمر 2 هم در هر 20ms یک وقفه ایجاد میکنه. البته برنامه تست نشده. خودتون زحمت تست رو بکشید:

    کد:
    '****************************************************************
    '* Name  : UNTITLED.BAS                   *
    '* Author : [select VIEW...EDITOR OPTIONS]          *
    '* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
    '*     : All rights reserved.
    * '* Date : 10/7/2011 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** DEFINE OSC 8 servo1 var byte servo2 var byte servo3 var byte servo4 var byte servo5 var byte servo6 var byte servo7 var byte a var byte F_in var word ON INTERRUPT GOTO _interrupt ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TRISD=$00 PORTD=$00 ;;;;;;;;; TMR1L=0 TMR1H=0 T1CON=$03 ;turn on timer1 in counter mode ;;;;;;;;; PIR1.1=0 ; TMR2IF=0 TMR2=0 PR2=249 PIE1.1=1 ; Enable timer2 interrupt T2CON=$4F ;;;;;;;;; INTCON.6=1 ;PEIE=1 INTCON.7=1 ;GIE=1 , enable global interrupt ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; again: ; main loop ;;;;;;;;; if a = 40 then F_in=TMR1H F_in=F_in << 8 F_in=F_in | TMR1L a=0 TMR1L=0 TMR1H=0 endif ;;;;;;;;; servo1=0 servo2=25 servo3=50 servo4=125 servo5=175 servo6=200 servo7=251 goto again ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; _interrupt: ; interrupt service DISABLE INTERRUPT ;disable interrapts if PIR1.1=1 then ; if TMR2IF=1 then a = a + 1 OPTION_REG = OPTION_REG & $c0 OPTION_REG = OPTION_REG | $02 PORTD = $01 PAUSEUS 990 INTCON.2=0 TMR0 = 255-servo1 while INTCON.2=0 wend PORTD=$00 ;;;;;;;;;;;;;;;;;;;;;;;;;; PORTD=$02; PAUSEUS 990 INTCON.2=0 TMR0 = 255-servo2 while INTCON.2=0 wend PORTD=$00 ;;;;;;;;;;;;;;;;;;;;;;;;;; PORTD=$04; PAUSEUS 990 INTCON.2=0 TMR0 = 255-servo3 while INTCON.2=0 wend PORTD=$00 ;;;;;;;;;;;;;;;;;;;;;;;;;; PORTD=$08; PAUSEUS 990 INTCON.2=0 TMR0 = 255-servo4 while INTCON.2=0 wend PORTD=$00 ;;;;;;;;;;;;;;;;;;;;;;;;;; PORTD=$10 PAUSEUS 990 INTCON.2=0 TMR0 = 255-servo5 while INTCON.2=0 wend PORTD=$00 ;;;;;;;;;;;;;;;;;;;;;;;;;; PORTD=$20 PAUSEUS 990 INTCON.2=0 TMR0 = 255-servo6 while INTCON.2=0 wend PORTD=$00 ;;;;;;;;;;;;;;;;;;;;;;;;;; PORTD=$40 PAUSEUS 990 INTCON.2=0 TMR0 = 255-servo7 while INTCON.2=0 wend PORTD=$00 ;;;;;;;;;;;;;;;;;;;;;;;;;; PIR1.1=0 ; clear TMR2IF endif RESUME ;return from interrapt ENABLE INTERRUPT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; end
    ضمناً در این برنامه فرکانس در متغیر F_in که یک متغیر 16 بیتی هست قرار میگیره.
  6. #76
    تاریخ عضویت
    2011/05/01
    566
    5

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

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

    فقط جناب مهندس منظور شما از 2 خط F_in=F_in << 8
    F_in=F_in | TMR1L
    در فرکانس متری این بوده که مقدار F_in رو که در TMR1H هست 8 بیت شیفت بدیم به چپ و بعد در TMR1L بریزیم، درسته؟!

    که میتونه معادل دستور زیر باشه
    F_in.byte1 = TMR1H
    F_in.byte0 = TMR1L
    درست عرض میکنم؟!

    و چند تا سوال دیگه :redface:
    یکی اینکه آیا لازمه اول برنامه پرچم وقفه ی سر ریز تایمر 1 بازنشانده بشه؟(PIR1.0 = 0)
    و trisc.0 = 1 هم باید آورده بشه؟

    و دومی هم اینه که محل آوردن ifها به این صورت درست هست؟!


    again:
    ; main loop

    ;;;;;;;;;

    if a = 40 then

    F_in=TMR1H
    F_in=F_in << 8
    F_in=F_in | TMR1L

    a=0
    TMR1L=0
    TMR1H=0
    endif


    if f >= 20 and f <= 25 then
    servo1 = 0
    endif

    if f >= 35 and f <= 40 then
    servo2 = 25
    endif

    .
    .
    .
    تا سرووی هفتم
    goto again

    چشم، همین امروز تستش میکنم.

    زندگی برگ بودن در مسیر باد نیست
    امتحان ریشه هاست
    ریشه هم هرگز اسیر باد نیست
    زندگی چون پیچک است
    انتهایش میرسد پیش خدا!
  7. #77
    تاریخ عضویت
    2011/01/21
    ساری - ایران
    150
    8

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

    نقل قول نوشته اصلی توسط pama
    فقط جناب مهندس منظور شما از 2 خط F_in=F_in << 8
    F_in=F_in | TMR1L
    در فرکانس متری این بوده که مقدار F_in رو که در TMR1H هست 8 بیت شیفت بدیم به چپ و بعد در TMR1L بریزیم، درسته؟!

    که میتونه معادل دستور زیر باشه
    F_in.byte1 = TMR1H
    F_in.byte0 = TMR1L
    درست عرض میکنم؟!
    اشتباه نکنید ما در تایمر چیزی نمینویسیم. ابتدا بایت بالایی تایمر که پر ارزش تره رو میخونیم و در متغیر F_in که ازنوع word و 16 بیتی هست قرار میدیم. توجه کنید که در این مرحله ابتدا دیتا در بایت کم ارزش متغیر ریخته شده و برای قرار دادن اون در بایت پرارزش اون رو 8 بیت به سمت چپ شیفت میدیم. سپس با عمل OR بیتی متغیر با بایت کم ارزش تایمر (یعنی TMR1L ) این بایت هم به متغیر F_in اضافه میشه که نتیجه کل این عمل مقدار16 بیتی تایمر رو در متغیر 16 بیتی F_in قرار میده.
    دستورات معادلی که نوشتید همین عمل رو انجام میده.

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

    و چند تا سوال دیگه :redface:
    یکی اینکه آیا لازمه اول برنامه پرچم وقفه ی سر ریز تایمر 1 بازنشانده بشه؟(PIR1.0 = 0)
    و trisc.0 = 1 هم باید آورده بشه؟
    در مورد پرچم چون در زمان ریست و آغاز به کار این پرچم ها ریست میشن نیازی نیست ولی اگر هم پاکش کنید اشکالی نداره.
    در مورد TRIS هم بله باید پین مربوطه رو قبلاَ به صورت ورودی پیکره بندی کنید.

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

    و دومی هم اینه که محل آوردن ifها به این صورت درست هست؟!
    بله، درسته.
  8. #78
    تاریخ عضویت
    2011/05/01
    566
    5

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

    سلام جناب مهندس.
    بسیار ممنون از اینکه باز هم با حوصله پاسخ گو هستید.
    برنامه رو با شرط چک کردم روی مدار، منتها متاسفانه نشد :sad:
    حدود 4 ساعت در حال کلنجار کردن با برنامه و سخت افزارش بودم منتها بازم وقتی تغذیه رو میدم سرووها با شرطمون عملکرد نامناسب دارند.
    منبع فرکانسم هم برای تست تو خونه مدار آیسی 555 هست.
    تصمیم گرفتم فردا فرکانس خروجی مدار 555 رو با برنامه ی فرکانس متری که شما در برنامه ی اصلی زحمت کشیدید، با یه lcd بخونم، شاید فرکانسی که بهش اعمال میشه ایراد داشته باشه.
    به نظر شما راه حل دیگه ای برای عیب یابی دارم؟!
    مدار سرووهام درسته، چون مدار رو با برنامه ی 7 سروو بدون شرط چک کردم، جواب درست داد...
    زندگی برگ بودن در مسیر باد نیست
    امتحان ریشه هاست
    ریشه هم هرگز اسیر باد نیست
    زندگی چون پیچک است
    انتهایش میرسد پیش خدا!
  9. #79
    تاریخ عضویت
    2011/01/21
    ساری - ایران
    150
    8

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

    برنامتونو اینجا بگذارید.
    ضمناً با توجه به اینکه هر 800ms پالها رو میشمارید فرکانس خوانده شده با فرکانس اصلی تفاوت داره.

    بنده برنامه زیر رو در شبیه ساز تست کردم و به طور دقیق جواب داد. شما هم در عمل تست کنید. فرکانس خونده شده هم به صورت باینری در PORTB قابل مشاهده است. باچند تا Led میتونید فرکانس رو ببینید. ملاحظات مربوط به پین RB3 رو هم در نظر داشته باشید.



    کد:
    '****************************************************************
    '* Name  : UNTITLED.BAS                   *
    '* Author : [select VIEW...EDITOR OPTIONS]          *
    '* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
    '*     : All Rights Reserved                *
    '* Date  : 10/7/2011                     *
    '* Version : 1.0                        *
    '* Notes  :                          *
    '*     :                          *
    '****************************************************************
    
     DEFINE OSC 8
     
    servo1 var byte 
    servo2 var byte 
    servo3 var byte 
    servo4 var byte 
    servo5 var byte 
    servo6 var byte 
    servo7 var byte
    a var byte
    F var word
    
    ON INTERRUPT GOTO _interrupt
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
     
       TRISD=$00
       PORTD=$00
       TRISB=0
       TRISC.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 ; Enable timer2 interrupt
     T2CON=$4F
    ;;;;;;;;;
    
      INTCON.6=1  ;PEIE=1
      INTCON.7=1  ;GIE=1 , enable global interrupt
      
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
        
    
    
    again:
          ; main loop
     
    ;;;;;;;;;
       
     ; servo1=0
     ; servo2=25
     ; servo3=50
     ; servo4=125
     ; servo5=175
     ; servo6=200
     ; servo7=251 
     
     
      
    if f >= 20 and f <= 25 then
    servo1 = 0
    endif
    
    if f >= 26 and f <= 40 then
    servo2 = 25
    endif
    
    if f >= 41 and f <= 60 then
    servo3 = 75
    endif
    
    if f >= 61 and f <= 80 then
    servo4 = 125
    endif
    
    if f >= 81 and f <= 100 then
    servo5 = 175
    endif
    
    if f >= 101 and f <= 115 then
    servo6 = 200
    endif
    
    if f >= 116 and f <= 130 then
    servo7 = 250
    endif
     
    goto again
    
    
    
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    _interrupt:            ; interrupt service
    
         DISABLE INTERRUPT    ;disable interrapts
    
        if PIR1.1=1 then     ; if TMR2IF=1 then
         
         a=a+1
    ;;;;;;;;;;;;;;;;;;;     
     if a >= 40 then
     F=TMR1H
     F=F << 8
     F=F | TMR1L
     a=0
     TMR1L=0
     TMR1H=0
     PORTB=f
     endif
     ;;;;;;;;;;;;;;;;;;;      
    
         OPTION_REG = OPTION_REG & $c0 
         OPTION_REG = OPTION_REG | $02 
    
         PORTD = $01
         PAUSEUS 990 
         INTCON.2=0
         TMR0 = 255-servo1
         while INTCON.2=0
         wend   
         PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;
          PORTD=$02;
          PAUSEUS 990 
          INTCON.2=0
          TMR0 = 255-servo2 
          while INTCON.2=0
          wend
           PORTD=$00    
         ;;;;;;;;;;;;;;;;;;;;;;;;;; 
          PORTD=$04;
          PAUSEUS 990 
          INTCON.2=0
          TMR0 = 255-servo3
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;  
          PORTD=$08;
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo4 
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;  
          PORTD=$10
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo5
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;; 
          PORTD=$20
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo6 
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;  
          PORTD=$40
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo7
          while INTCON.2=0
          wend
          PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;; 
          PIR1.1=0  ; clear TMR2IF
          endif 
          
          RESUME     ;return from interrapt 
          ENABLE INTERRUPT 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    end
  10. #80
    تاریخ عضویت
    2011/05/01
    566
    5

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

    متشکرم جناب مهندس از لطفتون.
    برنامه ای که دیشب تست کردم:

    کد:
     DEFINE OSC 8
    @ DEVICE pic16f877a,WDT_OFF ,PWRT_ON ,PROTECT_OFF ,LVP_ON ,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
    F_in var word
    
    ON INTERRUPT GOTO _interrupt
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
       TRISC.0 = 1
       TRISD=$00
       PORTD=$00
    
    ;;;;;;;;;       
     TMR1L=0
     TMR1H=0
     T1CON=$03 ;turn on timer1 in counter mode
    ;;;;;;;;;
     PIR1.1=0 ; TMR2IF=0
     TMR2=0
     PR2=249
     PIE1.1=1 ; Enable timer2 interrupt
     T2CON=$4F
    ;;;;;;;;;
    
      INTCON.6=1  ;PEIE=1
      INTCON.7=1  ;GIE=1 , enable global interrupt
      
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
        
    
    
    again:
          ; main loop
      
    ;;;;;;;;;
    
    if a = 40 then
    
    F_in=TMR1H
    F_in=F_in << 8
    F_in=F_in | TMR1L
    
     a=0
     TMR1L=0
     TMR1H=0
    endif
    
    ;;;;;;;;;
    if (f_in >= 20) and (f_in <= 25) then 
    servo1 = 0
    endif
    
    if (f_in >= 35) and (f_in <= 40) then 
    servo2 = 25
    endif
    
    if (f_in >= 55) and (f_in <= 60) then 
    servo3 = 75
    endif
    
    if (f_in >= 75) and (f_in <= 80) then 
    servo4 = 125
    endif
    
    if (f_in >= 95) and (f_in <= 100) then 
    servo5 = 175
    endif
    
    if (f_in >= 110) and (f_in <= 115) then 
    servo6 = 200
    endif
    
    if (f_in >= 125) and (f_in <= 130) then 
    servo7 = 250
    endif   
       
    goto again
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    _interrupt:            ; interrupt service
    
         DISABLE INTERRUPT    ;disable interrapts
    
        if PIR1.1=1 then     ; if TMR2IF=1 then
        
           a = a + 1
       
         OPTION_REG = OPTION_REG & $c0 
         OPTION_REG = OPTION_REG | $02 
    
         PORTD = $01
         PAUSEUS 990 
         INTCON.2=0
         TMR0 = 255-servo1
         while INTCON.2=0
         wend   
         PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;
          PORTD=$02;
          PAUSEUS 990 
          INTCON.2=0
          TMR0 = 255-servo2 
          while INTCON.2=0
          wend
           PORTD=$00    
         ;;;;;;;;;;;;;;;;;;;;;;;;;; 
          PORTD=$04;
          PAUSEUS 990 
          INTCON.2=0
          TMR0 = 255-servo3
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;  
          PORTD=$08;
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo4 
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;  
          PORTD=$10
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo5
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;; 
          PORTD=$20
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo6 
          while INTCON.2=0
          wend
           PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;;  
          PORTD=$40
          PAUSEUS 990  
          INTCON.2=0
          TMR0 = 255-servo7
          while INTCON.2=0
          wend
          PORTD=$00
         ;;;;;;;;;;;;;;;;;;;;;;;;;; 
          PIR1.1=0  ; clear TMR2IF
          endif 
          
          RESUME     ;return from interrapt 
          ENABLE INTERRUPT 
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    end
    سوتی های عظمای دیگه اینکه من سرووها رو اول کار مقدار دهی نکردم! (servo1=0 ; servo2=25 ; servo3=50 ; servo4=125 ; servo5=175 ; servo6=200 ; servo7=251 )
    و TRISB=0 رو نگذاشتم، البته LVP رو on کردم اول برنامه، حالا با این حساب RB3 یا همون PGM رو باید زمین کنم؟ و TRISB=0 هم در برنامه به قوت خودش باید باقی باشه؟
    البته خط مربوط به تنظیم فیوزبیتها رو طبق فرمایشات قبلی شما اول برنامه آوردم با این تفاوت که BOD رو هم OFF کردم، این خط درست هست؟
    همین الان میرم با برنامه ی شما تست میکنم آقا.....
    زندگی برگ بودن در مسیر باد نیست
    امتحان ریشه هاست
    ریشه هم هرگز اسیر باد نیست
    زندگی چون پیچک است
    انتهایش میرسد پیش خدا!
صفحه 8 از 24 نخست ... 45678910111218 ... آخرین
نمایش نتایج: از 71 به 80 از 240

موضوعات مشابه

  1. کمک در مورد انتخاب سروو موتور
    توسط akazemin در انجمن ترانسفورماتورها و ماشين هاي الکتريکی
    پاسخ: 21
    آخرين نوشته: 2015/06/22, 11:20
  2. سوال در مورد برد داخلی سروو موتور
    توسط ariaericson در انجمن میکروکنترلرهای AVR
    پاسخ: 12
    آخرين نوشته: 2012/11/04, 10:22
  3. سوال در مورد برد داخلی سروو موتور
    توسط ariaericson در انجمن رباتیک و مکاترونیک
    پاسخ: 10
    آخرين نوشته: 2012/10/20, 00:42
  4. کمک در مورد راه اندازی یک سروو موتور DC
    توسط imijoon در انجمن رباتیک و مکاترونیک
    پاسخ: 3
    آخرين نوشته: 2012/06/20, 13:56
  5. ساختمان داخلی سه نوع موتور (موتور dc و سروو موتور و استپ موتور)*انفجاری*
    توسط فرشاد اکرمی در انجمن ترانسفورماتورها و ماشين هاي الکتريکی
    پاسخ: 9
    آخرين نوشته: 2010/10/07, 14:25

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •