Old PIC(Home) > 事例編 PIC10F322
事例編 PIC10F322  (Old PIC) 
title_image Magnified image


 PIC10F322T-I/OTSOT-23(6pin) パッケージで最も強力な PIC(2019年現在) 


目  次内  容更新日
やってみた事シリアル通信、モニタ、PWM、User-ID領域活用2019/02/16
予備テスト 
  RA3で双方向通信RA3(入力専用ポート) から出力してみる
  タイマ割込UARTエミュレートのクロックをタイマ割込で作る
  USB-SerialユニットUSB-Serial(FT234X, CP2102)の信号レベルを確認する
回路回路図 (残り 3ポートに動作確認用のLEDを付ける)
ソフト(ダウンロード)(設定値保持場所) User ID版 と Program flash版を準備
使い方・注意点
  ソフトUART(詳細は 別項 参照)
  PICMON
   (or PICBUG)
Memory examine/change, Print RAM, 
Read User-ID/ Write User-ID
応用方法
  ユーザプログラム組込メモリ容量の目安、電源ON時ユーザプログラムの起動
  起動方法の工夫ユーザモード/モニタモードの切り分け
[Home]へ


 やってみた事具体事例ではなく「こんな事ができる」と言うサンプルです 

PICの SOT23パッケージの中で最も高機能な PIC10F322 を使ってみました
 
下の動画に映っているものが全てです
 (1)RA3ポートを使い ソフトウェア-UART で 9600bps半二重双方向シリアル通信を行う
 (2)最小限の モニター機能 を組込む (RAMの表示/変更、User IDに設定値を保管 等)
 (3)LEDの明るさ調整に PWM機能 を使ってみる
 (4)User-ID領域 を不揮発メモリとして使ってみる (プログラムメモリが容量不足のため)
 
下のサンプル動画の説明
 (1)背景のパソコン画面は、ターミナルソフトで PIC10F322と通信して
RAMの表示・変更・ダンプなどを行っています
 (2)ブレッドボード左側は USB-シリアルユニット(パソコンに接続)
 (3)ブレッドボード右側の PIC10F322を取り付けた自作のブレークアウトボード
USB-シリアルユニットの間のケーブルは、電源 2本(+5V, GND)と 信号 1本です
ダイオードと プルダウン用抵抗を USB-シリアルユニットの前に置いています
 



 予備テスト  

RA3で双方向通信 (十分使えそうです)
 RA3は通常は入力ポートにしか使えませんので、(弱い)プルアップ機能を使います
出力「1」は「プルアップ」を ONに、出力「0」は「プルアップ」を OFFにします
但し、出力「0」は外部に「プルダウン」用の抵抗を入れる必要が有ります
内部プルアップの電流はバラつきが有りますので抵抗(R)は調整が必要です
[テスト回路(上)と コード(下)]

	BTFSC	LATA,0
	GOTO	WPUA3R	;Reset
WPUA3S			;Set
	BSF	LATA,0	;Hi
	BSF	WPUA,3	;Hi
	GOTO	WPUA3X
WPUA3R	BCF	LATA,0	;Lo
	BCF	WPUA,3	;Lo
WPUA3X
 黄色の波形は、26μS毎の割込で WPA3を ON/OFFさせた時の波形です
プルアップ・プルダウンの抵抗値が大きいので浮遊容量の影響が出て波形がなまっています
テストでは R=51kΩ、電源電圧=4.9Vの場合、出力波形(黄色)は約 0V/2.8Vでした
赤色の波形は、同じタイミングで RA0(LED負荷あり)に出力したパルス(約 0V/4.6V)です
 
 目次へ


タイマ割込
割込周期・割込処理時間の測定結果
割込処理の先頭と末尾に測定パルス発生用の命令を追加して時間を測定してみました
割込周期は 26μS、割込処理時間は 3〜8μS位でした  (黄:RA1、赤:RA2(Trigger))
PUSH	BSF	LATA,1	  ;*** DEBUG
;
	MOVWF	W_WREG	  ;Save W reg.
	SWAPF	W_WREG,1
	SWAPF	STATUS,0  ;Get status
	MOVWF	W_STAT	  ;Save it

	[割込処理]

