PICに入門し始めた

組み込みを以前からやりたいと思っていたのですが、ついにやる気が出てPICを始めました。最初はコンピュータ入門もかねてアセンブリでやろうかと思っていたのですが、さすがに組込入門とPICアーキテクチャ入門を同時にやるのは厳しいので、先にCで普通にかけるようになってからにします。PICはAVRよりも細かい品種が多数あって、特定用途に特化したチップが極めて安いのがポイントかと思います。

初心者によるメモなので、これは決して参考にしないように。あくまでも自分向けのログです。
購入したのはPICKit3です。買った翌週に4がでましたが、初心者なので気にしないことにします。Linuxでも一応開発はできるようですが、ひとまずWindowsで開発することとします。

チップは値段だけ見て適当に買ったPIC16F677というものです。I/Oが多いのがポイントらしいですが、現状特に活かしていません。また、入門書を参考にしてはいません。したほうがいいのかもしれないけど、気にいるものが今のところ見つかっていなくて…

  • ハマったところは以下の2点です
    PICKitからの給電は、設定で有効にしないとされない
  • __delay_ms() はインライン関数でコンパイラの時点で展開されてしまうので、定数のみ受け入れる。コンパイル時に特にエラーは出ないで静かに動かなくなる

ちょうど所属している鉄道研究会の新歓時だったので、ドアスイッチの接点状態が変化するとE233系などのドア上ランプと同じく0.3秒点滅を5回するものをつくってみました。こちらは内蔵クリスタルを使用しているため、回路が極めてシンプルです。

今後はハードウェアPWMをマスターして、Nゲージ鉄道模型を高精度に駆動できるコントローラを制作したいです。また、ソレノイドバルブ(電磁弁)を制御してエアシリンダを駆動できるものもそのうち作るつもりです。高精度で駆動するには外部Xtalが必要ですが、キャパシタが別途必要なのを失念していました。準備しないとー

ハードウェアPWMはなかなか鬼門で、PICの品種によって命令が全く異なります。結局は英文データシートを見てレジスタ構成を自分で把握して書いていく必要があります。ゆるりと頑張っていきたいです


// CONFIG
#pragma config FOSC = INTRCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Selection bits (BOR enabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#define _XTAL_FREQ 8000000
#include <xc.h>
void main(void) {
OSCCON = 0b01110000;
ANSEL = 0b00000000;
TRISC = 0b00000000;
PORTC = 0b00000000;
TRISB = 0b11111111;
unsigned char door_open = 0; // 接点が閉じている
unsigned char light_count = 0; // ON 5回 + OFF 5回
while (1){
if (PORTBbits.RB7 != door_open) {
door_open = !door_open;
light_count = 10;
}
if (light_count % 2){ // ON
PORTC = 0b11111111;
light_count –;
__delay_ms(300);
} else if (light_count) { // OFF
PORTC = 0b00000000;
light_count –;
__delay_ms(300);
} else {
PORTC = 0b00000000;
__delay_ms(100);
}
}
return;
}

カテゴリー: 鉄道, 電気電子 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中