« 2012年4月 | トップページ | 2012年6月 »

2012年5月

2012年5月30日 (水)

PICのお勉強(17) C言語編 ビットシフトでLEDの順送り点灯

RB0~RB7までの8つのLEDを1つずつ順送りで点灯してみました。
ソースはこれ→lesson17.c
以前,アセンブラでやったことのあるビットシフトを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;        //RB0だけ点灯させる
__delay_ms(100);

while(RB7 == 0){     //RB7が点灯するまで繰り返す  
PORTB = PORTB<<1;  //PORTBの内容を左に1ビットだけシフトする
__delay_ms(100);
}
}

 僕のテストボードに取りつけてあるRA2,RA3,RB0~RB7の10個のLEDを順送りで点灯させるプログラムはこれ→lesson17-2.c

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

2012年5月28日 (月)

PICのお勉強(16) C言語編 スイッチでLEDの点滅

 RA0のスイッチでRA2,RA3のLEDを点灯・消灯させてみました。
ソースは,コレ → lesson16.c

/************************************
16F84A HI-TECH C v.9.83
RA0のスイッチでRA2,RA3のLED点灯・消灯
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

main(void){

TRISA = 0b00011;          //RA0とRA1は入力に設定する
PORTA = 0b00000;         //はじめはLEDを消灯しておく

while(1){
while(RA0 == 1){   //RA0のスイッチがOFFの間は何もしない
NOP();
}
RA2 = 0;  //RA2は消灯
RA3 = 1;  //RA3を点灯
while(RA0 == 0){  //RA0のスイッチがONの間は何もしない
NOP();
}
__delay_ms(20); //チャタリング対策

while(RA0 == 1){  //RA0のスイッチがOFFの間は何もしない
NOP();
}
RA2 = 1;
RA3 = 0;
while(RA0 == 0){  //RA0のスイッチがONの間は何もしない
NOP();
}
__delay_ms(20);    //チャタリング対策

}
}

 ちょっとアセンブラくさいやり方かもしれないなあ。
もっとC言語らしいスマートな書き方があるのかも。・・・まいっか。

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

2012年5月26日 (土)

PICのお勉強(15)C言語編 10個のLED点滅

 テストボードに取り付けてある10個のLEDを点滅させてみました。
ソースはこれ→ lesson15.c

/************************************
16F84A HI-TECH C v.9.83
LED10個の点滅(周期1秒)
************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000 //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

main(void){

TRISA = 0b00011;    //RA0とRA1は入力,あとは出力
TRISB = 0b00000000; //PORTBは全部出力

while(1){
PORTA = 0b00100;
PORTB = 0b01010101;
__delay_ms(500); //500ms待つ

PORTA = 0b01000;
PORTB = 0b10101010;
__delay_ms(500);

}
}

 C言語の作法では,数値は16進数で書くのが基本みたいですが,僕はLEDの点灯パターンは2進数で書くのが好みだなあ。


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

2012年5月21日 (月)

金環日食@岐阜市

20120521 とりあえずお約束の,今朝デジタルカメラで撮った金環日食です。
 岐阜市は朝からすばらしい快晴で,絶好のコンディション(^^)
天気予報では「曇りときどき晴れ」だったので,ちょっと準備不足だったのですが,友人から貰った観測用フィルタとデジカメと三脚を持ち出して,自宅前の路上から撮影。まあ素人写真としてはよく撮れたほうかなー

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

2012年5月20日 (日)

PICのお勉強(14)C言語編 2個のLED交互点滅

 次は,RA2とRA3のLEDの交互点滅をやってみます。ソースはこれ

/***************************************************
16F84A  HI-TECH C PRO v.9.83
RA2とRA3のLEDを交互に点滅(周期1秒)
***************************************************/
#define _LEGACY_HEADERS
#include "PIC.h"
#define _XTAL_FREQ 20000000    //20MHz

__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

main(void){

TRISA = 0b00011;

while(1){
RA2 = 1;        //RA2を点灯
RA3 = 0;        //RA3を消灯
__delay_ms(500);   //500ms待つ

RA2 = 0;
RA3 = 1;
__delay_ms(500);

}
}

 ヘッダファイルの互換性の問題については,
