;============================================ ;シリアルポート拡張インターフェイス ver.0.02 ; Serial Port eXtender ; @ 2000.06 (c) Masaya TAKAHASHI ;============================================ ;Target MPU -> PIC16F877 @ 20MHz ;Assembler -> MPLAB ver.5.00 ;PICWriter -> AKI-PIC ;=========================================== ; Version History ;=========================================== ;(future work)->PWMのため内部に間接レジスタを作成する ;(future work)->CTS/RTSを実装したほうがいんでないか? ;(future work)->シリアル受信エラーへの対策(フレーミングとかオーバーフローとか) ;(future work)->送受信の完全2重化 ; ;[ ver. 0.02 ](2001/05/11) ;ADC動作保証。ADCモジュールの割当方法を2倍に拡張 ;シリアルバス向けに完全半2重化(送信中は受信を無効/受信エラー対策) ;(modified by ささお:junkbox@erato.dricas.com) ; ;[ ver. 0.01 Beta02 ](2000/06/04) ;ADCは動作未保証. パラレルは動作保証. ;一般公開開始. ; ;[ ver. 0.00 Beta01 ](2000/05/25) ;[ ver. 0.00 Alpha09 ](2000/05/25) ;[ ver. 0.00 Alpha02-08 ](2000/05/15-05/24) ; ... PIC焼き&デバッグ開始 ... ;*TRISA,TRISEの i/o 方向の間違いを修正 ;*_LVP_OFFを追加 ; ;[ ver. 0.00 Alpha01]( 2000/04/21 ) ;*MPLABver5.00でアセンブルチェックをNoErrorNoWarningで通るようにした. ;*ADC_VERSIONナンバ廃止. ;*"S"命令廃止 ;*あまったRA4,RC0-5の仕様決定.以下の通り.今回は(1)(2)のみ実装. ;(1)ボーレート設定ピン(9600,38400,57600,115200) ;(2)SPXの並列接続のためのナンバ設定ピン(4つまで) ;(3)PWM/Capture/Compare機能ピン ;*並列接続時用アドレス付きアクセス命令を追加 ; ;[ ver. 0.00A Alpha00]( 2000/04/14 ) ;*とりあえず作成.A/DCも書いたぞ. ;*シリアルは割り込みを使用しない. ;*これでも要るようならどのみち間に合わないだろう. ;*PPXとのピン互換はあきらめた.TX/RX使用のため. ; ;===================== ;PIC16F877ピン割り当て ;===================== ;[parallel I/O] ;RA0-3 ... PA0-3 ;RA4 ... Baud-Rate Configure-Pin #0 ;RA5 ... PA4 ;RE0-2 ... PA5-7 ;RB0-7 ... PB0-7 ;RD0-7 ... PC0-7 ;[serial and other I/O] ;RC0/T1OSO/T1CK1 ... N.C.(PWM/Compare/Capture機能のため予約) ;RC1/T1OSO/CCP2 ... N.C.(PWM/Compare/Capture機能のため予約) ;RC2/CCP1 ... N.C.(PWM/Compare/Capture機能のため予約) ;RC3/SCK/SCL ... Baud-Rate Configure-Pin #1 ;RC4/SDI/SDA ... ChipAddressConfigure-Pin #0 ;RC5/SDO ... ChipAddressConfigure-Pin #1 ;RC6/TX/CK ... RS232-TxD( to PC/AT-RxD via MAX232) ;RC7/RX/DT ... RS232-RxD( to PC/AT-TxD via MAX232) ; ;===================== ;通信速度設定 ;===================== ;#1 #0 : Baud Rate ; L L : 9600bps(BPS96) ; L H : 38400bps(BPS384) ; H L : 57600bps(BPS576) ; H H : 115200bps(BPS1152) ; ;===================== ;チップアドレス設定 ;===================== ;#1 #0 : Address ; L L : 0(Access with "W""R"set or "w0""r0"set) ; L H : 1(Access with "w1""r1"set) ; H L : 2(Access with "w2""r2"set) ; H H : 3(Access with "w3""r3"set) ; ;============ ;メモリマップ ;============ ;0000-MAIN ;0100-WriteReg ;0300-ReadReg ;0500-ADC Controll ;0600-RS232 Controll ;0700-Version-Infomation ; ;============ ;内部レジスタ ;============ ;内部レジスタアドレスは大文字で指定のこと ;#0 PA(r/w) ;#1 PB(r/w) ;#2 PC(r/w) ;#3 AD(r) ;#4 PA_CFG(r/w) ;#5 PB_CFG(r/w) ;#6 PC_CFG(r/w) ;#7 AD_CFG(r/w) ;#8 SPX_VERSION(r) ;#9 ;#A ;#B ;#C ;#D ;#E ;#F ; ;=========================================== ;Assembler Init. ;=========================================== LIST p=16f877 #INCLUDE __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _LVP_OFF ;===================== ;Const. ;===================== ;CopyRight #DEFINE VERSION_STRING "0.02" #DEFINE COPYRIGHT_STRING "2001.04 (C)SASAO Kazuhiro" ;ボーレート関係(非同期高速モード) BPS1152 EQU 00ah BPS576 EQU 015h BPS384 EQU 020h BPS96 EQU 081h VAL_BPS EQU BPS384 ;===================== ;I/O ;===================== ;===================== ;RAM ;===================== RX_BUF EQU 020h ;受信バッファ兼シーケンスナンバテンポラリ TX_BUF EQU 021h ;送信バッファ BYTE_BUF EQU 022h ;1byte送信時テンポラリ _REG EQU 023h ;レジスタ番号 _DAT EQU 024h ;データ SEQ EQU 025h ;シーケンス番号 TEMP EQU 026h ;テンポラリ CADDR EQU 027h ;チップアドレス保存 ;ソフトウェア内部レジスタ ;REG0-3はPA,PB,PC(RD),ADCにあたる. REG4-6はTRISA,B,D REG7 EQU 028h REG8 EQU 029h ;カウンタとして使用 ;----------------------------------------------------------------------- ;=========================================== ;at top ;=========================================== org 00h goto START org 04h START ;=========================================== ;Init. ;=========================================== IOINIT clrf ADCON0 ;no use A/DC bcf STATUS,RP1 ;BankSet0,1 bsf STATUS,RP0 ;Bank1 ;0=output 1=intput ;すべてdefaultはdigital-input movlw B'00111111' ; movwf TRISA movlw B'11111111' ; movwf TRISB movwf TRISD movlw B'11111111' ; movwf TRISC movlw B'00000111' ; movwf TRISE movlw B'00000111' ;RA,RE,RD for Digital I/O movwf ADCON1 ;とりあえずUSART初期化; movlw B'00100100' ;非同期高速モード movwf TXSTA movlw VAL_BPS ;ボーレート指定 movwf SPBRG ;Interrupt clrf PIE1 clrf PIE2 bcf STATUS,RP0 ;Bank0 movlw B'10010000' ;N81 movwf RCSTA ;とりあえず初期化; clrf PORTA clrf PORTB clrf PORTC clrf PORTD clrf PORTE ;内部レジスタ変数操作 clrf REG7 ;A/Dコンバータ off/ 選択チャンネル ra.0 / 全ポート I/O clrf REG8 ; clrf SEQ ;設定ピンに従ってUSART ボーレート設定 BAUDRATE btfss PORTC,3 ;if RC3=H skip goto BAUDRATE_L btfss PORTA,4 ;if RA4=H skip goto BAUDRATE_HL BAUDRATE_HH movlw BPS1152 goto BAUDRATESET BAUDRATE_HL movlw BPS576 goto BAUDRATESET BAUDRATE_L btfss PORTA,4 ;if RA4=H skip goto BAUDRATE_LL BAUDRATE_LH movlw BPS384 goto BAUDRATESET BAUDRATE_LL movlw BPS96 BAUDRATESET bsf STATUS,RP0 ;Bank1 movwf SPBRG ;設定実行 bcf STATUS,RP0 ;Bank0 ;チップアドレス保存 swapf PORTC,0 andlw B'00000011' movwf CADDR ;=========================================== ;Main routine ;=========================================== MAIN call RECIEVE movf RX_BUF,0 MAIN1 movf RX_BUF,0 ;[if RX_BUF<'0' then goto MAIN2] sublw '0'-1 ;'0'-w btfsc STATUS,C ;if Carry? then skip goto MAIN2 movf RX_BUF,0 ;[if RX_BUF>'9' then goto MAIN2] sublw '9' ;'9'-w btfss STATUS,C ;if NOT-Carry? then skip goto MAIN2 movlw '0' subwf RX_BUF,1 ;0-9をリテラルにする goto SEQUENCE MAIN2 movf RX_BUF,0 ;[if RX_BUF<'0' then goto MAIN3] sublw 'A'-1 ;'A'-w btfsc STATUS,C ;if Carry? then skip goto MAIN3 movf RX_BUF,0 ;[if RX_BUF>'9' then goto MAIN3] sublw 'F' ;'F'-w btfss STATUS,C ;if NOT-Carry? then skip goto MAIN3 movlw 'A'-0x0a subwf RX_BUF,1 ;A-Fを10-15のリテラルにする goto SEQUENCE MAIN3 movf RX_BUF,0 ;[if w=='W' then goto ASC_W] sublw 'W' ;'W'-w btfsc STATUS,Z ;if NON-Zero then skip goto ASC_W movf RX_BUF,0 ;[if w=='R' then goto ASC_R] sublw 'R' ;'R'-w btfsc STATUS,Z ;if NON-Zero then skip goto ASC_R movf RX_BUF,0 ;[if w=='w' then goto ASC_R] sublw 'w' ;'w'-w btfsc STATUS,Z ;if NON-Zero then skip goto ASC_SW movf RX_BUF,0 ;[if w=='r' then goto ASC_R] sublw 'r' ;'r'-w btfsc STATUS,Z ;if NON-Zero then skip goto ASC_SR goto MAIN ;All Reset ASC_W ;"w0"と同等 movlw 1 movwf SEQ clrf RX_BUF ;0を入力 goto SEQUENCE ASC_R ;"r0"と同等 movlw 5 movwf SEQ clrf RX_BUF ;0を入力 goto SEQUENCE ASC_SW movlw 1 movwf SEQ goto MAIN ASC_SR movlw 5 movwf SEQ goto MAIN ;=========================================== ;branch SEQUENCE ;=========================================== SEQUENCE movlw 0x00 movwf PCLATH movf SEQ,0 addwf PCL,1 SEQ_TBL goto MAIN ;0 goto SEQ_NUM ;1 goto SEQ_W0 ;2 goto SEQ_W1 ;3 goto SEQ_W2 ;4 goto SEQ_NUM ;5 goto SEQ_R0 ;6 ;=========================================== ;Data Recognition(SEQ_NUMBER part) ;CADDRと一致ならSEQ+1,違うならSEQ=0 ;=========================================== SEQ_NUM ;チップアドレス確認 movf RX_BUF,0 ;[if w==CADDR then goto next] subwf CADDR,0 ;CADDR-w btfss STATUS,Z ;if Zero then skip goto SEQ_NUM1 incf SEQ,1 goto MAIN SEQ_NUM1 clrf SEQ ;SEQ=0 goto MAIN ;=========================================== ;Data Recognition(WRITE_SEQ part) ;=========================================== SEQ_W0 ;レジスタ番号受け取り movf RX_BUF,0 movwf _REG ;書きこむレジスタ incf SEQ,1 goto MAIN SEQ_W1 ;上位 movf RX_BUF,0 clrf _DAT movwf _DAT swapf _DAT,1 ;上位書きこみ incf SEQ,1 goto MAIN SEQ_W2 ;下位 movf RX_BUF,0 iorwf _DAT,1 ;下位書きこみ call WRITE_REG ;レジスタ書きこみ処理へ clrf SEQ goto MAIN ;=========================================== ;Data Recognition(READ_SEQ part) ;=========================================== SEQ_R0 ;レジスタ番号受け取り movf RX_BUF,0 movwf _REG ;読み込むレジスタ call READ_REG ;レジスタ読み込み処理へ clrf SEQ goto MAIN ;=========================================== ;Data Recognition(Direct_SEQ part) ;=========================================== ;これはPPXとの互換のために存在. ;Ver0.00(Alpha01)にて廃止 ;SEQ_S0 ; incf SEQ,1 ; goto MAIN ;SEQ_S1 ; movlw '0' ;常に00hが帰る ; movwf TX_BUF ; call TRANSMIT ; clrf SEQ ; goto MAIN ;----------------------------------------------------------------------- ;=========================================== ;Write Register ;=========================================== org 0100h WRITE_REG movlw 0x01 movwf PCLATH movf _REG,0 addwf PCL,1 WRITE_REG_TBL goto WRITE_REG0 goto WRITE_REG1 goto WRITE_REG2 goto WRITE_REG3 goto WRITE_REG4 goto WRITE_REG5 goto WRITE_REG6 goto WRITE_REG7 goto WRITE_REG8 goto WRITE_REG9 goto WRITE_REGA goto WRITE_REGB goto WRITE_REGC goto WRITE_REGD goto WRITE_REGE goto WRITE_REGF ;=========================================== ;Write Register Main Part ;=========================================== WRITE_REG0 ;PA movf _DAT,0 andlw B'00001111' ;PA0-3 movwf TEMP btfsc _DAT,4 ;if 1 then skip bsf TEMP,5 ;PA4 movf TEMP,0 ;debug(alpha08) movwf PORTA swapf _DAT,0 ;PA5-7 andlw B'00001110' movwf _DAT rrf _DAT,0 movwf PORTE ; ;RA0-3 ... PA0-3 ;RA4 ... N.C. ;RA5 ... PA4 ;RE0-2 ... PA5-7 return WRITE_REG1 ;PB movf _DAT,0 movwf PORTB return WRITE_REG2 ;PC movf _DAT,0 movwf PORTD return ;WRITE_REG3 ;ADC(Read Only) ;ADC Controll partへ移動 ; reurn WRITE_REG4 ;DIRA movf _DAT,0 bsf STATUS,RP0 ;Bank1 ; debug(alpha08) andlw B'00001111' ;PA0-3 movwf TRISA bsf TRISA,4 bcf STATUS,RP0 ;Bank0 btfss _DAT,4 ;if 1 then skip goto WRITE_REG41 bsf STATUS,RP0 ;Bank1 bsf TRISA,5 ;PA4 bcf STATUS,RP0 ;Bank0 WRITE_REG41 swapf _DAT,0 ;PA5-7 andlw B'00001110' movwf _DAT rrf _DAT,0 bsf STATUS,RP0 ;Bank1 movwf TRISE bcf STATUS,RP0 ;Bank0 ;RA0-3 ... PA0-3 ;RA4 ... N.C. ;RA5 ... PA4 ;RE0-2 ... PA5-7 return WRITE_REG5 ;DIRB movf _DAT,0 bsf STATUS,RP0 ;Bank1 movwf TRISB bcf STATUS,RP0 ;Bank0 return WRITE_REG6 ;DIRC movf _DAT,0 bsf STATUS,RP0 ;Bank1 movwf TRISD bcf STATUS,RP0 ;Bank0 return ;WRITE_REG7 ;ADC_CNF ;ADC Controll partへ移動 ; return WRITE_REG8 ;VERSION WRITE_REG9 WRITE_REGA WRITE_REGB WRITE_REGC WRITE_REGD WRITE_REGE WRITE_REGF return ;----------------------------------------------------------------------- ;=========================================== ;Read Register ;=========================================== org 0300h READ_REG movlw 0x03 movwf PCLATH movf _REG,0 addwf PCL,1 READ_REG_TBL goto READ_REG0 goto READ_REG1 goto READ_REG2 goto READ_REG3 goto READ_REG4 goto READ_REG5 goto READ_REG6 goto READ_REG7 goto READ_REG8 goto READ_REG9 goto READ_REGA goto READ_REGB goto READ_REGC goto READ_REGD goto READ_REGE goto READ_REGF ;=========================================== ;Read Register Main Part ;=========================================== READ_REG0 ;PA movf PORTA,0 andlw B'00001111' movwf BYTE_BUF btfsc PORTA,5 ;debug(alpha08) bsf BYTE_BUF,4 swapf PORTE,0 andlw B'01110000' movwf TEMP rlf TEMP,1 bcf TEMP,0 ;フラグはどーなってるかわからないから. movf TEMP,0 iorwf BYTE_BUF,1 ; call TRANSMIT_BYTE ;RA0-3 ... PA0-3 ;RA4 ... N.C. ;RA5 ... PA4 ;RE0-2 ... PA5-7 return READ_REG1 ;PB movf PORTB,0 movwf BYTE_BUF call TRANSMIT_BYTE return READ_REG2 ;PC movf PORTD,0 movwf BYTE_BUF call TRANSMIT_BYTE return ;READ_REG3 ;ADC(Read Only) ;ADC Controll partへ移動 ; clrf BYTE_BUF ; call TRANSMIT_BYTE ; return READ_REG4 ;DIRA bsf STATUS,RP0 ;Bank1 movf TRISA,0 bcf STATUS,RP0 ;Bank0 andlw B'00101111' movwf BYTE_BUF btfsc BYTE_BUF,5 bsf BYTE_BUF,4 movf BYTE_BUF,0 andlw B'00011111' movwf BYTE_BUF bsf STATUS,RP0 ;Bank1 swapf TRISE,0 bcf STATUS,RP0 ;Bank0 andlw B'01110000' movwf TEMP rlf TEMP,1 bcf TEMP,0 movf TEMP,0 iorwf BYTE_BUF,1 call TRANSMIT_BYTE ;RA0-3 ... PA0-3 ;RA4 ... N.C. ;RA5 ... PA4 ;RE0-2 ... PA5-7 return READ_REG5 ;DIRB bsf STATUS,RP0 ;Bank1 movf TRISB,0 bcf STATUS,RP0 ;Bank0 movwf BYTE_BUF call TRANSMIT_BYTE return READ_REG6 ;DIRC bsf STATUS,RP0 ;Bank1 movf TRISD,0 bcf STATUS,RP0 ;Bank0 movwf BYTE_BUF call TRANSMIT_BYTE return ;READ_REG7 ;ADC_CNF ;ADC Controll partへ移動 ; clrf BYTE_BUF ; call TRANSMIT_BYTE ; return READ_REG8 ;VERSION文字列を返す call RECEIVE_DISABLE ; 送信中の受信禁止 clrf REG8 ; 念のため返信文字列へのポインタをリセット READ_REG8_1 call READ_VERSION movwf TX_BUF call TRANSMIT ; movwf BYTE_BUF ; call TRANSMIT_BYTE movf TX_BUF,0 btfss STATUS,Z ;if Zero then skip goto READ_REG8_1 call RECEIVE_ENABLE ; 受信許可 clrf REG8 ; 返信文字列へのポインタをリセット return READ_REG9 READ_REGA READ_REGB READ_REGC READ_REGD READ_REGE READ_REGF clrf BYTE_BUF call TRANSMIT_BYTE ;全部00を返す return ;----------------------------------------------------------------------- ;=========================================== ;A/DC Control ;=========================================== org 0500h ; ◆ ADCON0(01FH) ; <7:6> A/D変換のためのクロック設定 ; 00 = Fosc/2 ; 01 = Fosc/8 ; 10 = Fosc/32 ; 11 = Frc(内部RC発振) ; <5:3> アナログチャンネルセレクト ; 000 = PA0 / 001 = PA1 / 010 = PA2 / 011 = PA3 ; 100 = PA4 / 101 = PA5 / 110 = PA6 / 111 = PA7 ; <2> A/D変換ステータス ; ADON = 1 のときこのビットを 1にセットするとA/D変換を開始する ; 変換が終了するとこのビットが自動的に 0になる ; <1> つねに 0 ; <0> ADONビット ; 1 = A/D変換モジュールを使う ; 0 = A/D変換モジュールを使わない ; ◆ ADCON1(09FH) ; <7:3> つねに 00000 ; <2:0> Port Aをアナログ入力に使用(A)するかデジタル入出力(D)に使うかの選択 ; PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 Vref ; 000 A A A A A A A A VDD ; 001 A A A Vref A A A A PA3 ; 010 A A A A A D D D VDD ; 011 A A A Vref A D D D PA3 ; 100 A A D A A D D D VDD ; 101 A A D Vref A D D D PA3 ; 11x D D D D D D D D --- ; ※ PA3 はVref(PIC16F877への変更に伴い、ADMODEの ; 選び方が拡張(b3を使用)されました。 ; PPXとの互換性は維持しています。 ; ------------------------------- ; b7 b6 b5 b4 b3 b2 b1 b0 ; ADON [ ADMODE ] [ ADADRS ] ; ------------------------------- ; ● ADON (A/D変換モジュールの ON/OFF) ; ADON 機能 ;------------------------------- ; 0 A/D 変換モジュール OFF ; 1 ON ; ● ADMODE (A/D 変換ポートとして使うか、Digital I/O を使うかの指定) ; ADMODE PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 Vr+ Vr- ;---------------------------------------------- ; 00x0 D D D D D D D D Vdd Vss P ; 0100 D D D D Vr+ D A A PA3 Vss P ; 0110 D D D D A D A A Vdd Vss X ; 1000 D D D A Vr+ A A A PA3 Vss と ; 1010 D D D A A A A A Vdd Vss 互 ; 1100 A A A A Vr+ A A A PA3 Vss 換 ; 1110 A A A A A A A A Vdd Vss ;---------------------------------------------- ; 0001 D D D D Vr+ Vr- D A PA3 PA2 ; 0011 D D D D D D D A Vdd Vss S ; 0101 D D D D Vr+ Vr- A A PA3 PA2 P ; 0111 D D D A Vr+ Vr- A A PA3 PA2 X ; 1001 D D A A Vr+ Vr- A A PA3 PA2 で ; 1011 D D A A Vr+ A A A PA3 Vss 拡 ; 1101 D D A A A A A A Vdd Vss 張 ; 1111 A A A A Vr+ Vr- A A PA3 PA2 ;----------------------------------------------- ; ● ADADRS (どのポートのアナログ値を得るかの指定) ; ADADRS port ADADRS port ;------------- ------------- ; 000 PA0 100 PA4 ; 001 PA1 101 PA5 ; 010 PA2 110 PA6 ; 011 PA3 111 PA7 WRITE_REG3 ;ADC(Read Only) return WRITE_REG7 ;ADC_CNF movf _DAT,0 movwf REG7 ;とりあえず退避 ;内部処理 swapf REG7,0 xorlw B'00000111' ;数値を反転しているのでPICのオリジナルの逆!! andlw B'00000111' ;ビットマスク ; ---- ADCON1 設定 ---- movwf TEMP btfss REG7,3 ; PPX->SPXへのバージョンアップに伴う bcf TEMP,3 ; ADC選択方法の拡張 btfsc REG7,3 ; bsf TEMP,3 ; movf TEMP,0 bsf STATUS,RP0 ;Bank1 movwf ADCON1 ;ADCON1 設定 bcf STATUS,RP0 ;Bank0 ; ---- ADCON0 設定 ---- swapf REG7,0 movwf TEMP rrf TEMP,0 andlw B'00111000' ; W = ( REG7 << 3 ) & 00111000b movwf TEMP ; Analog Channel Select bits bsf TEMP,7 ; ADCLK = Fosc/32 btfsc REG7,7 bsf TEMP,0 ; A/D変換モジュールの 1:ON / 0:OFF movf TEMP,0 movwf ADCON0 ; ADCON0 設定 nop btfss ADCON0,0 ; ADC が存在しない場合には bcf REG7,7 ; REG7,7をクリア return READ_REG3 ; ADC(Read Only) clrw clrf BYTE_BUF btfss REG7,7 ; ADC enable? goto READ_REG31 bsf ADCON0,2 ; AD変換開始 ADLOOP btfsc ADCON0,2 goto ADLOOP ; 変換終了待ち movf ADRESH,0 movwf BYTE_BUF READ_REG31 call TRANSMIT_BYTE return READ_REG7 ;ADC_CNF movf REG7,0 movwf BYTE_BUF call TRANSMIT_BYTE return ;----------------------------------------------------------------------- ;=========================================== ;RS232 Control ;=========================================== org 0600h ;=========================================== ;Recieve 1char from RS232 ;=========================================== RECIEVE btfss PIR1,RCIF ;Recv? goto RECIEVE ;エラーチェックをいれる余地 movf RCREG,0 movwf RX_BUF ;バッファ格納 return ;=========================================== ;Tramsmit 1char to RS232 ;=========================================== TRANSMIT bsf STATUS,RP0 ;Bank1 TRANSMIT1 btfss TXSTA,TRMT ;TRMT-Regが空かどうか? goto TRANSMIT1 bcf STATUS,RP0 ;Bank0 movf TX_BUF,0 ;バッファ取り出し movwf TXREG return ;=========================================== ;Tramsmit 1byte to RS232 with 2char.s ;=========================================== TRANSMIT_BYTE call RECEIVE_DISABLE ; 送信中は受信禁止 TRANSMIT_BYTE0 ;上位送信 swapf BYTE_BUF,0 andlw 0fh ;上位取り出し movwf TX_BUF ;テンポラリ退避 sublw 09h btfsc STATUS,C ;if Carry(w>9) then skip goto TRANSMIT_BYTE2 TRANSMIT_BYTE1 ;TEMP=A-F movf TX_BUF,0 addlw 'A'-0x0a goto TRANSMIT_BYTE3 TRANSMIT_BYTE2 ;TEMP=0-9 movf TX_BUF,0 addlw '0' TRANSMIT_BYTE3 movwf TX_BUF ;送信処理1 bsf STATUS,RP0 ;Bank1 TRANSMIT_BYTE4 btfss TXSTA,TRMT ;TRMT-Regが空かどうか? goto TRANSMIT_BYTE4 bcf STATUS,RP0 ;Bank0 movf TX_BUF,0 ;バッファ取り出し movwf TXREG TRANSMIT_BYTE5 ;下位送信 movf BYTE_BUF,0 andlw 0fh ;下位取り出し movwf TX_BUF ;テンポラリ退避 sublw 09h btfsc STATUS,C ;if Carry(w>9) then skip goto TRANSMIT_BYTE7 TRANSMIT_BYTE6 ;TEMP=A-F movf TX_BUF,0 addlw 'A'-0x0a goto TRANSMIT_BYTE8 TRANSMIT_BYTE7 ;TEMP=0-9 movf TX_BUF,0 addlw '0' TRANSMIT_BYTE8 movwf TX_BUF ;送信処理1 bsf STATUS,RP0 ;Bank1 TRANSMIT_BYTE9 btfss TXSTA,TRMT ;TRMT-Regが空かどうか? goto TRANSMIT_BYTE9 bcf STATUS,RP0 ;Bank0 movf TX_BUF,0 ;バッファ取り出し movwf TXREG RECEIVE_ENABLE ; 送信バッファが空のことを確認して受信許可 bsf STATUS,RP0 ;Bank1 RECEIVE_ENABLE1 btfss TXSTA,TRMT ;送信完了待ち goto RECEIVE_ENABLE1 bcf STATUS,RP0 ;Bank0 bsf RCSTA,CREN ; 受信許可 return RECEIVE_DISABLE ; 送信中は受信禁止 bcf RCSTA,CREN return ;----------------------------------------------------------------------- ;=========================================== ;Read Version-Infomation ;=========================================== org 0700h READ_VERSION movlw 0x07 movwf PCLATH ; テーブル参照先は 07xx番地 movf REG8,0 incf REG8,1 ; 文字列へのポインタを進める addwf PCL,1 ; W=返信文字 でリターン ;送信文字列 dt "SPX " dt VERSION_STRING dt " " dt COPYRIGHT_STRING dt 0 ;ここまで ;=========================================== ;das ende. ;=========================================== END