PULL	SWAPF	W_STAT,0  ;Rest. status
	MOVWF	STATUS
	SWAPF	W_WREG,0  ;Rest. W reg.
;
	BCF	LATA,1	  ;*** DEBUG
;
	RETFIE
 
 目次へ
 
USB-Serialユニット
簡易な接続では、USB-Serialユニットの入力側の特性に依存するので
手持ちの2種類のユニットで試してみました
 秋月 FT234X  alie CP2102
 
USB-Serialユニット:秋月 FT234X (調整時に最初に使用したもの)
赤:先頭の黄信号と同じ波形は
  ハード接続のエコー信号
  それに続く信号は PICの送信出力
  USB-Serialユニットを介して
  PCのターミナルソフトで読取れる

黄:PCのターミナルソフトから
  打ち込んだ文字
赤:RA3(RXD) USB側切断  RA3(RXD) USB側接続  黄:TXD信号(USB-Serial 3.3V系)
USB-Serialユニット:alie CP2102  (中華製の安価なもの)
 (注1)RXD信号の LEDは取り外し

 波形は上段と同じ内容です
 3.3V系の電圧が4.1V位ありましたが
 問題なく読み取れます
赤:RA3(RXD) USB側切断  RA3(RXD) USB側接続  黄:TXD信号(USB-Serial 4.1V系)
(注1)
秋月 FT234Xの場合は、変換チップから直接信号が出ていますが
alie CP2102の場合は各信号ラインにLEDが接続されていますのでそのままでは動作しません
RXD信号に接続されている LED(又は直列抵抗)を取り外せば同様に動作ます
 
 目次へ
 
 
 
 回路  Schematic(Circuit Diagram) 

  下図が全てです
  左端は ICSP(In-Circuit Serial Programming)接続(6番ピンは省略)
中央は USBシリアルユニットとの接続回路
  ダイオードは順方向電圧降下の小さいショットキ型を用います
右側はテスト基板(最上段の写真)の回路です CPU以外は PIC10F222 と同じです
(LEDの電流制限抵抗は、LEDの特性により適宜実験的に決めます)
 
 目次へ
 


 ソフトソフト(ダウンロード)

Name Download File Version Date Description
T322UIT322UI.zipV00.72  2019/02/15 ユーザID 読み書きサンプル 
T322PFT322PF.zipV00.522019/02/15 プログラムメモリ 読み書きサンプル
T322UIT322UIM.zipV00.722019/02/15 ユーザID 読み書きサンプル(最小構成)
 
目次へ


 使い方・注意点(仕組みに付いては 別項 に独立させました)
ソフトUART
(1)組込手順
初期化部 起動時に一度実行する初期化処理の部分に組込む
 (RA3・TMR0・ワークエリアの初期化、割込許可などの処理が含まれます)
割込処理 プログラムに組込み、エントリアドレスを 4番地にセットする
 (割込が許可されていれば自動的に実行されます)
呼出方法 1文字入力: CALL INEEE  ;受信データを(W)に入れて戻る
1文字出力: CALL OUTEEE ;送信データを(W)に入れて CALLする
 
(2)UARTとしての使用方法
受信手順 受信ステータスチェック (WTRSTS: TX RX control & status)
  WTRSTS,RXBSY=1:受信中(RX Busy flag)
  WTRSTS,RXDNF=1:受信完了(RX Done flag)
  WTRSTS,RXOFE=1:受信エラー(RX Over run or Frameing Err)
受信完了なら(WTRSTS,RXDNF=1 & WTRSTS,RXOFE=0)
受信データレジスタから受信データを取り出す (WRXREG: RX data reg.)
送信手順 送信ステータスチェック (WTRSTS: TX RX control & status)
  WTRSTS,TXBSY=1:送信中(TX Busy flag)
  WTRSTS,TXDSF=1:送信完了(TX Done)/ 0:送信開始(TX Start)
