« 2011年3月 | トップページ | 2012年1月 »

2011年12月

2011年12月31日 (土)

秋月電子/新居浜高専PICマイコン学習キット

20111230 秋月電子通商が販売している新居浜高専PICマイコン学習キットを作ってみました。
新居浜高専の学生さんは,これでPICマイコンの勉強をしてるんだそうです。
このキットのPICには,2進数16進数の勉強,もぐらたたきゲーム,電子ピアノ,電子鈴虫,タッチセンサ,電子サイコロ,電子タイマーのプログラムが書き込まれていて,キットを作るだけですぐに遊べます。
僕がお勉強に使っているPIC16F84Aでこんなことができるんですね。早くこんなスキルを身につけたいものです。
この動画↓は電子タイマーで1分間を計測した様子です。ラーメンタイマーにぴったりですね。

| | コメント (0) | トラックバック (0)

2011年12月30日 (金)

PICのお勉強(5) ビットシフトでLEDの順送り点灯

 RLF(Rotate Left through Carry)という命令を使ってみました。RRF(Rotate Right through Carry)という命令もあるようです。
ソースはこれ→lesson5.asm

ポイントを書いておくと,
;===============================================
 MOVLW B'00000001' ;最初の点灯パターン
 MOVWF PORTB
 BCF STATUS,0 ;STATUSの0ビット目(carryビット)を0にセット

MAIN
 RLF PORTB,F ;PORTBの内容を1ビット左にシフトする
 CALL TIMELOOP1
 GOTO MAIN
;===============================================
Bitshift 最初にPORTBのLEDを00000001というデータで点灯させておいて,RLF PORTB,Fでビットデータを左へひとつシフトさせます。ビット0が空になりますが,そこはあらかじめSTATUSの0ビット目(carryビット)に入れておいた0が入ります。
 あとはこれを繰り返せば点灯するLEDがRB0からRB7へ順に移動するわけです。お,これはうまくやればナイトライダーができそうですな。

【今日覚えた命令】 RLF

| | コメント (0) | トラックバック (0)

2011年12月29日 (木)

PICのお勉強(4) スイッチでLEDの点滅

RA0のスイッチでRA2,RA3のLEDを点灯・消灯させてみました。
ソースは,lesson4.asm
メインプログラムは次のようになっています。

;======================================
MAIN
 BTFSC PORTA,0 ;RA0のスイッチをチェック。0なら次行をスキップ
 GOTO $-1 ;上の行へ戻る
 BCF PORTA,2 ;RA2のLEDを消灯
 BSF PORTA,3 ;RA3のLEDを点灯
 BTFSS PORTA,0 ;RA0のスイッチをチェック。1なら次行をスキップ
 GOTO $-1 ;上の行へ戻る
 CALL TIMELOOP1 ;約20msの時間稼ぎサブルーチンへ

 BTFSC PORTA,0
 GOTO $-1
 BSF PORTA,2 ;RA2のLEDを点灯
 BCF PORTA,3 ;RA3のLEDを消灯
 BTFSS PORTA,0
 GOTO $-1
 CALL TIMELOOP1
 GOTO MAIN
;======================================

 BTFSC(BitTest F,Skip if Clear)でRA0のスイッチをチェックします。スイッチが押される(0)と次行をスキップして,RA2とRA3のLEDを消灯・点灯します。スイッチが押されてない(1)なら,GOTO $-1で戻り,スイッチのチェックを繰り返します。
次に,BTFSS(BitTest F,Skip if Set)で再びRA0のスイッチのチェックし,スイッチがオフ(1)になるのを待ちます。その後、チャタリング対策の20msのタイムインターバルを取って処理を続けます。



【今日覚えた命令】 BTFSS,BTFSC

| | コメント (0) | トラックバック (0)

2011年12月27日 (火)

PICのお勉強(3) LED10個の点滅

 テスト基板についている10個のLED全部を点滅させてみました。
ソースはこれ(lesson3.asm)
今回は新しいワザは何もありませんが,プログラムのメイン部分を紹介します。

