2015年6月 2日 (火)

PICのお勉強(37) C言語編 12F683でA/D変換

20150602 8ピンPICの定番,12F683でA/D変換をやってみました。
PICのお勉強(29)で16F88を使ってやったことを12f683に移植しただけですな。
10kΩVRを使って,12f683のGP4/AN3に0~3Vの電圧を入力,これを10bitのデジタル値に変換して,GP0に接続したLEDの点滅周期を変えています。

HI-TECH Cで書いたソースとhexファイルはコレ↓です。
「lesson37.c」をダウンロード
「lesson37.hex」をダウンロード

12f683_ad 16F88との違いは,ANSELレジスタやTRISIOレジスタの設定くらいでしょうか。詳細はこちらで確認して下さい。
最初,4ピンのGP3がAN3だと勘違いしていて,GP3にアナログ電圧を入力し,「プログラムは間違ってないはずなのに,全然動かないじゃないかー」としばらく悩みました(笑) この失敗は誰もがやるんじゃないかしらん。僕だけ?

ソースも貼っておきますね。

/**************************************
12F683 HI-TECH C v.9.83
GP4/AN3の入力をA/D変換,GP0のLED点滅周期変える
**************************************/

#include <htc.h>
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & BOREN_ON & MCLRE_OFF & CP_OFF & IESO_OFF & FCMEN_OFF);
#define _XTAL_FREQ 1000000 // PICのクロックは1MHz

unsigned int adconv();
unsigned int tmp;
unsigned int i;

void main(void)
{
OSCCON = 0b1000000; // 内蔵OSC 1MHz
ANSEL = 0b00001000; // GP4/AN3がアナログ入力,他はデジタル
CMCON0 = 0b00000111; // コンパレータを使わない
TRISIO = 0b00001000; // GP4/AN3は入力,その他は出力

while (1)
{
tmp = adconv();
GP0 = 1;
for(i = 0; i __delay_ms(2);
}
GP0 = 0;
for(i = 0; i __delay_ms(2);
}
}
}

unsigned int adconv()
{
ADCON0 = 0b10001101; //右詰,基準電圧はVdd,GP4/AN3の入力をA/D変換
__delay_us(25);
GO=1;
while(GO);
return (ADRESH<<8)+ADRESL;
}

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

2015年5月15日 (金)

UVレジンでLEDイルミネーション (2)

20150515 UVレジンで作ったLEDイルミをPIC12F683で点滅させてみました。
話の流れでいくとIchigoJamで光らせることになるところですが,LEDイルミを5個も作っちゃったので,久しぶりにPICでLチカです。
 これまで「PICのお勉強」では,16F84Aと16F88を使ってきましたが,定番の8ピンPIC,12F683を初めて使ってみました。小さくて安価なPICですが,これはこれでなかなか魅力的なやつです。単3電池2本で動くのもいいですね。

12f683_led_5 回路図はごく平凡なもので,GP0,GP1,GP2,GP4,GP5の5つにLEDをつなぎます。GP3は入力専用だから使えないんですね。
 今後のお勉強用に,12F683のテストボードを作って他に流用できるようにしてあります。PICkitを直接つないで書き込めるようにピンヘッダも取り付けてみました。
ソースはこんな↓具合です。GPIOに,LEDの点灯・消灯パターンを送って点滅させています。

/**************************************
12F683 HI-TECH C v.9.83
GP0~GP2,GP4,GP5のLED順次点灯
**************************************/

#include <htc.h>
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & BOREN_ON & MCLRE_OFF & CP_OFF & IESO_OFF & FCMEN_OFF);
#define _XTAL_FREQ 1000000 // PICのクロックは1MHz

void main(void)
{
OSCCON = 1000000; // 内蔵OSC 1MHz
ANSEL = 0b00000000; // デジタル
CMCON0 = 0b00000111; //コンパレータを使わない
TRISIO = 0b00001000; //GP3は入力,その他は出力

while (1)
{
GPIO = 0b00000001; //GP0点灯,他は消灯
__delay_ms(300);
GPIO = 0b00000010; //GP1点灯,他は消灯
__delay_ms(300);
GPIO = 0b00000100; //GP2点灯,他は消灯
__delay_ms(300);
GPIO = 0b00010000; //GP4点灯,他は消灯
__delay_ms(300);
GPIO = 0b00100000; //GP5点灯,他は消灯
__delay_ms(300);
}
}

