« 2012年5月 | トップページ | 2012年7月 »

2012年6月

2012年6月30日 (土)

iPad Wi-FiモデルでソフトバンクWi-Fiスポットを使うには

Ipad 今さらだけど,「新しいiPad」をAppleStore(の通販)で買いました(6月23日注文,26日に到着)。32GBのWi-Fiモデルで色はブラックです。
 AppleStoreで買ったiPadは,ソフトバンクのWi-Fiスポットを2年間タダで使えるらしいんだけど,利用開始登録がなかなかうまくいきませんでした。きっと他にも困ってる人がいると思うので,ここに書いておきます。

 まず,このページに書いてあるような「iPad 個装箱の底面に貼付されているシール」なんてものはありません。AppleStoreからの商品出荷メールに書かれているURL http://www.i.sbwifi.jp に携帯電話から3G回線を使ってアクセスします。Wi-Fiでつないでるとアクセスできません。もちろん,パソコンでもダメです。
 で,アクセスしたそのサイトの「空メールを送信する」っていうハイパーリンクをクリックし,MMSメールを送ります。
直接 regist@i.sbwifi.jp にMMSメールを送ってもOKです。
そうすると,すぐに返信メールが返ってきて次の登録手続きに進むはずなんだけど,ここでつまずきました。
 僕のソフトバンクのAndoroidスマホDesire X06HTから何度MMSメールを送っても返信が返ってこないのです。もちろん僕のメールアドレスは,キャリアからもらった「○△□@softbank.ne.jp」ってやつ。何で返ってこないんだ。
 regist@i.sbwifi.jpが受信拒否されないよう,慎重に設定しましたが,全然ダメ。
このスマホに入れてるSIMカード(僕のDesire X06HTは,vodafone時代から使ってる赤いSIMカードが挿さってます)を以前使ってたガラケーに入れて空メールを送信したらどうかと思ってやってみたんだけど,やっぱり返信が返ってきません。ココに書いてある説明と違うじゃないか。ヘンだろ,それ。
 もうサポセンに電話するしかないかなー,と思ったんだけど,試しに妻のiPhone(メアドは■▼●@i.softbank.jp)から空メールを送ったら,次の瞬間には返信メールが届きました。どうなってるんだ。バカにしてんのか。
 その後,無事にWi-Fi利用開始手続きが進み,IDとパスワードが発行されました。近所の「ソフトバンクWi-Fiスポット」ステッカーの貼ってあるコンビニに出かけて,ちゃんと接続できることも確認しました。やれやれ。

 僕と同じところでつまずいてる人もいるんじゃないかな。ソフトバンクの登録システムはデキが悪くてどうしようもないから,ヘンだなと思ったらすぐサポセンに電話した方がいいかもしれませんよ。

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

2012年6月24日 (日)

PICのお勉強(27) C言語編 液晶ディスプレイ SD1602を使ってみる

Sd160216f84a 「ブレッドボードではじめる マイコンプログラミング」に載ってるプログラムを参考にして(この本には本当にお世話になりました),秋月電子で買ったSD1602っていうLCDモジュールを8bitモードで動作させてみました。8bitモードは,DB0~DB7の8ピンを使って文字コードと制御コード合わせて8bitのデータを1度にやりとりし,4bitモードはDB0~DB3の4ピンを使って,8bitのデータを二度に分けてやりとりするんだそうです。ふーん。
まあそれはともかく,このLCDは16ピンが一列に並んでるから,ブレッドボードに載せるのに具合が良いですな。
Sd1602 また,このLCDは,LEDバックライトを点けることができますが,この写真のようにJ3にハンダを盛り,R9に100Ωの抵抗をハンダ付けしてやると,15,16番ピンに電圧をかけなくてもバックライトが点灯するようになります。
 僕が買ったのは,バックライトがグリーンですが,オレンジの方が視認性が良いらしいですよ。今度買ってみようかな。
そういえば,コントラスト調整用の3番ピンは,GNDに落としちゃったけど,これで大丈夫なのかな。ちゃんと表示されてるから大丈夫ですよね。
Lesson27 LCDに14本もジャンパワイヤをつながなくちゃいけないので,なんだかぐちゃぐちゃになってますが,なんとかお約束の「Hello,World!」を表示させることができました。感動。
 ソースはこれ→lesson27.cですが,SD1602を8bitモードで動作させるための関数をまとめたヘッダファイルSD1602_8bit_mode.hも必要になります。HI-TECH Cで使えるように,オリジナルを少し改変してあります。
 これをlesson27.cと同じフォルダに入れておいてコンパイルすれば,ちゃんとHEXファイルができるはずです。

