シリアル通信で信号を受信してモーターを回してみる
前回の続き。今度はPICでモーターを回してみます。
一番右上のICがRS232CのレベルとTTLレベルを変換してくれています。その下にあるのがPIC16F88です。
仕様
・シリアル通信で1〜126の数値を受信
・受信したデータでモーターの回転数(トルク?)を調整
・PWM制御でモーターを回す
PIC側の処理は案外すんなり作れた気がしています。
LIST p=16F88 ; list directive to define processor #INCLUDE <P16F88.INC> ; processor specific variable definitions __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF CBLOCK 0x20 ; Sample GPR variable registers allocated contiguously MYVAR1 ; User variable MYVAR2 ; User variable MYVAR3 ; User variable ENDC W_TEMP EQU 0x7D ; w register for context saving (ACCESS) STATUS_TEMP EQU 0x7E ; status used for context saving (ACCESS) PCLATH_TEMP EQU 0x7F ; variable used for context saving tmp equ 0x20 onreg equ 0x21 offreg equ 0x25 nigoro equ 0x24 down_onreg equ 0x22 down_offreg equ 0x23 DATAEE ORG 0x2100 DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3 RESET ORG 0x0000 ; processor reset vector PAGESEL START GOTO START ; go to beginning of program ISR ORG 0x0004 ; interrupt vector location ; Context saving for ISR MOVWF W_TEMP ; save off current W register contents MOVF STATUS,W ; move status register into W register MOVWF STATUS_TEMP ; save off contents of STATUS register MOVF PCLATH,W ; move pclath register into W register MOVWF PCLATH_TEMP ; save off contents of PCLATH register ; Restore context before returning from interrupt MOVF PCLATH_TEMP,W ; retrieve copy of PCLATH register MOVWF PCLATH ; restore pre-isr PCLATH register contents MOVF STATUS_TEMP,W ; retrieve copy of STATUS register MOVWF STATUS ; restore pre-isr STATUS register contents SWAPF W_TEMP,F SWAPF W_TEMP,W ; restore pre-isr W register contents RETFIE ; return from interrupt ;以下初期化処理 START ;bank0 bcf STATUS,RP0 bcf STATUS,RP1 clrf INTCON movlw b'10010000' movwf RCSTA ;bank1 bsf STATUS,RP0 bcf STATUS,RP1 movlw b'00100100' movwf TXSTA movlw d'129' movwf SPBRG clrf TRISA bsf TRISA , 4 clrf TRISB bsf TRISB,2 clrf ANSEL ;bank0 bcf STATUS,RP0 bcf STATUS,RP1 clrf PORTA clrf PORTB clrf tmp clrf onreg clrf offreg clrf down_onreg clrf down_offreg movlw d'255' movwf nigoro bsf PORTA,1 pre btfss PIR1,RCIF goto $-1 main_loop btfss PIR1, RCIF goto pwm_pre goto come come movfw RCREG movwf onreg sublw d'127' movwf offreg pwm_pre movfw onreg movwf down_onreg movfw offreg movwf down_offreg pwm decfsz down_onreg,f goto on goto off on bsf PORTB,3 goto pwm off decfsz down_offreg,f goto still_off goto main_loop still_off bcf PORTB,3 goto off END