#define _LEGACY_HEADERS と先頭に書けばOKみたいです。
 あとは,16F84Aにつけてあるセラロックのクロック周波数を定義して,__delay_ms(500)とか書けば,500msのタイムインターバルをとることができるのです。これで1秒周期で交互点滅させることができます。おー,これは簡単。

 なんか評判が良さそうだったので,参考書としてC言語ではじめるPICマイコン~フリーのCコンパイラではじめようって本を買いました。MPLAB IDEとPCC Lite(HI-TECH C PROの前バージョン)を使ってるから,僕の環境にピッタリです。


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

2012年5月19日 (土)

PICのお勉強(13)C言語編 LEDの点灯

 しばらくサボってたPICのお勉強を,アセンブラじゃなくてC言語で再開しようと思います。まあアセンブラがめんどくさくなっただけですな(笑)
 とりあえず,以前アセンブラでやったことをCでやり直してみるつもりです。とは言っても,C言語も生まれて初めてさわるので,どうなることかわかりませんが。
 コンパイラは,以前MPLAB IDE v.8.80をインストールしたときに同時に入ったHI-TECH C Compiler v.9.83を使います。テストボードは16F84Aを載せたこれです。

で,今日初めて書いたプログラムがコレ

/**************************
16F84A
RA2とRA3のLED点灯
**************************/

#include <pic.h>
__CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT);

void main (void)
{
// TRISA入出力設定  RA0,RA1は入力、RA2~RA4は出力
TRISA = 0b00011;

while(1)
{
// RA2とRA3点灯
PORTA = 0b01100;
}

}

 ところが,これをコンパイルするとエラーを連発します。
調べてみたところ,HI-TECH Cのv.9.81以降はヘッダファイルが全面改定されていて,__CONFIGの書き方が変わっちゃったんだそうです。20120519 手っ取り早い解決方法は,Build OptionのCompilerタブを開いてDefine macrosに「_LEGACY_HEADERS」と書いて,Addすることのようです。確かにこれでコンパイル成功(^^)
 しかし,こういう仕様変更をしたときは,上位互換にしとくもんじゃないですかねー。

 RA2とRA3に接続したLEDを点灯させるだけのプログラムですが,アセンブラより断然カンタンじゃないですか。
こりゃいいわー

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

2012年5月13日 (日)

名古屋市科学館 放電ラボ

1040048 物理部の生徒を連れて,名古屋市科学館へ遊びに行ってきました。
 昨年リニューアルして大変な人気みたいだったので,しばらく様子を見ていたのですが,「そろそろ空いてきたんじゃないの?」と思って行ってみたら,とんだ大間違いでした。
 写真のように,人気のプラネタリウムの入場整理券をもらうために,何百人も並んでいます。そばにいた科学館の職員に聞いたら「ゴールデンウィークは大変でしたけど,今日は空いてますよ(^-^)」だって。
1040090 仕方がないので,常設展示のみを見ることにして400円の入場券を買いました。(高校生は200円)
生命館はリニューアル前とほとんど同じですが,理工館の展示物が大幅に増えていて,ほんとに素晴らしいです。
 天井近くに設置してある巨大ウェーブマシン(縦波・横波)やモンキーハンティングの装置,音のフレネルレンズ,巨大トルネード実験装置など,目を見張る展示物が数多く新設されています。
 展示物を解説する職員やボランティアも以前に比べると増員されていましたが,入場者が多すぎて対応し切れていない様子でした。でも皆さん頑張ってらっしゃいました(^^)
 2枚目の写真は「放電ラボ」の巨大テスラコイル。客席は金網の中に入っていて静電シールドされています。
さすが,150万ボルトの放電はすごい迫力です。

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

2012年5月 1日 (火)

岐阜のローカル新聞で紹介されました

 先日,岐阜新聞社の取材依頼を受けて,記者に授業を見せてあげたんだけど,昨日の朝刊にそれが掲載されました。
Webサイトにも掲載されてたのでご紹介します。

2012年4月30日(月)岐阜新聞朝刊 【いま学校で】
http://www.gifu-np.co.jp/tokusyu/nie/ima/201204301.htm

 これで売り上げが下降線の一途をたどる(笑)拙著「高校物理雑記帳」が,また売れるかも?
ここですかさず宣伝(^-^)/


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

« 2012年4月 | トップページ | 2012年6月 »