Målet är att kunna mäta hur lång en puls är från RC mottagaren till servo utgången. Ska koppla in en pic i stället för servo och den ska så småningom kunna tända på en raket. Problemet är att jag har svårt att hitta info på hur jag ska räkna, använder den interna klockan i 12F675 (4mhz).
Jag tror(ska kontroll mäta senare) att RCmojängen skickar ut pulser som är 0,5mS för ena ändläget och 1mS för mitten(neutral) och 2mS för det andra ändläget.
När det kommer en puls som är mellan ca 0,4-0,6mS sätter man en port.
När det kommer en puls som är mellan ca 1,9-2,1mS sätter man en annan port.
1. Hur lång tid tar en klockcykel?
2. Vad tycker ni om koden är jag på rätt spår?
3. Hur ska jag skriva koden om jag vill kolla om mätvärdet passar in i ett visst intervall typ 0,4-0,6mS ?
Kod: Markera allt
;****************************************************************
List p=12f675
;****************************************************************
include <p12f675.inc>
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON &_PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
cblock 0x21
tid
w_temp
s_temp
endc
;Mclre_on => GP3 = mclr, och ICSP funkar...
;****************************************************************
org 0x00 ;Start programmet
goto init
;****************************************************************
org 0x004 ;Interupts
movwf w_temp ;wreg & status sparas utifall man ändrar i dom under interuptet
swapf STATUS,w
movwf s_temp
;kod
banksel TRISIO ;bank1
btfss INTCON, INTF ;om INTF = 1. dvs GP2 interuptad hoppa över "hopp"
goto hopp
btfss Option_reg,intedg ;om den är fallande gå dit annars hoppa över.
call fall
btfsc Option_reg,intedg ;om den är stigande gå dit annars hoppa över.
call rise
hopp
banksel gpio ;bank0
swapf s_temp, W ;Återställer Status & W registren..
movwf STATUS
swapf w_temp, F
swapf w_temp, W
retfie ; INTCON,GIE = 1 och går tillbaka till programet
;****************************************************************
init
banksel trisio ;Öppnar Bank 1
movlw b'00000000'
movwf ansel ;Alla portar är digitala(ans0-3=bit0-3)
movlw b'00000100'
movwf trisio ;Alla portar är utgångar utom gp2 (& gp3..)
bcf option_reg,t0cs ;Internal TMR klock
bsf option_reg,psa ;ingen precsale..
bsf option_reg,intedg ;Interupt på stigande flank
bsf intcon,inte ;GP2 Interupt ON
bsf intcon,gie ;Global Interupt ON
banksel gpio ;Öppnar Bank 0
clrf gpio ;init GPIO
bcf adcon0,adon ;A/D omvandlare avstängd.
movlw b'00000111'
movwf cmcon ;Comparator OFF
;****************************************************************
clrw
movwf tid
movwf w_temp
movwf s_temp
start
goto start
;****************************************************************
rise ;Subrutin för stigande flank på GP2
bcf INTCON,INTF ;
banksel trisio ;Bank1
bcf option_reg,intedg ;Ändrar så att interupt sker på fallande flank
banksel gpio ;Bank0
movlw h'15' ;
movwf tmr0 ;startar tmr0, 13(hex) instruktioner hit från gotostart +2 för skrivningen till TMR0
bsf gpio,4 ;Tänder lysdiod
return
;****************************************************************
fall ;Subrutin för fallande flank på GP2
bcf INTCON,INTF ;
banksel trisio ;Bank1
bsf option_reg,intedg ;Ändrar så att interupt sker på stigande flank
banksel gpio ;Bank0
movf tmr0,w ;sparar tiden hit.
movwf tid
;ska ta bort 10(hex) instruktioner vilket det tar från gotostart hit(dvs när pulsen faller)
movlw h'10'
subwf tid,f
bcf gpio,4 ;Släcker lysdiod
return
end