//************************************************************** //16F1827 XC8 V1.35 コンパイラー // //MPGデーターカウントプログラム // //カウント開始???s //カウント終了???e // // //UART 受信 // RX-RA3 // TX-RA4 // //************************************************************** */ #include #include #include #include "uart.h" //#define _XTAL_FREQ 32000000 // delayy用(クロック32MHz) //******************************************* //定数宣言 //******************************************* unsigned char RCV_Buff ; // データ受信バッファー unsigned char Count_key; unsigned char Count_data; unsigned char R_Buff[127]; unsigned char tmp[7]; int BuFF_in; int BuFF_out; int Flag ; //データ受信フラグ 1:受信完了 0:未受信 int ccw; //左回転フラグ int 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 #define locate(x,y) printf("\033[%d;%dH" ,x,y) //カーソル位置を移動 //********************************************* //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 (PIR1bits.RCIF == 1) { // UART割込の場合 if (RCIF == 1) {//リングバッファーに格納 if(BuFF_out !=((BuFF_in+1)&127)){ R_Buff[BuFF_in]=RCREG; }//オーバーしたデーターは破棄 if(BuFF_in+1==128){BuFF_in=0;} else{BuFF_in++;} //RCV_Buff = RCREG ; // レジスタからデータの受信 //Flag = 1 ; // 受信完了 RCIF=0; } } 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(高速モード)に設定 //リングバッファークリア初期値設定 BuFF_in=0; BuFF_out=0; Count_key='b'; //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設定 //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(500); //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"); printf("Input key=\r\n"); printf("Count Key=\r\n"); printf("Total =\r\n"); printf("\033[%dA" ,5);// while(1) { if(BuFF_out !=BuFF_in){//データーがある場合 Count_data= R_Buff[BuFF_out];//リングバッファーより計測データー取得 locate(2,0); printf("Input key= %c\r",Count_data);//入力データエコーバック if(BuFF_out+1==128){BuFF_out=0;}//リングバッファー出力のポインターを進める else{BuFF_out++;} if(Count_data=='s'){//計測開始 Count_key= R_Buff[BuFF_out-2]; locate(0,0); printf("On count \r"); locate(3,0); printf("Count Key= %c\r",Count_key); count=0; } if(Count_data==Count_key){//計測中 count++; } if(Count_data=='e'){//計測終了 locate(0,0); printf("Result \r",count); locate(4,0); printf("Total =%4d\r",count); } } else{ }//データがないときは、なにもしない。 } }