送信完了(WTRSTS,TXDSF=1) していたら
送信データを送信レジスタ(WTXREG: TX data register) にセットして
送信開始(WTRSTS,TXDSF=0) する
 
(3)注意点
1本の信号線で送受信する場合  半二重通信となります
ハード的にエコーバックされます(エコーバックを止める事は出来ません)
2本の信号線で送受信する場合  全二重通信が可能です
RA3 を送信側にする事も可能ですが、送信側には出力に設定できるポートに
割り当てることを推奨します
サンプルでは
半二重:受信と送信は同じポート(RA3)として1本の信号線で通信します
全二重:受信(RA3)と送信(RA2)に別々のポートを割り当てています
  条件アセンブル(Conditional assembly)で、主要部分を切り替える様に
  コーディングしています
半二重とする場合は、以下の様にコメントアウトする行を変えて下さい
  ;HALFDPLX EQU 0 ;Full duplex version
  HALFDPLX EQU 1 ;Half duplex version

その他 RAMのアドレスなど、絶対アドレスで記述していますが
  これは、Mコマンドなどで確認・変更し易くするためです
  DB(アセンブラが割当)などにかえても構いません
 
 目次へ
 

PICMON(PIC-Monitor) ピグモンでは無くピクモンです
 
設定値の確認・変更をするために簡易なモニターを作ってみました
プログラムメモリ容量の制約が有るので機能は最小限です
モニターの使い勝手は、シンプルでコンパクトな
(MC6800用モニターの) MIKBUG に合わせています (MIKBUGの改造記はこちら)
(単なる筆者の好みです) 従って PICBUG モニターとも称します
 
組込コマンド内容・動作
Memory examine and change
 0x00-0x3F:Special Function Registers
 0x40-0x7F:General Purpose Registers
 0x78-0x7F:User ID Read/Write Buffer
 指定した番地の内容表示・変更
 Special Function Registersも表示・変更できます
 (SFRの変更は注意が必要です)
 User IDへのアクセスはここを経由して行います
[動作]

 *
 
 *M 
 
 *M 7C
 7C 3F
 
 *M 7C
 7C 3F 01
 7D FF
 
 *M 7C
 7C 3F 01
 7D FF.
 7E 3F
 
 *M 7C
 7C 3F 01
 7D FF.
 7E 3F  ?
 *

[操作説明]

(プロンプト)コマンド待ち
 
「M」を入力するとスペース出力後、参照番地入力待ち
 
番地「7C」を入力すると
  入力された番地とその番地のデータ「3F」を表示
 
スペースを入力後変更するデータ「01」を入力する
  データが変更された事を確認後、
  次の番地「7D」とその番地のデータ「FF」を表示
 

変更しない場合は、スペース以外の文字を入力すると
  次の番地「7E」とその番地のデータ「3F」を表示

 
「M」コマンドを抜けるには、スペースを入力後
  16進数以外の文字を入力する
  (16進数以外が入力された場合は)「?」表示後
  プロンプトを表示してコマンド待ちになる
Read UserID / Write UserID
 Buffer RAM($78-$7F) ←→ UserID
UserIDの バッファRAMへの 読込みと書出し
UserIDへのアクセスは BufferRAM経由で行います
[動作]

 *W OK
 *
 
 *R OK
 *
 

  UserID     RAM    RAM
           --DCBA98 76543210
 (0x2000)←→(0x78) ( 0x79 )
 (0x2001)←→(0x7A) ( 0x7B )
 (0x2002)←→(0x7C) ( 0x7D )
 (0x2003)←→(0x7E) ( 0x7F )

[操作説明]

「W」を入力するとバッファRAMの内容を UserID領域へ
  書込んで 完了後「OK」を表示する
 
「R」を入力すると UserID領域を読み出してバッファRAMへ
  書込んで 完了後「OK」を表示する
 
