配線図とPICプログラミング(C言語)の備忘録
実際に車に取り付けたものは廉価版の12F509といううPICマイコンをもとにしたもの。
メイン基板 (スイッチボックス側)
実際にはロービームキャンセルスイッチも同じ基板に盛ったので↓だった。
リレー側 (テールライト側)
12F509用プログラム
PICkit3 + アダプタ(マルツオリジナル) ※マルツオンラインより
使用ソフト MPLAB X IDE v3.51
コンパイラ XC8 v1.40
******************************
// PIC12F509 Configuration Bit Settings
#include
#include
#include
// CONFIG
#pragma config OSC = IntRC
#pragma config WDT = OFF
#pragma config CP = OFF
#pragma config MCLRE = OFF
#pragma jis
// クロック周波数指定
// __delay_ms()関数が使用する
#define _XTAL_FREQ 4000000
int main (int argc, char** argv) {
// PICマイコン設定
OPTION = 0b10000000; //OPTION レジスタ設定,509は6bit目0でGP0,1,3プルアップ使用
OSCCAL = 0b11111110;
TRISGPIO = 0b00111000; // GP3,GP4,GP5のピンを入力モードに設定(ただしGP3ピンは常に入力モード)
// 時間計測の変数
unsigned short timer;
// 出力をを全OFFする
GPIO = 0x00;
// ループ処理
while(1){
// GP3,GP5スイッチが押されるまで待つ
while(GP3 == 1 && GP5 == 1){
}
if(GP3 == 0 && GP4 == 1){
// サンキューハザード: GP1点滅処理(2*2回繰り返す)
for(timer=0; timer<2; timer++){
// GP1を220msONする
GP1 = 1;
__delay_ms(220);
// GP1を100msOFFする
GP1 = 0;
__delay_ms(100);
// GP1を180msONする
GP1 = 1;
__delay_ms(180);
// GP1を700msOFFする
GP1 = 0;
__delay_ms(700);
}
// 1000ms待つ
__delay_ms(1000);
}
else if(GP3 == 0 && GP4 == 0){
// パパッとホーン: GP2点滅処理(2回)
// GP2を65msONする
GP2 = 1;
__delay_ms(65);
// GP2を70msOFFする
GP2 = 0;
__delay_ms(70);
// GP2を90msONする
GP2 = 1;
__delay_ms(90);
// GP2をOFFし、2500ms待つ
GP2 = 0;
__delay_ms(2500);
}
else if(GP4 == 1 && GP5 == 0){
// アイシテルのサイン: GP0点滅処理(5回繰り返す)
for(timer=0; timer<5; timer++){
// GP0を200msONする
GP0 = 1;
__delay_ms(200);
// GP0を200msOFFする
GP0 = 0;
__delay_ms(200);
}
// 1500ms待つ
__delay_ms(1500);
}
else{
// 車間ワーニング: GP0点滅処理(高速12回繰り返す)
for(timer=0; timer<12; timer++){
// GP0を100msONする
GP0 = 1;
__delay_ms(100);
// GP0を100msOFFする
GP0 = 0;
__delay_ms(100);
}
// 1000ms待つ
__delay_ms(1000);
}
}
// 以下の命令は実行されない
return (EXIT_SUCCESS);
}
******************************
実は整備手帳動画のほかにoutputにもう一種盛ってます。
高確率で使わんだろうけど。。。(余ってたのでテキトウに入れただけ)
上は最安部材のケースですが、
世の中の入門PICは、よりつぶしの利く12F1822という石です。
(こいつは509よりも世代が新しく、色々と便利な機能が入っている上に容量も少し大きい)
それを使った仕様の場合は以下の通り。
12F1822用メイン基板 (スイッチボックス側)

スイッチ側のプルアップはIC内部のプルアップですべて対応できる所が違います。
あと、IC端子の名前とか。
リレー側基盤は509版とまったく同一なので略。
12F1822用プログラム
ツールは同じ。
世代違いのせいか、同じ命令でもコマンドが微妙に違ってます。
******************************
// PIC12F1822 Configuration Bit Settings
#include
#include
#include
// PIC12F1822 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// クロック周波数指定
// __delay_ms()関数が使用する
#define _XTAL_FREQ 1000000
int main (int argc, char** argv) {
// PICマイコン設定
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
ANSELA = 0b00000000; // すべてのピンをデジタルモードに設定
TRISA = 0b00111000; // RA3,RA4,RA5のピンを入力モードに設定(ただしRA3ピンは常に入力モード)
OPTION_REG = 0b00000000; //プルアップを使用に設定
WPUA = 0b00111000 ; // RA3,RA4,RA5をプルアップに指定。1でする、0でしない
// 時間計測の変数
unsigned short timer;
// 出力をを全OFFする
LATA = 0x00;
// ループ処理
while(1){
// RA3,RA5スイッチが押されるまで待つ
while(RA3 == 1 && RA5 == 1){
}
if(RA3 == 0 && RA4 == 1){
// サンキューハザード: LATA1 点滅処理(2*2回繰り返す)
for(timer=0; timer<2; timer++){
// LATA1を220msONする
LATA1 = 1;
__delay_ms(220);
// LATA1を100msOFFする
LATA1 = 0;
__delay_ms(100);
// LATA1を180msONする
LATA1 = 1;
__delay_ms(180);
// LATA1を700msOFFする
LATA1 = 0;
__delay_ms(700);
}
// 1000ms待つ
__delay_ms(1000);
}
else if(RA3 == 0 && RA4 == 0){
// パパッとホーン: LATA2 点滅処理(2回)
// LATA2を65msONする
LATA2 = 1;
__delay_ms(65);
// LATA2を70msOFFする
LATA2 = 0;
__delay_ms(70);
// LATA2を90msONする
LATA2 = 1;
__delay_ms(90);
// LATA2をOFFし、2500ms待つ
LATA2 = 0;
__delay_ms(2500);
}
else if(RA4 == 1 && RA5 == 0){
// アイシテルのサイン: LATA0 点滅処理(5回繰り返す)
for(timer=0; timer<5; timer++){
// LATA0を200msONする
LATA0 = 1;
__delay_ms(200);
// LATA0を250msOFFする
LATA0 = 0;
__delay_ms(200);
}
// 1500ms待つ
__delay_ms(1500);
}
else{
// 車間ワーニング: LATA0 点滅処理(高速12回繰り返す)
for(timer=0; timer<12; timer++){
// LATA0を100msONする
LATA0 = 1;
__delay_ms(100);
// LATA0を100msOFFする
LATA0 = 0;
__delay_ms(100);
}
// 1000ms待つ
__delay_ms(1000);
}
}
// 以下の命令は実行されない
return (EXIT_SUCCESS);
}
******************************
1822の場合、出力時はRA*ではなくLATA*と入れたほうが都合いいらしいです。
石自体は\100/個前後と激安で、その他の回路部品も二束三文なんだけど、
PICkit等の周辺機器が全部で1万円弱するので貧乏人には敷居が高く今まで躊躇してたけれど、
自己啓発の一環として買ってしまいました。
しばらく遊べそうなのでいい買い物したかな。
飲みに行くのを1回我慢すればいいだけのことだしね笑
ブログ一覧 |
暇人の工作 | 日記
Posted at
2017/03/25 01:04:53