/************************************
16F84A HI-TECH C v.9.83
LCDモジュール  SD1602のテスト
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#include "SD1602_8bit_mode.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

void main(void)
{
char s[] = "Hello, world!";

TRISA = 0x00; //RA0~RA4は出力
PORTA = 0x00;
TRISB = 0x00; //RB0~RB7は出力
PORTB = 0x00;

SD1602_init(); // SD1602の初期化

while (1)
{
SD1602_clear(); // 表示クリア
SD1602_control(0x80); // カーソルを0行目の先頭に移動
SD1602_print(s); // テキストデータを表示
__delay_ms(1000);

SD1602_clear();
SD1602_control(0xC0); // カーソルを1行目の先頭に移動
SD1602_print(s);
__delay_ms(1000);
}
}

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

2012年6月23日 (土)

PICのお勉強(26) C言語編 2桁7セグLEDのダイナミック点灯

7segled22 2桁の7セグメントLEDを「ダイナミック点灯」という方法で点灯させてみました。
 この図のように,PIC16F84AのRB0~RB7のピンを7セグLEDに接続し,1桁めと2桁めの同じアルファベット記号の端子もブレッドボード上で接続しておきます。
また,PICマイコンのRA0とRA1を7セグLEDの13番端子と14番端子にそれぞれ接続します。
これで,RA0をLowレベルにすると1桁めの7セグLEDを,RA1をLowレベルにすると2桁めの7セグLEDを点灯させることができます。
201206187segled 次のような動作をプログラムしました。
 まずmain()で,2桁めの数字d1を0~9まで増やしつつ,1桁めの数字d0を0~9まで増やしていきます。(ネストをそのまま日本語にするとヘンなもんですな)
で,ときどきTMR0割り込みして,1桁めと2桁めの数字を交互に点灯させます。
 実際には交互に点灯してるのですが,人間の目には1桁めも2桁めも同時に点灯してるように見えるのです。これが「ダイナミック点灯」ってやつの仕掛けです。
ソースはこれ→lesson26.c

/************************************
16F84A HI-TECH C v.9.83
2桁7セグメントLEDのダイナミック点灯
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

unsigned char i;
unsigned char d0, d1;
unsigned char p[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void interrupt warikomi(void)
{
T0IF = 0; //TMR0割り込み禁止
i++;
if (i == 2)
{
i = 0;
}

if (i == 0)
{
PORTA = 0x1E; // 1桁目
PORTB = p[d0];
}
else
{
PORTA = 0x1D; // 2桁目
PORTB = p[d1];
}
}

main(void)
{
TRISA = 0x00; //RA0~RA4は出力
PORTA = 0x03; //RA0とRA1をHighレベルにする
TRISB = 0x00; //RB0~RB7は出力
PORTB = 0x00;
OPTION = 0x86; //プリスケーラ64
TMR0 = 0x00; //TMR0は0からスタート
T0IE = 1; //TMR0割り込み許可
GIE = 1; //すべての割り込み許可
i = 0;

while (1)
{
for (d1 = 0; d1 < 10; d1++)
{
for (d0 = 0; d0 < 10; d0++)
{
__delay_ms(500);
}
}
}
}


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

2012年6月17日 (日)

PICのお勉強(25) C言語編 7セグメントLEDを使ってみる

16f84a_7segled 7セグメントLEDを買ってきたので,点灯テストをしてみました。
カソードコモンのやつなので,回路図は左のようになります。
1~10の端子がそれぞれどのセグメントに接続されているのかがややこしいですが,なんとかブレッドボード上で配線完了。
7segled とりあえず,1~Fの数字を順に表示させるプログラムを作ってみました。
ソースはこれ→lesson25.c
 やってることは単純で,1~Fの数字の点灯パターンのデータを配列に格納し,順にPORTBに送り出しているだけです。
初めの頃にやった「LEDピカピカ」と大差ありませんが,7セグLEDが点灯するとなんだかカッコいいですな(・∀・)

/************************************
16F84A HI-TECH C v.9.83
7セグメントLEDの点灯
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

main(void){

TRISB = 0x00;
PORTB = 0x00;
int i;
char d[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77
,0x7c,0x39,0x5e,0x79,0x71};

while(1) {
for(i=0;i<16;i++) {
PORTB=d[i];
__delay_ms(500);
}
}
}


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

2012年6月16日 (土)

PICのお勉強(24) C言語編 電子オルガン

20120616 PIC16F84Aを使って簡易電子オルガンを作ってみました。この本に載ってたやつのパクリですが(^^;)
ソースはこれ→lesson24.c
 RB0~RB7にタクトスイッチをつないでキーボードとし,RA0にスピーカーをつなぎました。
本来,RB0~RB7のスイッチにはプルアップ抵抗が必要ですが,16F84Aが持つプルアップ機能を有効にすることで外部につなぐ抵抗を省くことができます。これは便利(・∀・)
20120615 プルアップ機能を有効にするには,OPTIONレジスタのビット7を0にすればよいので, OPTION = 0x7F; と書いてやります。
 プログラムのメイン部分は,switch-case文で,RB0~RB7のスイッチが押されると,始めに定義したbuzzerという関数でスピーカーを鳴らしています。
 例えば「ド」の音は,255μs間スピーカーをONにし,255μs間OFFにして,周期510μsの音を作っています。この周期が長いと低い音,短いと高い音となるわけです。

/************************************
16F84A  HI-TECH C v.9.83
電子オルガン
************************************/

