10. データ・シグナル・モジュレータ機能(DSM)について(18xx)
 PIC16F18xxに新規に追加された機能にデータ・シグナル・モジュレータ(DSM)機能があります。 この機能は赤外線通信や音源に利用でき、外付け部品なしで簡単に
2つの信号をミックスして出力することができます。
 ここではEUSART機能からのシリアル・データと38KHzのキャリア信号をミックスして赤外線送信装置を試作してみました。
 16F18xx内で使用する機能はデータ・シグナル・モジュレータ(DSM)機能の他に以下の機能を利用し、MOUT端子から下図のようなパルスを発生させ、赤外線LED
を駆動します。
 @シリアル・データ発生 : EUSART機能
 Aキャリア信号発生 : CCP(PWM)機能、タイマ2機能
 赤外線送信装置の参考回路図を以下に示します。
10.1 コーディング例
 上図の赤外線送信機を16F1823を使ってコーディングしたものです。(他の16F18xxでも動作します。)  データ・シグナル・モジュレータ(DSM)機能
 評価の為、回路もプログラムも出来るだけシンプルにしました。
 以下のプログラムはSW2で設定したデータ(0−9)をSW1を押している間、0.5秒間隔で繰り返し2400BPSで送信するものです。
 DSM機能を動かす為の初期設定はinitializeルーチンですべて行っており、割り込みは利用していません。
;
;******************************************************************
;  38KHz IR Transmitter          Rev.01 (programed 2010/12/23)
;******************************************************************
LIST P=PIC16F1823
#INCLUDE "P16F1823.INC"
   __CONFIG    _CONFIG1, _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _CP_ON & _PWRTE_OFF & _CPD_ON & _MCLRE_OFF  
   __CONFIG    _CONFIG2, _LVP_OFF &_STVREN_ON &_BORV_19 &_PLLEN_ON
;
; PIC16F1823  32 MHz internal
;******************************************************************
; Pin assignment (14 pins)
; 
; (PORT-A)
;
; RA5<pin  2>:  OUT (not used)
; RA4<pin  3>:  IN P-SW  
;
; RA3<pin  4>:  IN (not used) 
; RA2<pin 11>:  OUT (not used)  
; RA1<pin 12>:  OUT LED(R)
; RA0<pin 13>:  OUT TX (not used) 
;
;   
; (PORT-C)
;
; RC5<pin  5>:  OUT   CCP1 (not used) 
; RC4<pin  6>:  OUT MDOUT IR-OUT  
;
; RC3<pin  7>:  IN SW-3
; RC2<pin  8>:  IN SW-2   
; RC1<pin  9>:  IN SW-1
; RC0<pin 10>:  IN    SW-0
;
;******************************************************************
; difine save area
;*****************************************
; (PORT-A)
PSW EQU 4
LEDR EQU 1
IROUT EQU 0
; (PORT-C)
RSW3 EQU 3
RSW2 EQU 2
RSW1 EQU 1
RSW0 EQU 0
;
CNT1 EQU 020H
CNT2 EQU 021H
CNT21 EQU 022H
CNT3 EQU 023H
CNT4 EQU 024H
;
REVD EQU 025H
;
DATA1H EQU 032H
DATA1L EQU 033H
;
CFLAG EQU 050H ;internal control bits
;
;
;******************************************************************
;  Jumping Vector
;********************************
;
ORG 0
GOTO INIT
;******************************************************************
四角形吹き出し: 割り込みは使っていません
; Interrupt Handler
;********************************
;
ORG 4
INTPROC
CLRF BSR ;select bank 0
CLRF PCLATH ;select page 0
;Decode Interrupt element 
BTFSC PIR1,TMR2IF ;check TMR2 int.flag (8.2 ms interval)  
GOTO TMR2PROC ;
BTFSC PIR1,TMR1IF ;check TMR1 int.flag 
GOTO TMR1PROC ;                                                     
RETFIE ;
;
;********************************
;Timer1 process routine   (DUMMY)   
;******************************** 
;
TMR1PROC
BCF PIR1,TMR1IF ;clear TMR1 flag for next
RETFIE ;
;
;******************************** 
;Timer2 (8.2 ms interval) process routine
;********************************                                          
;Count down Duration timer( 0-2.1 sec)
TMR2PROC
BCF PIR1,TMR2IF ;clear TMR2 flag for next
RETFIE ;
;           
;******************************************************************
; Initialize
;******************************************
INIT
BSF BSR,BSR0 ;select bank1  
MOVLW 070H ;internal clock 32 MHz
MOVWF OSCCON        ;
;initialize PORTs
MOVLW 018H ;init ports
    MOVWF TRISA ;
