//************************************************************** //16F1827 XC8 V1.35 コンパイラー // //UART 受信 // //OFF-RB4 X1-RB0 //X軸-RB6 X10-RB1 //Y軸-RB7 X100-RB3 //Z軸-RA0 // //RX-RA3 //TX-RA4 // //************************************************************** */ #include #include #include "uart.h" //#define _XTAL_FREQ 32000000 // delayy用(クロック32MHz) //******************************************* //定数宣言 //******************************************* unsigned char RCV_Buff ; // データ受信バッファー int Flag ; //データ受信フラグ 1:受信完了 0:未受信 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 4000 //*********************************************** // 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) //*************************************************** // 割り込み処理(受信割込処理) //*************************************************** p_count void interrupt InterReceiver( void ){ // if (PIR1bits.RCIF == 1) { // UART割込の場合 if (RCIF == 1) { RCV_Buff = RCREG ; // レジスタからデータの受信 Flag = 1 ; // 受信完了 //RCIF=0; } } void pulse_FR(void){ 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){ 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; //パルス生成変数 oFF=1; x1=1; cwOut=0; ccwOut=0; //initUART(); //割込設定 // PIR1bits.RCIF = 0 ; // USART割込フラグ初期化 //PIE1bits.RCIE = 1 ; // USART割込許可 //TMR0割り込み //OPTION_REG = 0b00000111; //プリスケラ-を1 //TMR0=p_Width; //OPTION_REGbits.T0CS = 0; // タイマモードとして実行 //OPTION_REGbits.PS = 5; // プリスケーラ値(0:64倍) //OPTION_REGbits.PSA = 0; // プリスケーラをTMRモジュールで使用する //INT0IF=0;//割り込みフラグクリアー //TMR0IE = 0;//タイマー0割り込み不可 //TMR1設定 //T1CONbits.T1RUN = 1;//TMR1外部発振 //T1CONbits.T1CKPS1 = 0;//TMR1プリスケラ :00=1倍,01=2倍、 //T1CONbits.T1CKPS0 = 0;//TMR1プリスケラ :10=4倍、11=8倍 //T1CONbits.T1OSCEN = 0;//TMR1低電力モード //T1CONbits.nT1SYNC = 0;//TMR1非同期(外部周波数が内部より高い場合) //T1CONbits.TMR1CS = 0;//TMR1外部クロックを使用 //TMR1H = tMr1_Hight;// //TMR1L = tMr1_Low;//TMR1初期値 //TMR1IE =0;//TMR1割り込み許可 //TMR1ON =tMr1_START; //TMR1IF = 0;//TMR1フラグクリアー //TMR1ON =tMr1_START;//TMR1スタート Wait(1000); //UART割込設定 RCIF=0; //UART割り込みフラグクリアー RCIE=1;//UART割り込み許可 //割り込み許可 PEIE = 1 ; // 周辺機器割込許可 GIE = 1 ; // 割込全体許可 Flag = 0 ; // データー受信フラグのクリア PORTAbits.RA1=1; //PORTAbits.RA5=0; //printf("Press a key:\r\n"); while(1) { // USARTデータ受信処理 if (Flag == 1) {//パルスの生成 switch(RCV_Buff){ case 'f'://ccw=0; pulse_FR(); break; case 'b'://ccw=1; pulse_BK(); break; } if(RCV_Buff=='1'){ oFF=sWitch_On; asm("nop"); xJiku=sWitch_OFF; asm("nop"); yJiku=sWitch_OFF; asm("nop"); zJiku=sWitch_OFF; putch('1'); } if(RCV_Buff=='2'){ xJiku=sWitch_On; asm("nop"); oFF=sWitch_OFF; asm("nop"); yJiku=sWitch_OFF; asm("nop"); zJiku=sWitch_OFF; putch('2'); } if(RCV_Buff=='3'){ yJiku=sWitch_On; asm("nop"); oFF=sWitch_OFF; asm("nop"); xJiku=sWitch_OFF; asm("nop"); zJiku=sWitch_OFF; putch('3'); } if(RCV_Buff=='4'){ zJiku=sWitch_On; asm("nop"); oFF=sWitch_OFF; asm("nop"); xJiku=sWitch_OFF; asm("nop"); yJiku=sWitch_OFF; putch('4'); } if(RCV_Buff=='5'){ x1=sWitch_On; asm("nop"); x10=sWitch_OFF; asm("nop"); x100=sWitch_OFF; asm("nop"); putch('5'); } if(RCV_Buff=='6'){ x1=sWitch_OFF; asm("nop"); x10=sWitch_On; asm("nop"); x100=sWitch_OFF; asm("nop"); putch('6'); } if(RCV_Buff=='7'){ x1=sWitch_OFF; asm("nop"); x10=sWitch_OFF; asm("nop"); x100=sWitch_On; asm("nop"); putch('7'); } //RCV_Buff='8'; Flag = 0; RCIF=0; } } }