#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 10000000 //10MHz
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

void buzzer_(unsigned short int t)
{
unsigned short int i;
PORTA = 0x01; //RA0をON
for (i = 0; i < t; i++)
__delay_us(1);
PORTA = 0x00; //RA0をOFF
for (i = 0; i < t; i++)
__delay_us(1);
}

void main(void)
{
TRISA = 0x00; //RA0~RA4は出力
TRISB = 0xFF; //RB0~RB7は入力
OPTION = 0x7F; //プルアップ有効
PORTA = 0x00;
PORTB = 0xFF;

while (1)
{
switch (PORTB)
{
case 0xFE : buzzer_(255); break; //ド
case 0xFD : buzzer_(226); break; //レ
case 0xFB : buzzer_(201); break; //ミ
case 0xF7 : buzzer_(191); break; //ファ
case 0xEF : buzzer_(170); break; //ソ
case 0xDF : buzzer_(151); break; //ラ
case 0xBF : buzzer_(134); break; //シ
case 0x7F : buzzer_(127); break; //ド
default : break;
}
}
}

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

2012年6月11日 (月)

PICのお勉強(23) C言語編 RB0/INT外部割り込み

16f84a2 PIC16F84Aテストボード(その2)のRB0/INTピンを入力端子としてタクトスイッチをつなぎ,RB1~RB7は出力端子としてLEDをつなぎました。
 RB0のタクトスイッチを押す(Lowレベルになる)と割り込み処理が行われるように,INTEDG = 0;(割込み条件を立下がりエッジにする)とします。さらにINTE = 1;(RB0/INT外部割込みを許可),GIE = 1;(すべての割り込みを許可)などをmain関数に書いておけばOKです。
 これで,スイッチを押すたびに7つのLEDを点滅させることができます。
ソースはこれ→lesson23.c
チャタリング対策として,__delay_ms(20);の待ち時間を適切に調節しましょう。

/************************************
16F84A  HI-TECH C v.9.83
RB0/INT外部割り込みでLEDの点滅
************************************/

#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

static void interrupt warikomi(void) //割り込み処理
{
INTF = 0; // RB0/INT外部割り込み禁止
RB1 = ~RB1; // RB0~7のLEDを点滅させる
RB2 = ~RB2;
RB3 = ~RB3;
RB4 = ~RB4;
RB5 = ~RB5;
RB6 = ~RB6;
RB7 = ~RB7;
__delay_ms(20);
}

main(void)
{
TRISB = 0b00000001; // RB0端子は入力端子,他は出力端子
INTEDG = 0; // 割込み条件を立下がりエッジにする
INTF = 0; // RB0/INT外部割込みフラグをクリア
INTE = 1; // RB0/INT外部割込み許可
GIE = 1; // すべての割り込み許可

RB1 = 1;
RB2 = 0;
RB3 = 1;
RB4 = 0;
RB5 = 1;
RB6 = 0;
RB7 = 1;

while(1){ //無限ループ
}
}

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