HI-TECH Cで書いたソースとhexファイルはこちら↓
「lesson36.c」をダウンロード
「lesson36.hex」をダウンロード

 

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

2015年5月13日 (水)

UVレジンでLEDイルミネーション (1)

Uv1 facebookのIchigoJam-FANで紹介されていた,セリアで販売されているUVレジンとグミ型で,LEDイルミネーションを作ってみました。
知らなかったんだけど,UVレジンというのは紫外線で硬化する樹脂で,これでアクセサリを作ったりするのが,手芸系女子に流行っているんだそうです。
百均ショップのセリアには4g入りのハードタイプとソフトタイプがあるのですが,とりあえずハードタイプを買ってみました。あと,台所用品コーナーでシリコン製のグミ型も。そうか,これを使ってグミを作っちゃう女子もいるのか。
Uv2 UVレジンというのはジェル状で,グミ型に入れたLEDの上にぶちゅ~っと垂らす感じで入れていきます。
あまり入れ過ぎると硬化に時間がかかるようなので,ボトルの半分2gぐらいにしておきます。
よく晴れた日なら太陽光でも30分くらいで硬化するらしいのですが,どうもうまくいかなかったので,ついAmazonでKIYOHARA スーパーレジンUVクリスタルランプ9W UVL9Wってのを買ってしまいました。
これを使うと10分程度でカチンカンチンに硬化します。これは面白い。
Uv3 グミ型の底の方の硬化が不十分なら,型から取り出して更にUVランプの光を数分間当ててやるとよさそうです。
 で,できあがったLEDイルミが左の写真。少し気泡が入ってますが,まずまずのデキでしょうか。
なんだか色んな物を作りたくなってきますな。ソフトタイプのUVレジンも買ってこようかな(^^)

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

2015年5月 5日 (火)

IchigoJamでプログラミング 『Nimゲーム』

 「三山崩し」とか「nimゲーム」と呼ばれている石取りゲームを作ってみました。
1個~7個の石からなる山を3つ作り(例えば『4個の山,7個の山,2個の山』),2人のプレイヤーが交互に「ひとつの山から1個以上(何個でもよい)石を取って」いき,最後にすべての山の石の数を0個にした者が勝ち,という単純なルールです。
 石の山はRND関数で作り,IchigoJamと対戦するのですが,実はこのゲームには必勝パターンがあります。IchigoJamはその必勝パターンに持ち込もうとしてきますから,こちらがぼーっとプレイしていると絶対負けてしまいますよ。どうやったら勝てるのか,調べてみてください(^^)

10 'イシトリGAME Nim
20 CLS:CLV:?"====イシトリGAME Nim====":?
30 FOR I=0TO2
40 LET[I],RND(8):IF[I]=0 GOTO40
50 NEXT
60 GOSUB250
70 T=0:?"Your Turn :";
80 ?" ドノヤマ ?";
90 R=INKEY():IF R=0 GOTO90
100 ?CHR$(R);:INPUT" イクツ トリマスカ?",S
110 ?:LET[R-65],[R-65]-S:GOSUB250
120 LET N,[0]^[1]^[2]
130 '?"NIM",N
140 FOR I=0TO2
150 LET [10+I],[I]-N^[I]:IF[10+I]>0 LET K,I
160 NEXT
170 T=1:?"My Turn : ";
180 IF N=0 GOSUB340
190 ?CHR$(65+K);"ノ ヤマカラ ";[10+K];"コ トリマス":?
200 LET[K],[K]-[10+K]
210 LET N,[0]^[1]^[2]
220 '?"NIM",N
230 GOSUB250
240 GOTO70
250 IF([0]=0)*([1]=0)*([2]=0)GOTO320
260 FOR I=0TO2
270 ?CHR$(65+I);:?" ";
280 IF[I]=0 ?" ";:?[I]:?:GOTO300
290 FORJ=1TO[I]:?" ";:?CHR$(233);:NEXT:?" ";[I]:?
300 NEXT
310 RETURN
320 IF T=0 ?"You Win!!"ELSE ?"You Lose・・・":?
330 END
340 LET K,0
350 IF[K]=0 K=K+1
360 IF[K]=0 K=K+1
370 LET[10+K],1
380 RETURN

雑な作り方をしているものですから,あんまり美しいプログラムではないですが,とりあえず動きます。「nim_game.txt」をダウンロード
明日,時間があったらもう少しちゃんと考えてみようかな。

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

