با سلام خدمت همه ی دوستان و اساتید محترم.
خدمت دوستان و اساتید محترم عرض کنم که بنده با میکروی pic16f877a و کامپایلر pic basic pro کار میکنم، هدف کارم به حرکت در آوردن 7 تا سروو موتور به ترتیب زیر هست:

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

و هدف این هست که با هر فرکانس خاصی یه سری از سرووها در زاویه ی خاصی قرار بگیرن، فرکانس ورودی به مدار با دستور count portc.0, 800, f خونده میشه.

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

دوستان متاسفانه زمانم بسیار محدوده و سخت محتاج کمکها و لطف شمام، مطمئنم که هر کدوم از شما مشغله های مخصوص خودتون رو دارید با این حال بسیار ممنون میشم بنده رو از گیج زدن نجات بدید.

اینم برنامه:


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

f var word


ON INTERRUPT GOTO _interrupt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



TRISD=$00
PORTD=$00


TMR1L=0
TMR1H=0

CCP1CON=$0b

CCPR1H=$9c ;high byte of (40000)
CCPR1L=$40 ;low byte of (40000)

PIR1.2=0
PIE1.2=1

T1CON=$01 ;turn on timer1

INTCON.6=1 ;PEIE=1
INTCON.7=1 ;GIE=1 , enable global interrupt


trisC.5 = 1
portc.5 = 1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
again:
; main loop

f = 0
count portc.5, 800, f

;;;;;;;;;;;;;
if (f >= 20) and (f <= 25) then
servo1 = 0
end if
;;;;;;;;;;;;;
if (f >= 40) and (f <= 45 ) then
servo2 = 25
end if
;;;;;;;;;;;;;
if (f >= 65) and (f <= 70) then
servo3 = 75
end if
;;;;;;;;;;;;;
if (f >= 85) and (f <= 90) then
servo4 = 125
end if
;;;;;;;;;;;;;
if (f >= 100) and (f <= 105) then
servo5 = 175
end if
;;;;;;;;;;;;;
if (f >= 120) and (f <= 125) then
servo6 = 200
end if
;;;;;;;;;;;;;
if (f >= 130) and (f <= 135) then
servo7 = 251
endif
;;;;;;;;;;;;;

goto again
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


_interrupt: ; interrupt service

DISABLE INTERRUPT ;disable interrapts
if PIR1.2=1 then ; if CCP1IF then

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.2=0 ; clear CCP1IF
endif

RESUME ;return from interrapt
ENABLE INTERRUPT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

end

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

بسیار سپاسگذار هستم از دوستانی که لطف کنن و برنامه رو چک بکنن، به نظر شما ایراد کار از کجا میتونه باشه؟!