マイコンでの制御を行うにあたり、単純な単一機能を小さな回路で実現する。 そして、パラレルの単純なインターフェイスを使用して、各回路を接続する。
PIC は 12F629 を使用する。 インターフェイスとして、 GR0から GR2 までの 3bit あるいは、 GR0 から GR2 と GR5 の 4bit を用いる。 これらは数値の 0 から 7 あるいは 15 に対応している。
; sakamoto629 マクロ ver 1.0
; written by Naoshi SAKAMOTO sakamoto@c.dendai.ac.jp
;
;初期化
;
list p=12f629
#include p12f629.inc
variable env
env = _CPD_OFF
env &= _CP_OFF
env &= _BOREN_OFF
env &= _MCLRE_OFF
env &= _PWRTE_OFF
env &= _WDT_OFF
env &= _LVP_OFF
env &= _INTOSC_OSC_NOCLKOUT
__config env
cblock 0x20
endc
nolist
;
; timer0 TIME0 割り込みの設定、取り扱い
;
timer0_init macro psmode
cblock
savew
savest
endc
clrwdt
banksel OPTION_REG
movlw psmode
movwf OPTION_REG
banksel INTCON
bsf INTCON,T0IE
bcf INTCON,T0IF
bsf INTCON,GIE
endm
timer0_prg macro func
timer0
movwf savew
movf STATUS,0
movwf savest
btfss INTCON,T0IF
goto nottimer0
bcf INTCON,T0IF
call func
nottimer0
movf savest,0
movwf STATUS
movf savew,0
retfie
endm
;
; postscaler 呼び出しを間引く
;
postscaler_init macro rate
#define post_rate rate
cblock
post_count
endc
movlw post_rate
movwf post_count
endm
postscaler_prg macro func
postscaler
decfsz post_count,1
return
movlw post_rate
movwf post_count
call func
return
endm
;
; duty 呼び出されると二つのサブルーチンを特定の割合で交互に呼び出す
;
duty_init macro
cblock
duty_ratio,duty_period,duty_counter
endc
endm
duty_prg macro func_off, func_on
duty
movf duty_counter,0
subwf duty_ratio,0
btfsc STATUS,C
goto duty_on
call func_off
goto duty_end
duty_on
call func_on
duty_end
decfsz duty_counter,1
return
movf duty_period,0
movwf duty_counter
return
endm
set_rate_by_counter_prg macro
set_rate_by_counter
movf counter,0
call getduty
movwf duty_ratio
return
endm
getduty_prg macro
getduty
addwf PCL,1
startduty
; retlw d'128'
retlw d'64'
retlw d'32'
retlw d'16'
retlw d'8'
retlw d'4'
retlw d'2'
retlw d'1'
endduty
endm
porta_init macro
cblock
patterna
endc
movlw b'11111111'
movwf patterna
endm
porta_prg macro
porta_on
movf patterna,0
movwf PORTA
return
porta_off
clrf PORTA
return
endm
list