2020.10.10: Open 2020.12.15 Update |
||||
ファームウェアに組み込むレリーズとステッピングモータの制御 |
||||
|
||||
|
||||
プログラムリスト (Down Load) |
||||
1 /* 2 * File: newmain.c 3 * Author: M氏@Lab. of Eclips code 4 * 5 * Created on 2020/11/07 6 * Finished on 2020/12/15 7 */ 8 9 10 #include <xc.h> 11 #include <stdlib.h> 12 #include <stdio.h> 13 14 #pragma config WDTE = OFF 15 #pragma config PWRTE = ON 16 #pragma config MCLRE = ON 17 #pragma config BOREN = ON 18 #pragma config LVP = OFF 19 #pragma config CPD = OFF 20 #pragma config WRT = OFF 21 #pragma config CCPMX = RB3 22 #pragma config CP = OFF 23 #pragma config FOSC = HS 24 25 #define _XTAL_FREQ 12000000 //12MHz 26 27 void ContCapture(void); 28 void Polarization(void); 29 void Rotation(void); 30 void HDRCapture(void); 31 32 void main(void) { 33 34 //0は出力、1は入力 35 TRISA = 0b00000011; 36 TRISB = 0b00000111; 37 //全てデジタル 38 ANSEL = 0x00; 39 40 RB3 = 0; 41 RB4 = 0; 42 RB5 = 0; 43 RB6 = 0; 44 RB7 = 0; 45 RA0 = 1; 46 RA1 = 1; 47 RA2 = 0; 48 49 int i, k; 50 51 k = 0; 52 while(1){ 53 54 //音信号が入るまでE-M10に90秒毎にフォーカス信号を送る 55 while(k == 0) 56 { 57 //90秒に1回ループを抜ける設定 58 for(i=1; i<=9000; i++) 59 { 60 __delay_ms(10); 61 //音信号が入ったら動作開始LEDを点灯し 62 //Z6を連写し偏光撮影を開始する 63 //終了後ループを抜ける 64 if(RB2 == 0) 65 { 66 RB3 = 1; 67 k = 1; 68 ContCapture(); 69 Polarization(); 70 break; 71 } 72 //偏光撮影をする 73 else if((RB1 == 0)) 74 { 75 Polarization(); 76 } 77 //音信号で起動しなかった時の緊急時SWで起動 78 //偏光撮影とZ6で連写をする 79 else if(RA1 == 0) 80 { 81 Polarization(); 82 ContCapture(); 83 } 84 //Z6の連写のみ行う 85 else if(RA0 == 0) 86 { 87 ContCapture(); 88 } 89 } 90 //90秒毎にE-M10mkIIへフォーカス信号を送る 91 RB6 = 1; 92 __delay_ms(50); 93 RB6 = 0; 94 } 95 96 //先のループを抜けた後、次に音信号が入ったら連写する。 97 while(k == 1) 98 { 99 __delay_ms(20); 100 if(RB2 == 0 && k == 1){ 101 k = 0; 102 ContCapture(); 103 RB3 = 0; 104 break; 105 } 106 } 107 } 108 return ; 109 } 110 111 //Z6の18秒連写 112 void ContCapture(void) { 113 114 RB4 = 1; 115 __delay_ms(50); 116 RB5 = 1; 117 for(int m = 1; m<=10; m++) 118 __delay_ms(1800); 119 RB5 = 0; 120 __delay_ms(50); 121 RB4 = 0; 122 123 return; 124 } 125 126 //偏光撮影 127 void Polarization(void) { 128 //多段階撮像をする 129 void HDRCapture(void); 130 //フィルターターレットを回転させる 131 void Rotation(void); 132 133 for(int j=1; j<=10; j++) 134 { 135 HDRCapture(); 136 Rotation(); 137 //振動を抑えるため待つ 138 __delay_ms(500); 139 } 140 HDRCapture(); 141 142 //終了サイン 143 RB6 = 1; 144 __delay_ms(50); 145 RB6 = 0; 146 } 147 148 //E-M10mkIIのシャッターを2秒押す 149 void HDRCapture(void) 150 { 151 RB7 = 1; 152 __delay_ms(1800); 153 RB7 = 0; 154 __delay_ms(100); 155 return; 156 } 157 158 //偏光フィルターターレットを1/5回転させる 159 void Rotation(void) 160 { 161 int i, j, k; 162 163 //1ステップ30msから10ms迄増速 164 for(i = 10; i>= 1; i--) 165 { 166 for(k = 1; k <= 2; k++) 167 { 168 RA2 = 1; 169 for(j=0; j<i; j++){ 170 __delay_us(1000); 171 } 172 __delay_ms(5); 173 RA2 = 0; 174 for(j=0; j<i; j++){ 175 __delay_us(1000); 176 } 177 __delay_ms(5); 178 } 179 } 180 181 //1ステップ10msから30ms迄減速 182 for(i = 1; i<= 10; i++) 183 { 184 for(k = 1; k <= 2; k++) 185 { 186 RA2 = 1; 187 for(j = 0; j <= i; j++){ 188 __delay_us(1000); 189 } 190 __delay_ms(5); 191 RA2 = 0; 192 for(j = 0; j <= i; j++){ 193 __delay_us(1000); 194 } 195 __delay_ms(5); 196 } 197 } 198 return; 199 } |