;===============================================
MAIN
 MOVLW B'01000' ;RA2を消灯,RA3を点灯
 MOVWF PORTA
 MOVLW B'10101010' ;RB0,2,4,6を消灯,RB1,3,5,7を点灯
 MOVWF PORTB
 CALL TIMELOOP1

 MOVLW B'00100' ;RA2を点灯,RA3を消灯
 MOVWF PORTA
 MOVLW B'01010101' ;RB0,2,4,6を点灯,RB1,3,5,7を消灯
 MOVWF PORTB
 CALL TIMELOOP1
 GOTO MAIN
;===============================================

 2種類の点灯パターンを作って切り替えてるだけですが,うまく動くとうれしいもんですな。
動画はこちら↓

【今日覚えた命令】 なし

| | コメント (0) | トラックバック (0)

2011年12月26日 (月)

PICのお勉強(2) 2個のLEDの交互点滅

 2個のLEDの交互点滅をやってみました。ソースはこれ(lesson2.asm)
ポイントをメモしておきます。

;=================
TIMER1 EQU 20H
TIMER2 EQU 21H
TIMER3 EQU 22H
;=================
TIMER1~3をLEDの点滅のインターバルタイマーの変数に使います。

;========================================
MAIN
 BSF PORTA,2 ;RA2のLED点灯
 BCF PORTA,3 ;RA3のLED消灯
 CALL TIMELOOP1 ;時間稼ぎのサブルーチンへ
 BCF PORTA,2 ;RA2のLED消灯
 BSF PORTA,3 ;RA3のLED点灯
 CALL TIMELOOP1 ;時間稼ぎのサブルーチンへ
 GOTO MAIN
;========================================
 これがメインプログラム。今回は,BSF(Bit Set F)でLEDを点灯,BCF(Bit Clear F)で消灯させてみました。
インターバルを取って点滅させるために時間稼ぎのためのTIMELOOPというサブルーチンに飛びます。

;===================================================
TIMELOOP1 ;約0.4sの時間稼ぎ
 MOVLW D'20'
 MOVWF TIMER1 ;変数TIMER1に20を代入
LOOP1
 CALL TIMELOOP2 ;時間稼ぎのサブルーチン2へ
 DECFSZ TIMER1,F ;TIMER1を1ずつ減じ,0になったら次行をスキップ。
 GOTO LOOP1
 RETURN

TIMELOOP2 ;約20msの時間稼ぎ
 MOVLW D'200'
 MOVWF TIMER2
LOOP2
 CALL TIMELOOP3 ;時間稼ぎのサブルーチン3へ
 DECFSZ TIMER2,F
 GOTO LOOP2
 RETURN

TIMELOOP3 ;約0.1msの時間稼ぎ
 MOVLW D'166'
 MOVWF TIMER3
LOOP3
 DECFSZ TIMER3,F
 GOTO LOOP3
 RETURN
;===================================================
 まずTIMELOOP3から説明します。
変数TIMER3に166を代入し,DECFSZ TIMER3,F(Decrement F,Skip if 0)で1ずつ減じていきます。
TIMER3が0になったら次のGOTO LOOP3をスキップして,RETURNします。
このサブルーチンで約0.1msの時間稼ぎができます。
 僕のテスト基板は20MHzのセラロックで動いているので,PICの命令1つ(1サイクル=4クロック)を実行するのに0.2μsかかります。GOTOとCALLとRETURNは2サイクルかかることに注意して,このサブルーチンを1回実行するのにかかる時間を計算すると,約0.1msとなります。計算が間違ってなければね(笑)
1つのサブルーチンで0.5sくらい時間を稼げるといいのですが,変数に代入できる数値は最大256なので,TIMELOOP1~TIMELOOP3の3つを用意したわけです。
2つでもできるんだけど,20msは後で必要(タクトスイッチのチャタリング対策)な気がしたので作っておきました。
 で,実行結果の動画がこれ↓です。

【今日覚えた命令】 CALL,DECFSZ,RETURN

| | コメント (0) | トラックバック (0)

2011年12月25日 (日)

PICのお勉強 (1) LEDの点灯

 LEDを点灯させることに成功しました。初学者はこの程度のことでもうれしいですな。ソースはこれ(Lesson1.asm)
自分のための備忘録として,メモを残しておきます。
;==================================================
LIST P=PIC16F84A
INCLUDE P16F84A.INC
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;==================================================
 最初のコレは,おまじないみたいなもんですね。使うPICマイコンの宣言とか,MPLABの「ヘッダファイルの読み込み」とか「configレジスタの設定」とかなんだそうです。まあ気にしないことにします。
