متشکرم جناب مهندس از لطفتون.
برنامه ای که دیشب تست کردم:
کد:
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 کردم، این خط درست هست؟
همین الان میرم با برنامه ی شما تست میکنم آقا.....