با سلام خدمت همه ی دوستان و اساتید محترم.
خدمت دوستان و اساتید محترم عرض کنم که بنده با میکروی 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 تا سروو هر کدوم تو یه موقعیت قرار میگیرن، اما وقتی شرط اضافه میشه، و رو مدار تستش میکنم به محض تغذیه دادن به سرووها، اونا همزمان شروع میکنن به حرکت پی در پی بیخود به چپ و راست!!!!
بسیار سپاسگذار هستم از دوستانی که لطف کنن و برنامه رو چک بکنن، به نظر شما ایراد کار از کجا میتونه باشه؟!
خدمت دوستان و اساتید محترم عرض کنم که بنده با میکروی 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 تا سروو هر کدوم تو یه موقعیت قرار میگیرن، اما وقتی شرط اضافه میشه، و رو مدار تستش میکنم به محض تغذیه دادن به سرووها، اونا همزمان شروع میکنن به حرکت پی در پی بیخود به چپ و راست!!!!
بسیار سپاسگذار هستم از دوستانی که لطف کنن و برنامه رو چک بکنن، به نظر شما ایراد کار از کجا میتونه باشه؟!