; *************************************************************** ; リスト uart interrupt 20211022 ; *************************************************************** LIST P=PIC16F18326 ; 使用するPICを指定 INCLUDE "P16F18326.INC" ; 読み込む設定ファイルを指定 __CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _WDTE_OFF & _LPBOREN_OFF & _BOREN_OFF & _BORV_LOW & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __CONFIG _CONFIG3, _WRT_OFF & _LVP_ON __CONFIG _CONFIG4, _CP_OFF & _CPD_OFF ; *********************** 共通RAMエリア ************************** CBLOCK 0x70 DATA_INDEX IR_FLAG DLY_1 DLY_2 RxDATA ENDC ; *************************************************************** ORG 0 GOTO START ORG 4 ;void __interrupt() Rx_isr ========================== MOVLB 0x0 ; Bank 0 BTFSS PIR1, RCIF ; uart 受信からの割り込みか GOTO RTNINT ; 受信で無いなら復帰 ; 受信なら MOVLB 0x3 ; Bank 3 BTFSS RC1STA, OERR ; OERR 受信エラーか GOTO RX_OK ; 受信エラー無しなら BCF RC1STA, CREN ; エラーなら CREN OFF/ONで BSF RC1STA, CREN ; エラークリア GOTO RTNINT ; 復帰 ; 正常受信なら RX_OK MOVF RC1REG, W ; RxData = RC1REG; MOVWF RxDATA ; 受信データをRxDataに保管; XORLW 0x21 ; '!' か BTFSC STATUS, Z ; '!' なら GOTO CASRST ; case re-startへ MOVF RxDATA, W XORLW '1' ; '1' か BTFSC STATUS, Z ; '1' か GOTO CASONE ; case LED ONへ MOVF RxDATA, W XORLW '2' ; '2' か BTFSC STATUS, Z ; '2' なら GOTO CASTWO ; case LED OFFへ GOTO RTNINT ; case '1' // 1 なら CASONE MOVLB 0x2 ; Bank 2 BSF LATA, LATA2 ; LED 点灯 GOTO RTNINT ; case '2' // 2 なら CASTWO MOVLB 0x2 ; Bank 2 BCF LATA, LATA2 ; LED 消灯 GOTO RTNINT ; case ';' // ; なら CASRST RESET ; デバイスのリセット GOTO RTNINT RTNINT RETFIE ;void main ===================================== START MOVLB 0x1 ; Bank 1 MOVLW 0x3B ; 0b111011; MOVWF TRISA ; RA2 出力 他は すべて入力 MOVLW 0x3F ; 0b111111; MOVWF TRISC ; Port すべて入力 MOVLB 0x3 ; Bank 3 CLRF ANSELA ; すべてデジタル CLRF ANSELC ; すべてデジタル MOVLB 0x4 ; Bank 4 MOVLW 0xB ; 0b001011; MOVWF WPUA ; RA0-RA3 弱プルアップ ON MOVLW 0x20 ; 0b100000; MOVWF WPUC ; RC5 弱プルアップ ON MOVLB 0x1C ; Bank 1C MOVLW 0x4 ; RXPPS = 0x04; MOVWF RXPPS ; RA4->EUSART RX MOVLB 0x1D ; Bank 1D MOVLW 0x14 ; RA5PPS = 0x14; MOVWF RA5PPS ; RA5->EUSART TX ; ;//------------ Initialize UART ---------------------------- MOVLB 0x3 ; Bank 3 MOVLW 0x90 ; 0b10010000; MOVWF RC1STA ; 8 bit 連続受信 MOVLW 0x24 ; 0b00100100; MOVWF TX1STA ; 非同期送受信 High Baud Rate選択 MOVLW 0x8 ; 0b00001000; MOVWF BAUD1CON ; 115200 baud CLRF SP1BRGH ; SP1BRGH = 0; MOVLW 0x0 ; SP1BRG = 68; MOVWF SP1BRGH MOVLW 0x44 MOVWF SP1BRG ; LED 点滅 ------------------------------------ MOVLB 0x2 ; Bank 2 BSF LATA, LATA2 ; LED = 1; CALL DLY200 ; 200ms 遅延 MOVLB 0x2 ; Bank 2 BCF LATA, LATA2 ; LED = 0; CALL DLY200 ; 200ms 遅延 MOVLB 0x2 ; Bank 2 BSF LATA, LATA2 ; LED = 1; CALL DLY200 ; 200ms 遅延 MOVLB 0x2 ; Bank 2 BCF LATA, LATA2 ; LED = 0; CALL DLY200 ; 200ms 遅延 GOTO EN_INT ; __delay_ms(200); ----------------------- DLY200 MOVLB 0x0 ; Bank 0 MOVLW 0x9 MOVWF DLY_1 MOVLW 0x1E MOVWF DLY_2 MOVLW 0xE4 DLYUOOP DECFSZ WREG, F GOTO DLYUOOP DECFSZ DLY_2, F GOTO DLYUOOP DECFSZ DLY_1, F GOTO DLYUOOP RETURN ; ; UART Rx 割込みを使用許可 EN_INT MOVLB 0x1 ; Bank 1 BSF PIE1, RCIE ; UART Rx 割込みを使用許可 BSF INTCON, PEIE ; 周辺機能割込みの使用許可 BSF INTCON, GIE ; 全割込みの使用許可 ; ;; printf("Start\r\n"); // 準備完了を送信 CLRW CALL PRINT_MSG ; // ----------- 繰返し -------------------------------------------- LOOP GOTO LOOP ; while(1) ; ;-------------------------------------------------- ; Start と送信 ; WREG に送信する文字の先頭番号を持ってCALL ;-------------------------------------------------- PRINT_MSG MOVLB 0x0 ; BANK 0 選択 MOVWF DATA_INDEX ; 文字INDEXを 設定 P_NEXT MOVF DATA_INDEX,W ; 文字INDEXを W に取得 CALL MSG_DT ; 文字を W に取得 MOVF WREG,F ; 文字終端かテスト BTFSC STATUS,Z ; 終端文字なら RETURN ; リターン ; 送信する文字なら CALL PUTCH ; 一文字出力 ; 次の文字を準備 MOVLB 0x0 ; BANK 0 選択 INCF DATA_INDEX,F ; 文字INDEXを +1 GOTO P_NEXT ; 次の文字へ MSG_DT BRW DT "Start\r\n",0x00 DT "Hello OK\r\n",0x00 ;-------------------------------------------------- ; 一文字出力 WREG に送信する文字を持ってCALL ;-------------------------------------------------- PUTCH MOVLB 0x0 ; BANK 1 を選択 W_TXIF BTFSS PIR1, TXIF ; 送信終了待ち GOTO W_TXIF MOVLB 0x3 ; BANK 3 選択 MOVWF TX1REG ; 文字出力 RETURN ENDPGM MOVLP 0x0 END