;========================================================
BSF STATUS,RP0    ;BANK1に切り替えて、
MOVLW B'00011'     ;RA0,RA1は入力、RA2~RA4は出力にする。
MOVWF TRISA      ;上の設定をTRISAに格納して、
BCF STATUS,RP0    ;BANK0に戻す。
;========================================================
 ここは,大切な初期設定。RA0~RA4の入出力の設定をしています。
入出力の設定を書き込むTRISAレジスタやTRISBレジスタはBANK1にあるので,まずはBANK1に切り替えます。
BSFってのは,BitSetF(1にする)って意味ね。STATUSレジスタの5番目のビットRP0を1にするとBANK1に切り替わるのね。
 次に,Wレジスタに2進数(Binary)で00011を代入します(MoveLiteral with W)。0は出力設定,1は入力設定です。今回は使わないけどRA0,RA1にスイッチをつけてあるから1(入力)にして,RA2~RA4は0(出力)にしました。
 んで,この入出力設定をTRISAレジスタに書き込んで設定完了。BANK0に戻して(BitClearF)初期設定終了。
;=================================================
MOVLW B'01100'    ;Wレジスタに2進数01100を代入して、
MOVWF PORTA     ;PORTAに送る。(RA2とRA3が点灯)
;=================================================
 いよいよLEDを点灯させます。
RA2とRA3のLEDを点灯させるのだから,2進数01100をWレジスタに代入して,PORTAに送ります(Move W to F)。
これで仕事は完了。
;================
LOOP
 GOTO LOOP
 END
;================
 点灯しっぱなしにするためになんにもしないでぐるぐるループさせときます。ま,ここはどうでもよろしい。
電源を入れるとLEDが点灯するだけの動画(lesson1.wmv)ですが,ご覧ください。

【今日覚えた命令】 BSF,BCF,MOVLW,MOVWF,GOTO

| | コメント (0) | トラックバック (0)

2011年12月24日 (土)

PICのお勉強 (0) 16F84Aのテストボード製作

16f84testboard_2 PIC16F84AとLED,タクトスイッチでお勉強用テストボードを作りました。
RA0とRA1にタクトスイッチ,RA2とRA3にLED,RA4は予備として空けてあります。さらにRB0~RB7の全部にLEDをつけてやりました。とりあえず「LEDピカピカ」に挑戦しようってわけです。
この回路図はEScadという回路図エディタで描きました。直観的でよくできたソフトです。これはオススメ。

16f84testboard 実際にハンダ付けした基板がこれです。できるだけ回路図と同じになるようにパーツを配置しました。どのLEDが点いてるのかすぐ分かるようにしたわけです。
 参考書として図解 PICマイコン実習―ゼロからわかる電子制御
という本を買ってきました。でも何がなんだかよく分かりません。こりゃ弱ったなあ。

| | コメント (0) | トラックバック (0)

2011年12月23日 (金)

PICライター PICkit2購入

 昨夏,県教委の小役人から一種のパワハラを受けたのですが,逆にコテンパンにやっつけてやりました。だけど,役人というのは自分の誤りを認めて謝罪したりしないんですね。呆れました。人間としてどうかと思うぞ。そのうちここに全部書いてやるからな。
 そのひどいストレスから(「たぶんそれが原因でしょう」と医者が言ってました),関節リウマチという不治の病を発症し,おまけにうつ病まで発症してしまいました。高額な医療費がかかって仕方がないのですが,ゆるゆる生きていこうと思ってます。
 前置きが長かったですが,リハビリを兼ねて(?)最近は電子工作に明け暮れています。ハンダづけをしてると不思議と心が落ち着くんですよね。

Pickit2 普段,秋月電子の通販でいろんなパーツを買ってるのですが,つい手がすべってPICマイコンのライターPICkit2を買ってしまいました まったくの初心者で,アセンブラなんて一度も触ったことがないのですが,少しずつ勉強していこうかと考えています。
とりあえずZIFソケット基板を作ってみました。ここを参考にしました。感謝。
PICはWebにたくさん情報のある16F84Aを使ってみようと思います。

| | コメント (0) | トラックバック (0)

« 2011年3月 | トップページ | 2012年1月 »