続続続PIC10F322 ソフトシリアル一考察
続続続ソフトシリアルインターフェース (2014.05.20全面修正)
続続ソフトシリアル一考察で紹介したソフトシリアルインターフェースのルーチンをコードサイズ重視で見直しました。
続続ソフトシリアルインターフェースのソースではレジスタの使用個数を1として、受送信で33ワード必要でしたが、
今回の方法ではレジスタを1つ追加することにより、受送信で30ワードまでサイズを小さくできます。
今回のルーチンが続続ソフトシリアルインターフェースのものに比べて勝るということではなく、
使用目的により使い分けできる利点を強調したいと思います。
AVRのアプリケーションノート AVR305: Half Duplex Compact Software UART を参考にしました。
ここで示す例はPIC10F322、動作クロック8MHz、受信ポートRX=PORTA,3、送信ポートTX=PORTA,2
通信条件:9600ボー、パリティなし、ストップビット1、フロー制御なしのものです。
サブルーチン bwait/bwait2 を呼び出すと、Wレジスタに0x09が書き込まれて返って来ます。このとき、CフラグとZフラグもセットされますので、bwait/bwait2 を100us/50usのディレイとして使用する場合は注意が必要です。
<ソースコード>
xtal EQU 8000000 ;Hz
baud EQU 9600 ;bps
#define TX 2 ;PIC TX Data output pin (i.e. 2 = RA2)
#define RX 3 ;PIC RX Data input pin (i.e. 3 = RA3)
#define Direct_TX ;RS-232C TX Direct Connection (MAX232を使用しない)
#define Direct_RX ;RS-232C RX Direct Connection (MAX232を使用しない)
cblock 0x7E
cn ;RS-232C ビットカウンター
rxd ;RS-232C データ入出力バッファ
endc
org XXXX
clrf ANSELA ; digital I/O
bcf TRISA,TX ; set TX Port
; ********************************************************************
;
; RS-232C 1バイト送信(18ワード)
;
; Wに値をセットして呼び出す (戻り値:W=0x09,Carry=1,Zero=1)
;
; ********************************************************************
PUTC:
#ifdef Direct_TX
bcf LATA,TX
#else
bsf LATA,TX
#endif
movwf rxd ; rxd=w
call bitout+3 ; start bit
movwf cn ; cn=9, Carry=1
rrf rxd,f ; set Carry
call bitout ; wait 1bit and Carry=1
decfsz cn,f ; send 9bits?
goto $-3 ; loop
bitout:
#ifdef Direct_TX
btfsc STATUS,C ; Bit Output
bcf LATA,TX
btfss STATUS,C
bsf LATA,TX
#else
btfsc STATUS,C ; Bit Output
bsf LATA,TX
btfss STATUS,C
bcf LATA,TX
#endif
bwait: ; wait 1 bit
call bwait2
bwait2: ; wait 1/2bit and Set Carry=1
movlw .256-((xtal/.4)/baud-.15)/.8
addlw 0x01
btfss STATUS,Z
goto $-2
retlw 0x09
; ********************************************************************
;
; RS-232C 1バイト受信(12ワード)
;
; 戻り値 W,rxd
;
; ********************************************************************
GETC:
#ifdef Direct_RX
btfss PORTA,RX
#else
btfsc PORTA,RX
#endif
goto $-1 ; wait Start bit
call bwait2 ; wait 1/2 bit and W=9
movwf cn ; cn=9
rrf rxd,f ; get bit data
call bwait ; wait 1 bit and set Carry=1
#ifdef Direct_RX
btfsc PORTA,RX
#else
btfss PORTA,RX
#endif
bcf STATUS,C
decfsz cn,f ; cn=0?
goto $-5 ; loop
movf rxd,w ; return in w
return
続続ソフトシリアル一考察で紹介したソフトシリアルインターフェースのルーチンをコードサイズ重視で見直しました。
続続ソフトシリアルインターフェースのソースではレジスタの使用個数を1として、受送信で33ワード必要でしたが、
今回の方法ではレジスタを1つ追加することにより、受送信で30ワードまでサイズを小さくできます。
今回のルーチンが続続ソフトシリアルインターフェースのものに比べて勝るということではなく、
使用目的により使い分けできる利点を強調したいと思います。
AVRのアプリケーションノート AVR305: Half Duplex Compact Software UART を参考にしました。
ここで示す例はPIC10F322、動作クロック8MHz、受信ポートRX=PORTA,3、送信ポートTX=PORTA,2
通信条件:9600ボー、パリティなし、ストップビット1、フロー制御なしのものです。
サブルーチン bwait/bwait2 を呼び出すと、Wレジスタに0x09が書き込まれて返って来ます。このとき、CフラグとZフラグもセットされますので、bwait/bwait2 を100us/50usのディレイとして使用する場合は注意が必要です。
<ソースコード>
xtal EQU 8000000 ;Hz
baud EQU 9600 ;bps
#define TX 2 ;PIC TX Data output pin (i.e. 2 = RA2)
#define RX 3 ;PIC RX Data input pin (i.e. 3 = RA3)
#define Direct_TX ;RS-232C TX Direct Connection (MAX232を使用しない)
#define Direct_RX ;RS-232C RX Direct Connection (MAX232を使用しない)
cblock 0x7E
cn ;RS-232C ビットカウンター
rxd ;RS-232C データ入出力バッファ
endc
org XXXX
clrf ANSELA ; digital I/O
bcf TRISA,TX ; set TX Port
; ********************************************************************
;
; RS-232C 1バイト送信(18ワード)
;
; Wに値をセットして呼び出す (戻り値:W=0x09,Carry=1,Zero=1)
;
; ********************************************************************
PUTC:
#ifdef Direct_TX
bcf LATA,TX
#else
bsf LATA,TX
#endif
movwf rxd ; rxd=w
call bitout+3 ; start bit
movwf cn ; cn=9, Carry=1
rrf rxd,f ; set Carry
call bitout ; wait 1bit and Carry=1
decfsz cn,f ; send 9bits?
goto $-3 ; loop
bitout:
#ifdef Direct_TX
btfsc STATUS,C ; Bit Output
bcf LATA,TX
btfss STATUS,C
bsf LATA,TX
#else
btfsc STATUS,C ; Bit Output
bsf LATA,TX
btfss STATUS,C
bcf LATA,TX
#endif
bwait: ; wait 1 bit
call bwait2
bwait2: ; wait 1/2bit and Set Carry=1
movlw .256-((xtal/.4)/baud-.15)/.8
addlw 0x01
btfss STATUS,Z
goto $-2
retlw 0x09
; ********************************************************************
;
; RS-232C 1バイト受信(12ワード)
;
; 戻り値 W,rxd
;
; ********************************************************************
GETC:
#ifdef Direct_RX
btfss PORTA,RX
#else
btfsc PORTA,RX
#endif
goto $-1 ; wait Start bit
call bwait2 ; wait 1/2 bit and W=9
movwf cn ; cn=9
rrf rxd,f ; get bit data
call bwait ; wait 1 bit and set Carry=1
#ifdef Direct_RX
btfsc PORTA,RX
#else
btfss PORTA,RX
#endif
bcf STATUS,C
decfsz cn,f ; cn=0?
goto $-5 ; loop
movf rxd,w ; return in w
return
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT