JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

MPLABアセンブラ PIC16F1827 EUSARTテストその1

2024-11-15 20:33:28 | MPLAB アセンブラ
 MPLAB IDE v9.82, MPASM v5.51, PICKit3の環境で、PIC16F1827のEUSARTのテストをします。まず、送信テストをします。

 回路図です。今回もICSPでテストをします。
 PIC16F1827から送信した信号をシリアルUSB変換モジュールFT-234を通してパソコンに接続し、通信ソフトTeraTermで受信します。BaudRateは、9600bpsとします。



 PIC16F1827は、APFCON0とAPFCON1の設定で、各種機能のピン割り当てを変更することができます。
 今回は、APFCON0のbit7 RXDTSEL=0(RX/DT=RB1)、APFCON1のbit0 TXCKSEL=0(TX/CK=RB2)としました。



 通信プロトコルは、非同期、8bitとします。
  TXSTAは、TXEN=1,BRGH=1とします。(他のビットはデフォルト)

 RCSTAは、SPEN=1,CREN=1とします。(他のビットはデフォルト)

 PIC16F1827では、より広範囲なクロック、通信速度に対応するためにSPBRGレジスタが16bitに拡張され、SPBRGHとSPBRGLの2つになりました。8bitにするか16bitにするかは、BAUDCONレジスタのbit3 BRG16で設定します。今回は、8bitで使用しますので、BRG16=0とします。



 BaudRateを計算する式は、次の表のようにSYNC=0(非同期),BRG16=0(SPBRG 8bit),BRGH=1(高速モード)の時は、Fosc{16(n+1)}です。
 Fosc=4MHz=4000000Hz,BaudRate=9600bpsの時、SPBRGの値は、25となります。(SPBRGL=25)


 この値は、説明書にも掲載されています。誤差は、0.16%です。



 "Hello World!"の後に、数値を0から255までカウントアップしながら、1秒ごとに送信するプログラムを作ってみました。

------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 EUSART TEST
; 2024.11.15
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              
              LIST      P=PIC16F1827
              INCLUDE           P16F1827.INC
              
              __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
     __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
              
              ERRORLEVEL    -302
              
              CBLOCK             020h
              CNT1ms
              CNT250ms
              COUNTER
              BYTE0
              DIGIT12
              DIGIT34
              SHIFT
              WORK1
              TEMP
              ENDC

SETUP
;クロック設定
              BANKSEL           OSCCON
              MOVLW              b'01101000'         ;PLLなし、4MHz,Fosc
              MOVWF              OSCCON
;入出力設定
              BANKSEL           ANSELA
              CLRF     ANSELA                            ;AN0-AN4使用しない
              CLRF     ANSELB                            ;AN5-AN11使用しない
              BANKSEL           TRISA
              CLRF     TRISA                 ;PORTAは全て出力(RA5は入力)
              MOVLW              b'00000010'       ;RB1は入力、他は出力
              MOVWF              TRISB
;USART設定
;RX,TX PIN 設定
              BANKSEL           APFCON0
              BCF                     APFCON0,7        ;RXDTSEL=0 RX=RB1
              BCF                     APFCON1,0        ;TXCKSEL=0 TX=RB2     
              BANKSEL           TXSTA
              MOVLW              b'00100100'
              MOVWF              TXSTA                ;非同期モード、高速通信モードBRGH=1
;             BANKSEL           RCSTA
              MOVLW              090h
              MOVWF              RCSTA                ;受信可、非同期モード
;             BANKSEL           BAUDCON
              BCF                     BAUDCON,3      ;BRG16=0 BRG 8bit
              MOVLW              019h                    ;019h=25
              MOVWF              SPBRGL                            ;Fosc=4MHz,Baud Rate=9600bps

              CLRF     COUNTER                        ;COUNTERクリア
                            
MAIN
              MOVLW              "H"
              CALL     SENDCHR
              MOVLW              "e"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "o"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR
              MOVLW              "W"
              CALL     SENDCHR
              MOVLW              "o"
              CALL     SENDCHR
              MOVLW              "r"
              CALL     SENDCHR
              MOVLW              "l"
              CALL     SENDCHR
              MOVLW              "d"
              CALL     SENDCHR
              MOVLW              "!"
              CALL     SENDCHR
              MOVLW              " "
              CALL     SENDCHR

              MOVFW              COUNTER
              MOVWF              BYTE0
              CALL     CONV_BCD        ;COUNTERの値(バイナリ)をBCDに変換しDIGIT34,DIGIT12に格納
              MOVFW              DIGIT34
              ANDLW 0Fh                                    ;DIGIT34の下位4bitを取り出す
              IORLW  30h                                    ;ASCIIコードに変換
              CALL     SENDCHR
              MOVFW              DIGIT12
              MOVWF              WORK1
              MOVWF              TEMP
              SWAPF  TEMP,W
              ANDLW 0Fh                                    ;DIGIT12の上位4bitを取り出す
              IORLW  30h                                    ;ASCIIコードに変換
              CALL     SENDCHR
              MOVFW              WORK1
              ANDLW 0Fh                                    ;DIGIT12の下位4bitを取り出す。
              IORLW  30h                                    ;ASCIIコードに変換
              CALL     SENDCHR
              MOVLW              0Dh                                   ;改行コード
              CALL     SENDCHR
              MOVLW              0Ah                                    ;NLコード
              CALL     SENDCHR
              
              INCF      COUNTER                        ;COUNTER+1

              CALL     LOOP250ms
              CALL     LOOP250ms
              CALL     LOOP250ms
              CALL     LOOP250ms
              GOTO   MAIN

;1文字送信          
SENDCHR
              BANKSEL           TXSTA
              BTFSS   TXSTA,TRMT     ;送信可能かチェック(1:可 0:禁止)
              GOTO   $-1
              MOVWF              TXREG
              RETURN

;--------------------------------------------
; バイナリからBCDへの変換
;--------------------------------------------
CONV_BCD
            BCF              STATUS,C          ;キャリーをクリア
            MOVLW        08h                     ;8ビットカウンタ
            MOVWF       SHIFT                 ;SHIFT=8 
            CLRF           DIGIT12              ;BCDデータクリア
            CLRF           DIGIT34
LOOP
            RLF              BYTE0,F             ;shift  BYTE to DIGIT
            RLF              DIGIT12,F
            RLF              DIGIT34,F
            DECFSZ      SHIFT,F              ;end check
            GOTO          ADJST                 ;adjust to BCD
            RETURN
ADJST
            MOVF          DIGIT12,W         ;DIGIT12 adjust TO BCD
            CALL            ADJBCD
            MOVWF       DIGIT12
            MOVF           DIGIT34,W         ;DIGIT34 adjust to BCD
            CALL             ADJBCD
            MOVWF        DIGIT34
            GOTO            LOOP

;****   Each digit adjust to BCD  ****
ADJBCD
            MOVWF         WORK1               ;save
            MOVLW          3                          ;W+3
            ADDWF          WORK1,W
            MOVWF          TEMP
            BTFSC            TEMP,3               ;Test W+3>7
            MOVWF          WORK1               ;>7 then W+3 else W
            MOVLW           030h                    ;W+30
             ADDWF          WORK1,W
            MOVWF          TEMP    
            BTFSC            TEMP,7               ;Test W+30>7*
            MOVWF          WORK1               ;>70 then W+30 else W
            MOVF              WORK1,W
            RETURN
                            
LOOP250ms
              MOVLW              0FAh      ;0FAh=250
              MOVWF              CNT250ms
LOOP2
              CALL     LOOP1ms
              DECFSZ              CNT250ms
              GOTO   LOOP2
              RETURN             
LOOP1ms
              MOVLW              0F9h      ;0F9h=249
              MOVWF              CNT1ms
LOOP1
              NOP
              DECFSZ              CNT1ms,F
              GOTO   LOOP1
              RETURN             

              END
------------------------------------------------------------------

ブレッドボードです。


 PIC16F1827から送信された文字が、TeraTermに表示されました。
 数値は、0から255ですが、ゼロ消しの処理をしていませんので、0が表示されます。



最新の画像もっと見る

コメントを投稿