<<HOME   
KITE 18~22    製作~飛行         (C)inakakoubouKANAI 2023-2024 

























// ------------------------------------------------------------------
// Z-WING  PIC12F1572 (C)2023.11.17 inakakoubouKANAI
// ------------------------------------------------------------------
#include <xc.h>
#define _XTAL_FREQ 8000000 //delayマクロ用 8MHz (4MHzだとカウント不足)
//CONFIG
#pragma config FOSC = INTOSC // 内蔵クロック使用
#pragma config WDTE = OFF // Watchdog Timerを無効
#pragma config PWRTE = ON // Power-up Timerを有効
#pragma config MCLRE = OFF // MCLRは、デジタル入力 内部でVDDに接続
#pragma config CP = OFF // コードプロテクトは無効
#pragma config BOREN = ON // ブラウンアウトは、有効
int CHIN0; //GP5 CH1ジャイロからのニュートラル値 ( intだと遅すぎる)
int CHIN1; //GP5 CH1ジャイロからの入力信号数
int CHIN2; //GP4 ミキシングされる受信機CH2の入力信号、GP0 サーボ出力信号
int bak1;
int j; //ワーク
//ミキシングしてサーボに出力 GP0
void out_servo(int S)
{
RA0=1;
j=0;
S=S + 0; //ニュートラル補正
while (j<S)
{
j++;
__delay_us(30); //出力感度
}
RA0=0;
}
//ラダーのニュートラルCHIN0の取得 GP4
void read_0()
{
CHIN0=0;
while (RA4==1); //ラダー信号切れるまで待つ
while (RA4==0); //ラダー信号あるまで待つ
while (RA4==1)
{
CHIN0++;
__delay_us(36); //10μs(0.01ms)信号幅1520μs(1.52ms)
}
bak1=CHIN0;
}
//現在のラダーCHIN1 GP4 とエルロンorフラップCHIN2 GP5
void read_12()
{
CHIN1=0;
CHIN2=0;

if((CHIN1 == 0) && (CHIN2 == 0) && (RA4 == 0))
{
while (RA4 == 0); //ラダー信号あるまで待つ
while (RA4 == 1)
{
CHIN1++;
__delay_us(36); //10μs(0.01ms)信号幅1520μs(1.52ms)
}
CHIN1=CHIN1 - 0;
}
if((CHIN1 == 0) && (CHIN2 == 0) && (RA5 == 0))
{
while (RA5 == 0); //ラダー信号あるまで待つ
while (RA5 == 1)
{
CHIN2++;
__delay_us(36); //10μs(0.01ms)信号幅1520μs(1.52ms)
}
CHIN2=CHIN2 - 0;
}

}
void read_22()
{
while((CHIN1 == 0) || (CHIN2 == 0))
{
if((CHIN1 == 0) && (RA4 == 0))
{
while (RA4 == 0); //ラダー信号あるまで待つ
while (RA4 == 1)
{
CHIN1++;
__delay_us(36); //10μs(0.01ms)信号幅1520μs(1.52ms)
}
CHIN1=CHIN1 - 0;
}
if((CHIN2 == 0) && (RA5 == 0))
{
while (RA5 == 0); //ラダー信号あるまで待つ
while (RA5 == 1)
{
CHIN2++;
__delay_us(36); //10μs(0.01ms)信号幅1520μs(1.52ms)
}
CHIN2=CHIN2 - 0;
}
}
}
void mix_2to1()
{
__delay_ms(3500); //3500ms以上待って、送信機の信号を受けてからの信号が来るのを待つ
read_0();
while(1)
{
read_12();
out_servo(bak1);
//----------機体ごとに設定する-----------
read_22();
//ラダー→小 出力→大  PICの記号12
//if (CHIN1 <= CHIN0){
// CHIN2=CHIN2 + CHIN0 - CHIN1;
// }
//ラダー→小 出力→小  PICの記号11
if (CHIN1 <= CHIN0 ){
CHIN2=CHIN2 - CHIN0 + CHIN1;
}
//ラダー→大 出力→大  PICの記号22
// if (CHIN1 >= CHIN0){
// CHIN2=CHIN2 - CHIN0 + CHIN1;
// }
//ラダー→大 出力→小  PICの記号21
// if (CHIN1 >= CHIN0 ){
// CHIN2=CHIN2 + CHIN0 - CHIN1;
// }
//----------------------------------------
bak1=CHIN2;
out_servo(bak1);
}
}
void main(void)
{
//レジスタの設定
OSCCON=0x70; //クロック周波数を8MHzに設定
TMR0=0x00; //初期値0
ANSELA = 0b00000000 ; //全てのピンをデジタルモードに設定
OPTION_REGbits.nWPUEN = 0; // 入力ピンのプルアップ無効化を解除
OPTION_REG = 0b00000010 ;
WPUA=0x30; //GP5,4にプルアップ抵抗を設定
TRISA = 0b00110000 ; //右からRA0,RA1,RA2,X,RA4,RA5 4,5を入力
INTCON=0x00; //割り込み不可
PORTA = 0b00000000; // 出力ピンの初期化(全てLOWにする)

mix_2to1();
while(1){}
}