MOVLW 0FH ;
MOVWF TRISC ;
BSF BSR,BSR1 ;select bank3
CLRF ANSELA ;set all digital I/O
CLRF ANSELC ;
;initialize EUSART for DSM
MOVLW 024H ;async,8bit,no-parity
MOVWF    TXSTA ;
MOVLW 08H ;set BRG16
MOVWF BAUDCON ;
MOVLW .13 ;set baudrate value 3332 (2400 bps)
MOVWF SPBRGH ;
MOVLW .4 ;
MOVWF SPBRGL ;
MOVLW   080H ;start send (inhibit recieve)
MOVWF RCSTA ;
;initialize PORTs
BCF BSR,BSR0 ;select bank2
四角形吹き出し: TXピンをRC4からRA0に変更
BSF APFCON,TXCKSEL ;change TX pin to RA0
MOVLW .4 ;select bank4
MOVWF BSR ;
BSF WPUA,WPUA4 ;pull up (RA4)
MOVLW 0FH ;pull up (RC0-RC3)
MOVWF WPUC ;
MOVLW .1 ;select bank1
MOVWF BSR ;
MOVLW 07FH ;enable pull-up
MOVWF OPTION_REG ;
四角形吹き出し: データ・シグナル・モジュレータ(DSM)機能の初期設定
EUSARTの出力を反転させ、キャリアと混合(ミックス)させるよう設定している。
;initialize DSM
MOVLW .7 ;select bank7
MOVWF BSR ;
MOVLW 08AH ;set signal (EUSART)
MOVWF MDSRC ;
MOVLW 084H ;set carrier (CCP1-PWM)
MOVWF MDCARL ;
CLRF MDCARH ;
MOVLW 0A0H ;actve DSM module
MOVWF MDCON
;set PWM and stert TMR2 (38KHz)  for DSM
MOVLW .5 ;select bank5
MOVWF BSR ;
MOVLW .105 ;set duty cycle (13.16 uS) for 38KHz
MOVWF CCPR1L ;
MOVLW 0CH ;set PWM mode
MOVWF    CCP1CON ;
CLRF BSR ;select bank0
MOVLW .210 ;set TMR2 (PWM period (26.32 uS) for 38KHz
MOVWF PR2 ;
CLRF TMR2 ;set zero to TMR2
CLRF T2CON ;set TMR2 scale (pre 1:1 ,post 1:1)
BSF T2CON,TMR2ON ;start TMR2
;initialize PORTs
CLRF PORTA ;
CLRF PORTC ;
; test LED
TEST
BSF PORTA,LEDR  ;LED1 on
CALL T1SEC ;wait for 1sec
  BCF PORTA,LEDR ;LED1 off
;
;******************************************************************
; Main routine
;*******************************************
;
MAIN
BTFSC PORTA,PSW ;check P-SW
GOTO MAIN1 ;
;
MOVLW .7 ;select bank7
MOVWF BSR ;
BSF MDCON,MDOE ;start DSM
CLRF BSR ;select bank0
CALL TRANS ;send data to DSM
CALL T05SEC ;wait for 0.5sec
GOTO MAIN ;loop
;
MAIN1
MOVLW .7 ;select bank7
MOVWF BSR ;
BCF MDCON,MDOE ;stop DSM
CLRF BSR ;select bank0
GOTO MAIN ;loop
;
;******************************************************************
; Sub routine pool
;*******************************************
;*******************************************
;  Transmit data to DSM via EUSART 
;*******************************************
四角形吹き出し: 送信データの生成
「AA、01、データ、逆データ、55」の5バイト長の情報をDSMに送り込む処理。
 受信機側で受信したデータと逆データを比較して誤りを検知しています。
TRANS
MOVLW 0AAH ;transmit pre-amble(AA)
CALL SENDD ;
;
MOVLW 01H ;transmit ID (01)
CALL SENDD ;
;
COMF PORTC,W ;pick 4bit-SW data
ANDLW 0FH ;remove upper 4bits
MOVWF REVD ;save 4bit-SW data
CALL SENDD ;transmit 1st. data
COMF REVD,W ;transmit reverse
CALL SENDD ;
;
MOVLW 055H ;transmit post-amble(55)
CALL SENDD ;
RETURN ;
;
;*******************************************
;  Send data to DSM via EUSART 
;*******************************************
SENDD
BSF PORTA,LEDR ;light on LED
BSF BSR,BSR0 ;select bank3
BSF BSR,BSR1 ;
SENDD1
BTFSS TXSTA,TRMT ;check ready
GOTO SENDD1 ;
MOVWF TXREG ;send data
CLRF BSR ;select bank0
BCF PORTA,LEDR ;light off LED
RETURN ;
;
;*******************************************
;  Timer Routine ( 32 MHz clock only )
;*******************************************
; 100usec Timer Subroutine at 32 MHz
;
; 100usec Timer Subroutine
TIM100U                                         
MOVLW .159  ;160 times
MOVWF CNT1            ;
LOOP1
NOP
NOP ;(2+3)*159-1=794 cycles   
DECFSZ CNT1,F
GOTO LOOP1
NOP
NOP
RETURN ;2+794+4=800 cycles
; 10msec Timer Subroutine
TIM10M
MOVLW .99  ;100 times 
MOVWF CNT2
LOOP2
CALL TIM100U          ;
DECFSZ CNT2,F 
GOTO LOOP2
RETURN
; 0.05sec Timer Subroutine
T005SEC
MOVLW .4  ;5 times
MOVWF CNT21            ;
LOOP21
CALL TIM10M           ;
DECFSZ CNT21,F          ;
GOTO LOOP21
RETURN
; 0.1sec Timer Subroutine
T01SEC
MOVLW .9      ;10 times
MOVWF CNT3             ;
LOOP3
CALL TIM10M           ;
DECFSZ CNT3,F           ;
GOTO LOOP3
RETURN
; 0.5 sec Timer Subroutine
T05SEC
MOVLW .4  ;5 times
MOVWF CNT4             ;
LOOP4
CALL T01SEC           ;
DECFSZ CNT4,F           ;
GOTO     LOOP4
RETURN
;
; 1 sec Timer Subroutine
T1SEC
MOVLW .9 ;10 times
MOVWF CNT4             ;
LOOP5
CALL T01SEC           ;
DECFSZ CNT4,F           ;
GOTO LOOP5
RETURN
;
;***************************************
;
END
10.2 あとがき
 ここでは、受信機のプログラムは紹介していませんが、「7.シリアル通信について」を参考にして作成してください。  テストでは数mの送信に成功しました。
 この回路とプログラムを応用すると、ロボットやラジコンカーの制御ができます。 ぜひチャレンジしてみてください。