[注意]
UserIDの上位 6bit用のバッファRAM(78,7A,7C,7E番地)は
  8bitであるが、その下位 6bitのみが使用されます

  [例] 7C番地のデータを FFにして UserIDに書込み
     しても読出したデータは 3Fとなる
Print RAM RAM(0x00-0x7F)の内容を16進表示する
[動作]

 *P
 PR .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
 00 00 C7 1A 1A 04 07 08 07 00 07 00 A2 00 00 08 00
 10 79 00 FF 00 C0 12 00 80 C4 00 00 00 00 40 FE 00
 20 04 00 FF 3F C0 00 00 00 00 00 01 00 00 00 00 00
 30 16 00 40 12 02 83 00 C8 44 00 00 00 00 00 01 81
 40 B1 02 50 50 10 A0 B9 00 70 04 10 20 04 84 02 04
 50 36 C5 F6 89 89 39 00 00 8F 72 70 FA 39 54 D4 F1
 60 31 42 55 31 7C 34 3D D2 24 97 12 36 4B D5 19 AA
 70 04 A7 E9 E5 6D 48 5C 33 04 A7 0C 31 3F FF 3F FF
 *

[操作説明]

「P」を入力すると
   00〜7F番地の内容を 16進数表示する

注記
Program Flash Memory(以下 ) と User ID領域とはほぼ同等に扱えます
主な相違点は
(1)Program Flash への書込みはライトラッチを介して 16ワード単位で書込む
(2)UserID(4ワード) への書込みはライトラッチを介さずに 1ワードづつ書込む
(3)書込みのアンロックシーケンスや書込み前に消去が必要な点は同じ
PIC10F322 では、ただでさえ少ないメモリを使うのは勿体ないので User ID領域を使いました
小規模のシステムでは User ID領域の容量(14bit×4word)でも十分実用的に使えます
ここでは、 14bitを 6bitと 8bitに分けて 8個の設定値の保持に使いました
 
目次へ
 

 応用方法

ユーザプログラム組込時の対応方法
設定値のメンテナンス用にモニターを組み込んで置くのが便利ですが
少ないメモリを消費してしまうので、デモ部分はもちろん
メモリ不足の時は、モニターの「P」コマンドも外します
「M」コマンドだけでも設定値のメンテナンスは出来ます

メモリ容量の目安 ワード(PIC10F322の全メモリ:512ワード)
デモ部・モニタを含むサンプル503(ほとんど空きが無い)
LEDのPWM点灯デモ部容量 46 不要
LED(RA2)点滅デモ部容量 9 不要
モニタ Pコマンドの容量 34 省略可能
英小文字大文字変換の容量 15 省略可能
モニタ最小構成の容量約328(空き:184ワード程度)
UARTエミュレータ部の容量約133(割込部:102、初期化部:31、空き:399)

起動方法の工夫
一般には、起動時にターゲットプログラムが起動する様にしておきます
モニターモードに移行する方法を工夫します
(1)文字処理を使わない場合  ターゲットをマルチタスク的に実行すれば
  常にモニターモードを実行できます(例:このサンプルのLED表示)
(2)文字処理を使うが、入力しない文字コードが有る場合
  例えば[Ctrl-C]でモニターモードとターゲットを切り替えるなど
(3)文字処理で全ての文字を使う場合
  起動時に特定のポートの信号の値により起動するモードを決めるなど
 
目次へ
 



【お礼 と お願い】
 ・ ホームページで情報公開している方々の貴重な体験を活用させて頂きました
  オリジナルがある場合は参照出来る様に場所を示し詳細は省いています
 ・ 内容はありのままを記載していますが、間違いや誤解があるかもしれません
  試す場合は全てご自身の責任で行って下さい
 ・ リンクは自由ですが、商用への写真・図の転載等全て禁止します

ご意見、ご感想、間違い指摘 ..... 等は 掲示板(BBS) 又は <old.and.ordinary(単価記号)gmail.com> へお願いします
―Sorry! Japanese only― Copyright (c)2000 Old-Ordinary Allrights resrved 古風平凡



inserted by FC2 system