//************************************************************** //16F1827 XC8 V1.35 コンパイラー // //UART 受信 // //OFF-RB4 X1-RB0 //X軸-RB6 X10-RB1 //Y軸-RB7 X100-RB3 //Z軸-RA0 // //A相−RA3 //B相−RA4 // //RX-RA3 //TX-RA4 // //************************************************************** */ #include #include #include "uart.h" //******************************************* //定数宣言 //******************************************* unsigned char RCV_Buff ; // データ受信リングバッファー unsigned char R_Buff[255]; int BuFF_in; int BuFF_out; int ccw; //左回転フラグ int p_count; //パルス生成カウント //******************************************* //PIN設定 //******************************************* #define oFF PORTBbits.RB4 #define xJiku PORTBbits.RB6 #define yJiku PORTBbits.RB7 #define zJiku PORTAbits.RA0 #define x1 PORTBbits.RB0 #define x10 PORTBbits.RB1 #define x100 PORTBbits.RB3 //#define oFF LATBbits.LATB4 //#define xJiku LATBbits.LATB6 //#define yJiku LATBbits.LATB7 //#define zJiku LATAbits.LATA0 //#define x1 LATBbits.LATB0 //#define x10 LATBbits.LATB1 //#define x100 LATBbits.LATB3 #define cwOut PORTAbits.RA3 #define ccwOut PORTAbits.RA4 //********************************************* //ONーOFF設定 //********************************************* #define sWitch_On 1 #define sWitch_OFF 0 #define p_Width 2500 //*********************************************** // 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 = ON // 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 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 = ON // PLL Enable (4x PLL enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = HI // 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) //*************************************************** // 割り込み処理(受信割込処理) //*************************************************** void interrupt InterReceiver( void ){ if (RCIF == 1) {// UART割込の場合 //リングバッファーに格納 if(BuFF_out !=((BuFF_in+1)&255)){//(BuFF_in+1)&255→(BuFF_in+1)%256と同等のマスク処理 R_Buff[BuFF_in]=RCREG; }//オーバーしたデーターは破棄 if(BuFF_in+1==256){BuFF_in=0;} else{BuFF_in++;} RCIF=0;//割り込みフラグクリアー } } void pulse_FR(void){//CWパルス生成 for(p_count=1;p_count<=5;p_count++){ switch(p_count){ case 1:cwOut=0; ccwOut=0; __delay_us(p_Width); break; case 2:cwOut=1; //ccwOut=0; __delay_us(p_Width); break; case 3://cwOut=1; ccwOut=1; __delay_us(p_Width); break; case 4:cwOut=0; //ccwOut=1; __delay_us(p_Width); break; case 5://cwOut=0; ccwOut=0; __delay_us(p_Width); break; } } } void pulse_BK(void){//CCWパルス生成 for(p_count=1;p_count<=5;p_count++){ switch(p_count){ case 1:cwOut=0; ccwOut=0; __delay_us(p_Width); break; case 2://cwOut=0; ccwOut=1; __delay_us(p_Width); break; case 3:cwOut=1; //ccwOut=1; __delay_us(p_Width); break; case 4://cwOut=1; ccwOut=0; __delay_us(p_Width); break; case 5:cwOut=0; //ccwOut=0; __delay_us(p_Width); break; } } } void Wait(unsigned int num) { int i ; // numで指定した回数だけ繰り返す for (i=0 ; i < num ; i++) { __delay_ms(10) ; // 10msプログラムの一時停止 } } //*********************************************************** // メイン処理 //*********************************************************** void main(void) { //初期設定 OSCCON = 0b01110000; //8Mhzx4(PLL_ON)....32Mhz //CMCON = 0b00000111; // コンパレータは使用しない(RA0-RA4はデジタル入力) CM1CON0 = 0; //コンパレータ1は使用しない CM2CON0 = 0; //コンパレータ2は使用しない   ANSELA = 0b00000000; // 全部デジタル ANSELB = 0b00000000; PORTA = 0x00; // 初期値 PORTB = 0x00; // 初期値 TRISA = 0b00000000 ; // RA5はINPUT Only 以外は出力 TRISB = 0b00000100 ; // RB2(RX)はINPUT RB2(TX)以外は出力 // USART機能設定 //APFCON0bits.RXDTSEL=1;//RX ==> RB2−別表記 //APFCON1bits.TXCKSEL=1;//TX ==> RB5 TXCKSEL=1; //TXはRB5 RXDTSEL=1; //RXはRB2 TXSTA = 0b00100100 ; // 送信情報:非同期モード 8ビット・ノンパリティー RCSTA = 0b10010000 ; // 受信情報設定 SPBRG = 103 ; // ボーレート19.2k(高速モード)に設定 //初期値設定 ccw=0; //正回転 p_count=0; //パルス生成変数 BuFF_in=0; //リングバッファーポインター BuFF_out=0; //リングバッファーポインター oFF=sWitch_On; //セレクター初期値 x1=sWitch_On; //セレクター初期値 cwOut=0; //A相パルス初期値 ccwOut=0; //B相パルス初期値 Wait(1000); //電源が安定するまで待つ //UART割込設定 RCIF=0; //UART割り込みフラグクリアー RCIE=1;//UART割り込み許可 //割り込み許可 PEIE = 1 ; // 周辺機器割込許可 GIE = 1 ; // 割込全体許可 while(1) { if(BuFF_out !=BuFF_in){//リングバッファーにデーターがある場合 RCV_Buff= R_Buff[BuFF_out]; if(BuFF_out+1==256){BuFF_out=0;} else{BuFF_out++;} // データ処理 switch(RCV_Buff){ case 'f':pulse_FR();//A相パルスの生成 putch('f');//デバッグ用 break; case 'b':pulse_BK();//B相パルスの生成 putch('b');//デバッグ用 break; //以下軸・モード選択 case '1':oFF=sWitch_On; asm("nop"); xJiku=sWitch_OFF; asm("nop"); yJiku=sWitch_OFF; asm("nop"); zJiku=sWitch_OFF; putch('1');//デバッグ用 break; case'2':xJiku=sWitch_On; asm("nop"); oFF=sWitch_OFF; asm("nop"); yJiku=sWitch_OFF; asm("nop"); zJiku=sWitch_OFF; putch('2');//デバッグ用 break; case '3':yJiku=sWitch_On; asm("nop"); oFF=sWitch_OFF; asm("nop"); xJiku=sWitch_OFF; asm("nop"); zJiku=sWitch_OFF; putch('3');//デバッグ用 break; case '4':zJiku=sWitch_On; asm("nop"); oFF=sWitch_OFF; asm("nop"); xJiku=sWitch_OFF; asm("nop"); yJiku=sWitch_OFF; putch('4');//デバッグ用 break; case '5':x1=sWitch_On; asm("nop"); x10=sWitch_OFF; asm("nop"); x100=sWitch_OFF; asm("nop"); putch('5');//デバッグ用 break; case '6':x1=sWitch_OFF; asm("nop"); x10=sWitch_On; asm("nop"); x100=sWitch_OFF; asm("nop"); putch('6');//デバッグ用 break; case '7':x1=sWitch_OFF; asm("nop"); x10=sWitch_OFF; asm("nop"); x100=sWitch_On; asm("nop"); putch('7');//デバッグ用 break; } } } }