//****************************************************************************** //PIC16F1783 XIDE V3.10 XC8 V1.35 // //送信プログラム // //外部割り込み //RB0←A相入力 RB1←Q(DIR入力) //状態割り込み //RA0←OFF RA1←X軸 RA2←Y軸 RA3←Z軸 RA4←X1 RA5←X10 RA6←X100 // //******************************************************************************* #include #include "uart.h" #define Q_sou PORTBbits.RB1 // PIC16F1783 Configuration Bit Settings // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = ON // Watchdog Timer Enable (WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #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 = ON // 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 VCAPEN = OFF // Voltage Regulator Capacitor Enable bit (Vcap functionality is disabled on RA6.) #pragma config PLLEN = OFF // 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 = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LPBOR = OFF // Low Power Brown-Out Reset Enable Bit (Low power brown-out is disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable (Low-voltage programming enabled) //****************************************************************************** //割り込み処理 //****************************************************************************** void interrupt Input( void ){ if(INTCONbits.IOCIF){ //状態割り込み処理 if(IOCAFbits.IOCAF0){ putch('1'); } if(IOCAFbits.IOCAF1){ putch('2'); } if(IOCAFbits.IOCAF2){ putch('3'); } if(IOCAFbits.IOCAF3){ putch('4'); } if(IOCAFbits.IOCAF4){ putch('5'); } if(IOCAFbits.IOCAF5){ putch('6'); } if(IOCAFbits.IOCAF6){ putch('7'); } INTCONbits.IOCIF=0; //状態割り込みフラグクリアー } if( INTCONbits.INTF){//外部割り込み処理 if(Q_sou==1){//CW回転の場合 putch('f'); } else{//CCW回転の場合 putch('b'); } INTCONbits.INTF=0;//外部割り込みフラグクリアー } } int put_uart0( char r ){ if(TXIF == 1) { /* 送信データなし? */ TXREG = r; return 1; } else { /* 先に送信中(今回のデータは送信せずに終了) */ return 0; } } // 指定した時間(num x 10ms)だけウエイトを行う処理関数 void Wait(unsigned int num) { int i ; // numで指定した回数だけ繰り返す for (i=0 ; i < num ; i++) { __delay_ms(10) ; // 10msプログラムの一時停止 } } // メインの処理 void main(){ //初期設定 OSCCON = 0b01111010 ; // 内部クロックは16MHzとする ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる) ANSELB = 0b00000000 ; // TRISA = 0b01111111 ; // RA0?RA6入力 RA7→出力 TRISB = 0b10000011 ; //RB7←RX RB6→TX TRISC = 0b10000000 ; //RC0?RC7 →未使用で出力に PORTA = 0b11111111 ; // 入力PIN をすべてhight PORTB = 0b00000000 ; // // USART機能の設定を行う //RXDTSEL = 1 ; // 2番ピン(RA5)をRX受信ピンとする //TXCKSEL = 1 ; // 3番ピン(RA4)をTX送信ピンとする TXSTA = 0b00100100 ; // 送信情報設定:非同期モード 8ビット・ノンパリティ RCSTA = 0b10010000 ; // 受信情報設定 SPBRG = 103 ; // ボーレートを9600(高速モード)に設定 //************************************************************************* //割り込み処理設定 //************************************************************************* //状態割り込み設定 IOCAP=0; //検出エッジの指定 IOCAN=0b11111111; //立ち下がりで検出 //外部割り込み設定 INTEDG = 0; //立ち上がりで検出 //割り込み許可 INTCONbits.IOCIE=1; //状態割り込み許可 INTCONbits.INTE=1; //外部割り込み許可 INTCONbits.PEIE = 1; // 周辺機器割込許可 INTCONbits.GIE = 1; // 割込全体許可 //割り込みフラグのクリアー INTCONbits.IOCIF=0; INTCONbits.INTF=0; Wait(500) ; // 5秒後に開始する while(1) {//無限ループ 処理は、割り込みで } }