Vol.549 15.Aug.2008
P
PICを使おう(2)−ソフトウェア編−
by fjk
デバイス定義ファイルを#includeで指定し、__configでコンフィグ指定(デバイスの動作を指定する)をしている(プログラムメモリおよびEEPROMをプロテクトしない、ブラウンアウトリセットを使わない、MCLER端子をリセット端子として使わない、ウォッチドックタイマーを使わない、パワーアップタイマーを使わない、クロックは内部発信)。また、RAMメモリは変数として使うことが多く、確認しやすいよう先頭の方に記述しておくのがよさそう。
リセット(電源オン)後のプログラムは0番地からスタートし、割り込みは4番地からスタートするので、このアドレスはORG命令を使って絶対番地を指定している。セミコロン以降の行にはコメント(日本語もOK)を記述できる。プログラムの最後にはENDを記述する。
作成したプログラムは以下とおり。行の左端からプログラムの格納アドレス、次はプログラムデータ、行番号、ラベル、命令、オペラントとなっている。(ASMファイルは行番号以後を記述)
00001 ;*******************************************
00002 ; PIC12F629 テストプログラム
00003 ;*******************************************
00004 ;
00005 ; PIC12F629のピン配置
00006 ;
00007 ;Pin1 Vdd +2V to +5.5V 電源
00008 ; 2 GP5, T1CKI, OSC1, CLKIN
00009 ; 3 GP4, T1G, OSC2, CLKOUT
00010 ; 4 GP3, MCLR, Vpp
00011 ; 5 GP2, T0CLI, INT, COUT
00012 ; 6 GP1, CIN-, ICSPCLK
00013 ; 7 GP0, CIN+, ICSPDAT
00014 ; 8 Vss 0V 電源
00015
00016 list p=12f629 ; 翻訳時にリストファイルを作る
00017 #include "p12f629.inc" ; 12F629用定義ファイルを読み込む
00018 errorlevel -302 ; 翻訳時に302エラーが出ないようにする
00019
2007 3F84 00020 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
00021
00022 radix dec ; 省略時の数値表現を10進数にします。
00023
00024 ;---------- RAM AREA ----------
00000020 00025 u_ram equ 0x20 ; ramは20H番地から
00000020 00026 w_temp equ u_ram
00000021 00027 s_temp equ u_ram+1
00028
00029 ;---------- PROGARAM ----------
0000 00030 vc_reset:
0000 00031 org 0 ; リセット後はここからプログラムを開始
0000 2804 00032 goto start
00033
0004 00034 org 4 ; 割り込みはここから(今回は使わない)
0004 00035 start: ; 電源投入直後の「準備の処理」
0004 1283 00036 bcf STATUS,RP0 ; バンク0 に切り換える
0005 0185 00037 clrf GPIO ; 一旦 GPIO を クリア(00000000)
0006 1683 00038 bsf STATUS,RP0 ; バンク1 に切り換える
0007 3018 00039 movlw B'00011000' ; GP3,4 = 入力(1), GP0,1,2,5 = 出力(0)に設定
0008 0085 00040 movwf TRISIO ; TRISO ← w
0009 3010 00041 movlw B'00010000' ; GP4 をプルアップに設定
000A 0095 00042 movwf WPU ; WPU ← w
000B 1381 00043 bcf OPTION_REG,NOT_GPPU ; ウィークプルアップを使うに設定
000C 1283 00044 bcf STATUS,RP0 ; バンク0 に戻す
00045
000D 00046 main: ; ここから「メインの処理」
000D 1A05 00047 btfsc GPIO,GP4 ; GP4ビットが0なら次命令をスキップ
000E 2811 00048 goto ledoff ; GP4ビットが1の時のみledoffにジャンプ
000F 00049 ledon:
000F 1285 00050 bcf GPIO,GP5 ; GP5ビットに 0を書き込む(LED点灯)
0010 280D 00051 goto main ; main に戻る
0011 00052 ledoff:
0011 1685 00053 bsf GPIO,GP5 ; GP5ビットに 1を書き込む(LED消灯)
0012 280D 00054 goto main ; main に戻る
00055
00056 END ; プログラムの終了
●リロケータブルな記述方法(12F675の場合)
LEDの点灯をスイッチによるトグル方式としたプログラムをリロケータブルな形式で記述すると以下の様になる。この時、CODファイルを作製するため、Project/Build Option/Projectを開きMPLINK Linkerタブの"Suppress COD-file generation"のチェックボタンを消す(COFFファイルでは最終的に割り付けられたアドレスがリストに表示されないため)。イタリック体は12F675で追加したプログラム。
Address Value Source
------- ------- ----------------------------------------------------
;***************************************************
; PIC12F675 テストプログラム(チャタリング対策付き)
; ・・・タイマー及びキー入力割り込みを使用
;***************************************************
;
; PIC12F675のピン配置(12F629のA/Dコンバータ付き)
;Pin1 Vdd +2V to +5.5V 電源
; 2 GP5, T1CKI, OSC1, CLKIN
; 3 GP4, AN3, T1G, OSC2, CLKOUT
; 4 GP3, MCLR, Vpp
; 5 GP2, AN2, T0CLI, INT, COUT
; 6 GP1, AN1, CIN-, Vref, ICSPCLK
; 7 GP0, AN0, CIN+, ICSPDAT
; 8 Vss 0V 電源
;===================================================
list p=12f675 ; 翻訳時にリストファイルを作る
include "p12f675.inc" ; 12F675用定義ファイルを読み込む
errorlevel -302 ; 翻訳時に302エラーが出ないようにする
002007 3f84 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
radix dec ; 省略時の数値表現を10進数にする
;---------- CONST -------------
STRCNT equ 10 ; 時間待ちカウンタの初期値(200mS)
STRTM0 equ 178 ; タイマー0のカウント初期値(20ms毎)
; 256 - 20mS/(0.001mS x 256)
;---------- RAM AREA ----------
group1 udata_shr ; <ここからユーザーメモリの割り当て>
w_temp res 1 ; 割り込み時のwレジスタの一時待機場所
s_temp res 1 ; 割り込み時のSTATUSレジスタの待機場所
tmcnt res 1 ; 時間待ちカウンタ
chatflg res 1 ; チャタリング待機中フラグ
keyflg res 1 ; キー入力確定フラグ
;---------- PROGARAM ----------
vreset code 0 ; code は、「ここからプログラム」の意味
000000 2822 goto start
;---------- INTALUPT OPERATION ----------
intope code 4 ; 割り込み処理の開始番地
push:
000004 00a0 movwf w_temp ; メイン処理で使用していた wレジスタを待避
000005 0803 movf STATUS,w ; 同じくSTATUSレジスタを待避
000006 00a1 movwf s_temp ; s_temp ← w
int_gpio: ; <入力ピン割り込み処理>
000007 1c0b btfss INTCON,GPIF ; 入力ピン割り込みか?(GPIF=1ならskip)
000008 2814 goto inttm0 ; ・・でなければ、タイマー割り込み処理へ
000009 100b bcf INTCON,GPIF ; 入力ピン割り込みフラグをクリア
00000a 1a23 btfsc chatflg,GP4 ; チャタリング処理中か?(GP4=0ならskip)
00000b 281d goto pop ; ・・処理中なら、何もしない
00000c 1623 bsf chatflg,GP4 ; チャタリング処理中フラグをセット
00000d 300a movlw STRCNT ; 時間待ちカウンタに初期値を
00000e 00a2 movwf tmcnt ; tmcnt ← w
inttmset: ; <タイマー初期値セットのエントリー>
00000f 30b2 movlw STRTM0 ; タイマー0に初期値をセット
000010 0081 movwf TMR0 ; TMR0 ← w
000011 168b bsf INTCON,T0IE ; タイマー割り込みを許可
000012 118b bcf INTCON,GPIE ; 入力ピン割り込みを禁止
000013 281d goto pop ; 割り込みから戻る
inttm0: ; <タイマー割り込み処理>
000014 1d0b btfss INTCON,T0IF ; タイマー0割り込みか?(T0IF=1ならskip)
000015 281d goto pop ; ・・でなければ、割り込みから戻る
000016 110b bcf INTCON,T0IF ; タイマー0割り込みフラグをクリア
000017 0ba2 decfsz tmcnt,f ; カウンタを1つ減らす
000018 280f goto inttmset ; 0でなければ再度タイマー待ちへ
000019 1223 bcf chatflg,GP4 ; チャタリング待ちフラグをクリア
; btfss GPIO,GP4 ; GP4=1ならskip(再確認が必要なら)
00001a 1624 bsf keyflg,GP4 ; キーデータ入力フラグをセット
00001b 128b bcf INTCON,T0IE ; タイマー0割り込みを禁止
00001c 158b bsf INTCON,GPIE ; 入力ピン割り込みを許可
pop:
00001d 0821 movf s_temp,w ; 割り込み前のSTATUSレジスタを復帰
00001e 0083 movwf STATUS ; STATUS ← w
00001f 0ea0 swapf w_temp,f ; 割り込み前のwレジスタを復帰
000020 0e20 swapf w_temp,w ; フラグが変化しないswap命令を使用
000021 0009 retfie ; retfie命令で メイン処理へ戻る
;---------- MAIN OPERATION ----------
start: ; 電源投入直後の「準備の処理」
000022 1283 bcf STATUS,RP0 ; バンク0 に切り換える
000023 0185 clrf GPIO ; 一旦 GPIO を クリア(00000000)する
000024 3007 movlw B'00000111' ; コンパレータ使用しないに設定
000025 0099 movwf CMCON ; CMCON ← w
000026 1683 bsf STATUS,RP0 ; バンク1 に切り換える
000027 3018 movlw B'00011000' ; GP3,4 = 入力, GP0,1,2,5 = 出力に設定
000028 0085 movwf TRISIO ; TRISO ← w
000029 019f clrf ANSEL ; アナログ入力を使用しないに設定
00002a 3010 movlw B'00010000' ; GP4をウィークプルアップ
00002b 0095 movwf WPU ; WPU ← w
00002c 3007 movlw B'00000111' ; WPU使用、プリスケーラを256に
00002d 0081 movwf OPTION_REG ; OPTION ← w
00002e 3010 movlw B'00010000' ; GP4をキー入力割り込み許可
00002f 0096 movwf IOC ; IOC ← w
000030 1283 bcf STATUS,RP0 ; バンク0 に戻す
000031 01a3 clrf chatflg ; chatflgフラグを全てクリア
000032 01a4 clrf keyflg ; keyflgフラグを全てクリア
000033 158b bsf INTCON,GPIE ; 入力ピン割り込みを許可
000034 178b bsf INTCON,GIE ; グローバル割り込みを許可
main:
000035 0885 movf GPIO,f ; GPIOにデータをラッチさせる
000036 1e24 btfss keyflg,GP4 ; keyflgのGP4=1なら次命令をskip
000037 2835 goto main ; スイッチ入力がないのでmainに戻る
000038 1224 bcf keyflg,GP4 ; keyflgフラグをクリア
000039 1e85 btfss GPIO,GP5 ; GPIOのGP5=1なら次命令をskip
00003a 283d goto ledoff ; GP5=0 ならledoffへ
ledon:
00003b 1285 bcf GPIO,GP5 ; GPIOのGP5に0を書き込む(LED点灯)
00003c 2835 goto main ; main に戻る
ledoff:
00003d 1685 bsf GPIO,GP5 ; GPIOのGP5に1を書き込む(LED消灯)
00003e 2835 goto main ; main に戻る
END ; プログラムの終了
S
SVG Cats
by fjk
フローチャートを簡単に書けるフリーソフトがないかと調べていると、SVG Catsというソフトが見つかった(http://www.vectore.co.jp/soft/win95/art/se251284.html)。その他にもflowerやgomaDrawなどもあるが、ベクター形式の画像形式であるSVC(Scarable Vector Graphics)形式であることに興味を引かれSVG Catsを使ってみた。SVG Catsはフリーのドロー系グラフィックス・エディタで、フローチャートなどを気軽に書くことが出来るほか、アイデアプロセッサとしても使える。使い方は、キャンパスの空白の部分でマウスをダブルクリックしてキーワードを入力する。その後ダブルクリック&ドラッグすることでキーワード同士をラインでリンクする。キーワードを移動するとラインも自動で追従してくれる。このように編集を行ってSVG形式でセーブできるが、印刷出力がないので、セーブしたSVGファイルをエクスプローラなどで開き、印刷する必要がある。但し、SVGファイルをミルにはAdobe社の”SVG Viewer”(http://www.adobe.com/jp/svg)が必要である。最初はちょっと使い方にとまどったが、使うにつれて操作の便利さが解るようになるソフトである。
<作成例>
