前回はシャーシの加工をしました。
タミヤ1/24 ニスモR34 GT-R Z-tune 製作2 [シャーシの加工]
プラモデル、主にカーモデルの製作を備忘録として記録していこうと思っています。
プログラム
- 各種ライトの点灯、消灯
- ロー、ハイ、フォグ、テールのみPWMで光量を調節
- ウインカーの点滅
- 赤外線リモコンで操作
// 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 = OFF // Brown-out Reset Enable->Brown-out Reset disabled #pragma config CLKOUTEN = OFF // Clock Out Enable->CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin #pragma config IESO = ON // Internal/External Switchover->Internal/External Switchover mode is enabled #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable->Fail-Safe Clock Monitor is enabled // 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 = ON // Stack Overflow/Underflow Reset Enable->Stack Overflow or Underflow will 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
#include <xc.h> #include <stdbool.h> #include <pic16f1827.h> #define _XTAL_FREQ 16000000 void __interrupt () isr (void); //割り込み関数プロトタイプ宣言 int a,b,c,d,e,f; //リモコン2進数用変数 bool lowb,highb,pos,brake,winkerL,winkerR,plate; //各電飾用フラグ int Lpwm,Hpwm,Ppwm,Bpwm; //PWM用変数 void Lup(void); void Ldown(void); void Hup(void); void Hdown(void); void Pup(void); void Pdown(void); void Bup(void); void Bdown(void);つづいてピン設定とメインのプログラムです。
void main(void) {
// SCS INTOSC; SPLLEN disabled; IRCF 16MHz_HF;
OSCCON = 0x7A;
// TUN 0;
OSCTUNE = 0x00;
// SBOREN disabled;
BORCON = 0x00;
// WDTPS 1:65536; SWDTEN OFF;
WDTCON = 0x16;
LATA = 0x00;
LATB = 0x00;
TRISA = 0x00;
TRISB = 0x01;
ANSELB = 0x00;
ANSELA = 0x00;
WPUB = 0x00;
WPUA = 0x00;
OPTION_REGbits.nWPUEN = 1;
APFCON0 = 0x00;
APFCON1 = 0x00;
//Timer2設定
// PR2 255;
PR2 = 0xFF;
// TMR2 0;
TMR2 = 0x00;
// Clearing IF flag.
PIR1bits.TMR2IF = 0;
// T2CKPS 1:1; T2OUTPS 1:1; TMR2ON on;
T2CON = 0x04;
//PWM設定
//RB3 10ピン ポジションランプ
CCP1CON = 0x3C;
ECCP1AS = 0x00;
PWM1CON = 0x80;
PSTR1CON = 0x01;
CCPR1H = 0x00;
CCPR1L = 0x7F;
CCPTMRS0bits.C1TSEL = 0x0;
//RB6 13ピン ブレーキ
CCP2CON = 0x3C;
ECCP2AS = 0x00;
PWM2CON = 0x80;
PSTR2CON = 0x01;
CCPR2H = 0x00;
CCPR2L = 0x7F;
CCPTMRS0bits.C2TSEL = 0x0;
//RA3 2ピン ロービーム
CCP3CON = 0x3C;
CCPR3L = 0x7F;
CCPR3H = 0x00;
CCPTMRS0bits.C3TSEL = 0x0;
//RA4 3ピン ハイビーム
CCP4CON = 0x3C;
CCPR4L = 0x7F;
CCPR4H = 0x00;
CCPTMRS0bits.C4TSEL = 0x0;
// 割込み設定
INTCONbits.GIE = 1; //全体割込み許可
INTCONbits.INTE = 1; //RB0外部割込みオン
INTCONbits.INTF = 0; //外部割込みフラグ0
OPTION_REGbits.INTEDG = 0; //立下りを検出
a=0;b=0;c=0;d=0;e=0;f=0;
lowb=1;highb=0;pos=1;brake=1;winkerL=0;winkerR=0;plate=1;
Lpwm=50;Hpwm=50;Ppwm=50;Bpwm=50;
//メインプログラム
while(1){
//ロービーム
if(lowb == 1){
CCP3CON = 0x3C;
}
else{
CCP3CON = 0x00;
RA3 = 0;
}
//ハイビーム
if(highb == 1){
CCP4CON = 0x3C;
}
else{
CCP4CON = 0x00;
RA4 = 0;
}
//ポジションランプ
if(pos == 1){
CCP1CON = 0x3C;
}
else{
CCP1CON = 0x00;
RB3 = 0;
}
//ブレーキ
if(brake == 1){
CCP2CON = 0x3C;
}
else{
CCP2CON = 0x00;
RB6 = 0;
}
//ナンバー灯
if(plate == 1){
RB4 = 1;
}
else{
RB4 = 0;
}
//ウインカー
//左のみ
if(winkerL == 1 && winkerR == 0){
RA1 = 1;
RA7 = 0;
__delay_ms(330);
RA1 = 0;
RA7 = 0;
__delay_ms(330);
}
//右のみ
if(winkerL == 0 && winkerR == 1){
RA1 = 0;
RA7 = 1;
__delay_ms(330);
RA1 = 0;
RA7 = 0;
__delay_ms(330);
}
//左右(ハザード)
if(winkerL == 1 && winkerR == 1){
RA1 = 1;
RA7 = 1;
__delay_ms(330);
RA1 = 0;
RA7 = 0;
__delay_ms(330);
}
//ウインカーオフ
if(winkerL == 0 && winkerR == 0){
RA1 = 0;
RA7 = 0;
}
} //while
} //main
//割り込み処理(リモコン受信)
void __interrupt () isr (void){
INTCONbits.GIE = 0; //全体割り込み不許可
INTCONbits.INTE = 0; //外部割り込み不許可
while(INTF == 1){
a=0;b=0;c=0;d=0;e=0;f=0;//2進数用データ
if(RB0 == 0) //スタートビット検出
__delay_us(300);
else break; //検出できなかった場合割り込み終了
if(RB0 == 0) //スタートビット確認
__delay_us(600);
else break;
//ここから2進数解析
if(RB0 == 0) //受信する2進数1ケタ目
b = 1; //1なら1を代入
__delay_us(600);
if(RB0 == 0) //受信する2進数2ケタ目
c = 5; //1なら5を代入
__delay_us(600);
if(RB0 == 0) //受信する2進数3ケタ目
d = 10; //1なら10を代入
__delay_us(600);
if(RB0 == 0) //受信する2進数4ケタ目
e = 20; //1なら20を代入
__delay_us(600);
if(RB0 == 0) //受信する2進数5ケタ目
f = 50; //1なら50を代入
__delay_us(600);
//2進数解析ここまで
//ここからストップビット
if(RB0 == 0) //ストップビット1
__delay_us(600);
else break; //検出できなかった場合は割り込み終了
if(RB0 == 1)//ストップビット0
__delay_us(600);
else break;
if(RB0 == 0) //ストップビット1
__delay_us(600);
else break;
if(RB0 == 1)//ストップビット0
__delay_us(600);
else break;
if(RB0 == 0) //ストップビット1
a=b+c+d+e+f; //受信した2進数の代入値を合計
else break;
//ロービームオンオフ
if(a == 51){
lowb = !lowb;
}
//ロービーム光量アップ
if(a == 21){
Lup();
}
//ロービーム光量ダウン
if(a == 11){
Ldown();
}
//ハイビームオンオフ
if(a == 5){
highb = !highb;
}
//光量アップ
if(a == 10){
Hup();
}
//光量ダウン
if(a == 20){
Hdown();
}
//ポジションランプオンオフ
if(a == 15){
pos = !pos;
}
//光量アップ
if(a == 30){
Pup();
}
//光量ダウン
if(a == 70){
Pdown();
}
//ブレーキオンオフ
if(a == 25){
brake = !brake;
}
//光量アップ
if(a == 76){
Bup();
}
//光量ダウン
if(a == 56){
Bdown();
}
//ナンバー灯オンオフ
if(a == 66){
plate = !plate;
}
//右ウインカーオンオフ
if(a == 61){
winkerR = !winkerR;
}
//左ウインカーオンオフ
if(a == 50){
winkerL = !winkerL;
}
//全てオフ
if(a == 6){
if(lowb==1 || highb==1 || brake==1 || pos==1 || winkerL==1 || winkerR==1 || plate==1){
lowb = 0;
highb = 0;
brake = 0;
pos = 0;
winkerL = 0;
winkerR = 0;
plate = 0;
}
else if(lowb==0 && highb==0 && brake==0 && pos==0 && winkerL==0 && winkerR==0 && plate==0){
lowb = 1;
brake = 1;
pos = 1;
plate = 1;
}
}
break;
} //while
INTCONbits.INTF = 0; //フラグをゼロクリア
INTCONbits.GIE = 1; //全体割り込み許可
INTCONbits.INTE = 1; //外部割込み許可
} //INT
void Lup(){
if(Lpwm<100){
Lpwm += 10;
switch(Lpwm){
case 10:
CCPR3L = 0x19;
break;
case 20:
CCPR3L = 0x33;
break;
case 30:
CCPR3L = 0x4C;
break;
case 40:
CCPR3L = 0x66;
break;
case 50:
CCPR3L = 0x7F;
break;
case 60:
CCPR3L = 0x99;
break;
case 70:
CCPR3L = 0xB2;
break;
case 80:
CCPR3L = 0xCC;
break;
case 90:
CCPR3L = 0xE5;
break;
case 100:
CCPR3L = 0xFF;
break;
} //switch
} //if
} //Lup
void Ldown(){
if(Lpwm>10){
Lpwm -= 10;
switch(Lpwm){
case 10:
CCPR3L = 0x19;
break;
case 20:
CCPR3L = 0x33;
break;
case 30:
CCPR3L = 0x4C;
break;
case 40:
CCPR3L = 0x66;
break;
case 50:
CCPR3L = 0x7F;
break;
case 60:
CCPR3L = 0x99;
break;
case 70:
CCPR3L = 0xB2;
break;
case 80:
CCPR3L = 0xCC;
break;
case 90:
CCPR3L = 0xE5;
break;
case 100:
CCPR3L = 0xFF;
break;
} //switch
} //if
} //Ldown
void Hup(){
if(Hpwm<100){
Hpwm += 10;
switch(Hpwm){
case 10:
CCPR4L = 0x19;
break;
case 20:
CCPR4L = 0x33;
break;
case 30:
CCPR4L = 0x4C;
break;
case 40:
CCPR4L = 0x66;
break;
case 50:
CCPR4L = 0x7F;
break;
case 60:
CCPR4L = 0x99;
break;
case 70:
CCPR4L = 0xB2;
break;
case 80:
CCPR4L = 0xCC;
break;
case 90:
CCPR4L = 0xE5;
break;
case 100:
CCPR4L = 0xFF;
break;
} //switch
} //if
} //Hup
void Hdown(){
if(Hpwm>10){
Hpwm -= 10;
switch(Hpwm){
case 10:
CCPR4L = 0x19;
break;
case 20:
CCPR4L = 0x33;
break;
case 30:
CCPR4L = 0x4C;
break;
case 40:
CCPR4L = 0x66;
break;
case 50:
CCPR4L = 0x7F;
break;
case 60:
CCPR4L = 0x99;
break;
case 70:
CCPR4L = 0xB2;
break;
case 80:
CCPR4L = 0xCC;
break;
case 90:
CCPR4L = 0xE5;
break;
case 100:
CCPR4L = 0xFF;
break;
} //switch
} //if
} //Hdown
void Pup(){
if(Ppwm<100){
Ppwm += 10;
switch(Ppwm){
case 10:
CCPR1L = 0x19;
break;
case 20:
CCPR1L = 0x33;
break;
case 30:
CCPR1L = 0x4C;
break;
case 40:
CCPR1L = 0x66;
break;
case 50:
CCPR1L = 0x7F;
break;
case 60:
CCPR1L = 0x99;
break;
case 70:
CCPR1L = 0xB2;
break;
case 80:
CCPR1L = 0xCC;
break;
case 90:
CCPR1L = 0xE5;
break;
case 100:
CCPR1L = 0xFF;
break;
} //switch
} //if
} //Pup
void Pdown(){
if(Ppwm>10){
Ppwm -= 10;
switch(Ppwm){
case 10:
CCPR1L = 0x19;
break;
case 20:
CCPR1L = 0x33;
break;
case 30:
CCPR1L = 0x4C;
break;
case 40:
CCPR1L = 0x66;
break;
case 50:
CCPR1L = 0x7F;
break;
case 60:
CCPR1L = 0x99;
break;
case 70:
CCPR1L = 0xB2;
break;
case 80:
CCPR1L = 0xCC;
break;
case 90:
CCPR1L = 0xE5;
break;
case 100:
CCPR1L = 0xFF;
break;
} //switch
} //if
} //Pdown
void Bup(){
if(Bpwm<100){
Bpwm += 10;
switch(Bpwm){
case 10:
CCPR2L = 0x19;
break;
case 20:
CCPR2L = 0x33;
break;
case 30:
CCPR2L = 0x4C;
break;
case 40:
CCPR2L = 0x66;
break;
case 50:
CCPR2L = 0x7F;
break;
case 60:
CCPR2L = 0x99;
break;
case 70:
CCPR2L = 0xB2;
break;
case 80:
CCPR2L = 0xCC;
break;
case 90:
CCPR2L = 0xE5;
break;
case 100:
CCPR2L = 0xFF;
break;
} //switch
} //if
} //Bup
void Bdown(){
if(Bpwm>10){
Bpwm -= 10;
switch(Bpwm){
case 10:
CCPR2L = 0x19;
break;
case 20:
CCPR2L = 0x33;
break;
case 30:
CCPR2L = 0x4C;
break;
case 40:
CCPR2L = 0x66;
break;
case 50:
CCPR2L = 0x7F;
break;
case 60:
CCPR2L = 0x99;
break;
case 70:
CCPR2L = 0xB2;
break;
case 80:
CCPR2L = 0xCC;
break;
case 90:
CCPR2L = 0xE5;
break;
case 100:
CCPR2L = 0xFF;
break;
} //switch
} //if
} //Bdown




0 件のコメント :
コメントを投稿