2012年6月10日 (日)

PIC16F84Aのテストボード その2

Sk16c84 先日,大阪日本橋のシリコンハウス共立で「PIC16C84テストボード(基板のみ)」ってのを買ったので,実験用のテストボードをもうひとつ作ってみました。
 この基板は,16F84Aの入出力ピンRA0~RA4とRB0~RB7がそれぞれ一列に並ぶように作られています。
Testboard2 そこに丸ピンソケットをハンダ付けし,ジャンパワイヤを使って8つのLEDや4つのタクトスイッチと自由に接続できるようにしてみました。
まあ,ブレッドボード使えよって話ですが(笑)
 次回は,これを使って「RB0/INT外部割り込み」の実験をしようと思います。

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

2012年6月 9日 (土)

PICのお勉強(22) C言語編 TMR0割り込みでLEDのPWM制御

 TMR0割り込みを使ってLEDをじわーっと点灯させたり消灯させたりのPWM制御をやってみました。ソースはこれ→lesson22.c
 「ブレッドボードではじめる マイコンプログラミング」って本に載ってたソースを参考にしました。この本,初心者向けでオススメです(^^)

/************************************
16F84A  HI-TECH C v.9.83
TIMER0割り込みでPWM制御
************************************/

#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

static unsigned short int count;
static unsigned short int duty;

static void interrupt warikomi(void)//0.2μs×256=51.2μsごとに割り込み処理
{
T0IF = 0; //TMR0割り込み禁止
if (count < duty)
{
PORTB = 0xFF; //点灯
}
else
{
PORTB = 0x00; //消灯
}

count++;
if (count == 100)
{
count = 0;
}
}

void main(void)
{
unsigned short int i;
TRISB = 0x00;
PORTB = 0x00;
count = 0;
duty = 0;
OPTION = 0x08; //プリスケーラを設定しない
TMR0 = 0x00; //TMR0は0からスタート
T0IE = 1; //TMR0割り込み許可
GIE = 1; //すべての割り込み許可

while (1)
{
for (i = 0; i <= 100; i++)
{
duty = i; //dutyを0から100まで増やす
__delay_ms(10); //10ms待つ
}

for (i = 0; i <= 100; i++)
{
duty = 100-i; //dutyを100から0まで減らす
__delay_ms(10);
}
}
}

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

2012年6月 5日 (火)

PICのお勉強(21) C言語編 TMR0割り込み

 PICを使うにあたって,TMR0割り込みは必ず身につけるべきテクニックみたいです。
 TMR0レジスタは,1命令サイクルごとに+1されていき,255から0に戻るときに割り込みが発生しますが,OPTIONレジスタの下位3ピット(PS2-PS0)を100として,32命令サイクル毎にTMR0レジスタが+1されるようにしてみました(プリスケーラレート32)。
 テストボードに取りつけてあるセラロックが20MHzなので,1クロックは0.05μs,1命令サイクルは0.2μsとなります。プリスケーラレートが32なので,0.2μs×32×256=1.6384msごとに割り込みが発生します。この割り込みを305回(約500ms)数えたらフラグを立てて,LEDの点滅を実行しました。
ソースはこれ→lesson21.c
 実際に割り込みをさせるには,T0IE = 1;(TMR0割り込み許可),GIE = 1;(すべての割り込み許可)の記述も必要です。また,割り込み処理の内容は,static void interrupt warikomi(void)などとして,記述しておきます。(「warikomi」は任意の関数名でOK)

/************************************
16F84A  HI-TECH C v.9.83
TIMER0割り込み
クロック20MHz→1クロック0.05μs→1命令サイクル0.2μs
プリスケーラレートを32とする
TMR0割り込み 0.2μs×32×256=1.6384ms
500ms÷1.6384ms=305.18回数えると500ms
************************************/

#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

static bit TFlag; //1.6384msを305回(500ms)数えたら立てるフラグ
static unsigned int count; //カウンタ

static void interrupt warikomi(void) //割り込み処理
{
T0IF = 0; // TMR0割り込み禁止
count++;
if (count == 305) //countが305(500ms)になったら,
{
TFlag = 1; // フラグを立てて,
count = 0; //countを0に戻す。
}
}