2015年5月 2日 (土)

IchigoJam ⇔ WindowsPC シリアル通信

Teraterm IchigoJamで作ったプログラムをWindowsPCに保存したり,ネットで拾ったプログラムをIchigojamに送り込むのに,USBシリアル変換モジュールを使ってシリアル通信をする手順を書き残しておきます。自分用の備忘録ですね。
 WindowsPCにTeraTermをインストールしておいて,WindowsPCとIchigoJamをUSBシリアル変換モジュールを介して接続します。
TeraTermの設定は左のようにします。
ポートの番号が分からなかったら,デバイスマネージャを起動して,「ポート(COMとLPT)」で確認しましょう。これらの設定は「名前をつけて保存」しておくといいですね。

 設定が正しくできていれば,設定したシリアルポートで接続できるはずです。
IchigoJamで作ったプログラムをLISTコマンドで表示させると,WindowsPCのディスプレイ上に表示されるコンソール画面にも同じものが表示されます。これをマウスでドラッグ&コピーして,テキスト文書にペーストすればよいわけです。
逆に,他所で拾ってきたプログラムをWindowsPCのディスプレイ上のコンソール画面にコピー&ペーストすると,IchigoJamにゆっくりとしたスピードで送信されますから,IchigoJamのSAVEコマンドで保存すればOK。
Teraterm3 これがWindowsPCのディスプレイに表示させたIchigoJamのBASICプログラムリスト。
これは,今日作った「石取りゲーム」のプログラムです。RND関数で発生させた20~30個の石をPCとプレイヤーが交互に取り合って(1回につき,1~3個の石を取る),最後の1個を取らされたら負け,というよく知られたゲームですな。思いつきでたらたらプログラムを打って,試しに走らせてエラーが出たらその都度直す・・・といういい加減な作り方をする僕には,インタプリタのBASICってのは都合がいいんだよね。  「ishitori_game.txt」をダウンロード


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

2015年4月30日 (木)

IchigoJamでプログラミング 『Hit & Blow』

1070380 40年前,高校時代にクラスで流行ったゲーム「Hit & Blow」をIchigoJamのBASICで作ってみました。
これは出題者が0~9の異なる数字で作った4桁の数字を回答者が当てるというゲームで,数字も桁も合っている場合が「Hit」,その数字は合ってるけど桁の位置が間違っている場合は「Blow」です。
例えば問題が「3275」の場合,回答者が「5239かな?」と答えたら,出題者(パソコン)は「Hitは1つ,Blowは2つだね」と応ずるわけです。単純だけど,結構ハマります。もちろん高校時代は2人で紙と鉛筆を使って遊んでたんですけどね。
IchigoJam-FANにも投稿がありましたが,これは最近実装されたfor ~ nextを使って作ってみました。その昔,FM-8のF-BASICでも作ったことがあるのですが,IchigoJamのBASICによるソースはこれ↓
 
10 'HIT & BLOW
20 CLV:CLS:LC5,0:?"===== HIT & BLOW =====":?
30 LET[0],RND(9)
40 LET[1],RND(9)
50 IF[1]=[0]THEN GOTO40
60 LET[2],RND(9)
70 IF[2]=[1]OR[2]=[0] GOTO60
80 LET[3],RND(9)
90 IF[3]=[2]OR[3]=[1]OR[3]=[0] GOTO80
95 ' ?[0];[1];[2];[3]:?
100 H=0:B=0
110 ?"NUMBER? ";
120 LET[10],INKEY()
130 IF [10]=0 GOTO120
140 LET[10],[10]-48:?[10];
150 LET[11],INKEY()
160 IF[11]=O GOTO150
170 LET[11],[11]-48:?[11];
180 LET[12],INKEY()
190 IF[12]=0 GOTO180
200 LET[12],[12]-48:?[12];
210 LET[13],INKEY()
220 IF[13]=0 GOTO210
230 LET[13],[13]-48:?[13];
240 FOR I=0TO3
250 FOR J=10TO13
260 IF[I]<>[J] GOTO280
270 IF I+10=J H=H+1 ELSE B=B+1
280 NEXT:NEXT
290 ?" HIT ";H;" BLOW ";B
300 IF H=4 ?"========Congratulations!========"ELSE GOTO100

「HitAndBlow.txt」をダウンロード

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

«IchigoJam周辺機器ボードの製作