main(void)
{
OPTION = 0x84; // プリスケーラは32
TMR0 = 0x00; //TMR0は0からスタート(フリーラン)
T0IE = 1; // TMR0割り込み許可
GIE = 1; // すべての割り込み許可
count = 0;
TFlag = 0;
TRISB = 0b00000000;
PORTB = 0b01010101;

while(1)
{
if (TFlag) { //フラグが立っていたら,
PORTB = ~PORTB; // RB0~7のLEDを点滅させて
TFlag = 0; //フラグを降ろす
}
}
}

周期1秒でLEDが点滅するだけですが,とりあえず動画↓

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

2012年6月 4日 (月)

部分月食@岐阜市

20120604 今日,2012年6月4日(月)は満月なのですが,その一部が地球の影に入る部分月食となりました。
 僕が住んでいる岐阜市はあいにくの曇りでしたが,カメラを構えてじーっと待ってたら,午後8時間15分前後に少しだけ雲が薄くなりました。
 あまりよく写ってませんが,右下の方が少し欠けてる様子が分かります。でも今ひとつですなー(^-^;
6月6日の「金星の太陽面通過」に期待しましょうかね。

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

2012年6月 3日 (日)

PICのお勉強(20) C言語編 2進数カウントアップ&ダウン

 RA0のスイッチでカウントアップ,RA1のスイッチでカウントダウンする2進数カウンタを作ってみました。ソースはこれ→lesson20.c
C言語だと簡単にできちゃうなー。

/************************************
16F84A   HI-TECH C v.9.83
2進数カウンタ カウントアップ&ダウン
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

main(void){

// 入出力設定
TRISA = 0b00011;
TRISB = 0b00000000;
PORTA = 0b00011;
PORTB = 0b00000000;

while(1)
{
//スイッチRA0がON(0)の場合
if(RA0 == 0)
{
__delay_ms(20);

// スイッチRA0がONの間何もしない
while( RA0 == 0 )
;

__delay_ms(20);
PORTB = PORTB + 1; //カウントアップ
}

// スイッチRA1がON(0)の場合
else if(RA1 == 0)
{
__delay_ms(20);

// スイッチRA1がONの間何もしない
while(RA1 == 0)
;
__delay_ms(20);
PORTB = PORTB - 1; //カウントダウン
}
}
}

動作してるときの動画はこれと同じです。

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

2012年6月 2日 (土)

PICのお勉強(19) C言語編 配列を使ってLEDフラッシャ

 配列を使ってLEDフラッシャを作ってみました。
ソースはこれ→lesson19.c
さすが高級言語,配列が使えるんですね。あたりまえか。
 でも,16F84Aだと要素数をちょっと増やしただけで,RAMがいっぱいになってしまいます。なんと驚いたことにRAMが68bytesしかないんですな。
このプログラムでも配列をunsigned charにしないとダメでした。要素数は19しかないのにー(^^;)

/************************************
16F84A  HI-TECH C v.9.83
配列を使ってLEDフラッシャ
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

main(void){

unsigned short int i = 0;
unsigned char p[19] = {0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFE,0xFC,0xF8,
0xF0,0xE0,0xC0,0x80,0x00,0x00};

TRISB = 0b00000000;
PORTB = 0b00000000;

while(1){
while(i<18)
{
// 指定した点灯パターンでLEDを点灯
PORTB = p[i];
__delay_ms(100);
i++;
}

while(i>0)
{
PORTB = p[i];
__delay_ms(100);
i--;
}
}
}

動作してるとこの動画はコレと同じです。

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

2012年6月 1日 (金)

PICのお勉強(18) C言語編 ビットシフトでLEDを往復点灯

 RB0~RB7のLEDをビットシフトで往復点灯してみました。
ソースはこれ→lesson18.c

/************************************
16F84A     HI-TECH C v.9.83
ビットシフトでLEDを往復点灯
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

main(void){

TRISB = 0b00000000;
PORTB = 0b00000001;
__delay_ms(100);

while(1){
while(RB7 == 0){
PORTB = PORTB<<1;
__delay_ms(100);
}

while(RB0 == 0){
PORTB = PORTB>>1;
__delay_ms(100);
}
}
}

動作してる動画はこれと同じです。

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

« 2012年5月 | トップページ | 2012年7月 »