如何通过汇编代码在PIC16F877A中使用UART?

问题描述 投票:0回答:1

我在PIC16F877A中使用UART和测试板HJ-5G。 我的振荡器是 4MHz (KDS4.000)。我尝试从我的计算机接收数据。(串行调试助手) 但我没有收到任何东西。我尝试传输数据,但我的串行调试助手无法接收任何内容。 我使用 MPLAB X IDE v6.20 来运行我的代码。

我已经检查过 SPBRG。但我认为我是对的。我还是不知道问题出在哪里。 我的 RCREG 总是 0x00。

INT_VECT:
    movwf W_TEMP
    movf STATUS, W
    movwf STATUS_TEMP
    
    BTFSC PIR1, 5
    call uart_rx_isr
    
    movf STATUS_TEMP, W
    movwf STATUS
    movf W_TEMP, W
    RETFIE

uart_rx_isr:
    movf RCREG, W
    movwf RX_TEMP
    bsf TEST_FLAGS, 0
    bcf PIR1, 5
    return

setup:
    call uart_init
    bsf STATUS, 5 ; select bank 1
    CLRF TRISB
    BSF TRISD, 2
    bcf STATUS, 5 ; select bank 0
    CLRF PORTB
    movlw (1<<7)
    IORWF INTCON
    bcf STATUS, 0 ; clear carry
    bcf INTCON, 0 ; clear int flag
    
    ; Debugging: Send initial status
    movlw 'I'
    movwf TXREG
    call uart_tx_done
    
    call send_debug_info

main:
    ; Reset receiver periodically
    bcf RCSTA, 4 ; Disable receiver
    bsf RCSTA, 4 ; Enable receiver
    
    ; Check for received data
    BTFSS PIR1, 5
    goto main_continue
    
    ; Read received data
    movf RCREG, W
    movwf RX_TEMP
    bsf TEST_FLAGS, 0
    
    ; Echo received data
    movf RX_TEMP, W
    movwf TXREG
    call uart_tx_done
uart_init:
    bsf STATUS, 5 ; select bank 1
    movlw 25    ; Set baud rate to 9600 
    movwf SPBRG
    movlw 0b10000000 ; Set RC6 as output (TX) and RC7 as input (RX)
    movwf TRISC
    bcf STATUS, 5 ; select bank 0
    movlw 0x90 ; Enable serial port and continuous receive
    movwf RCSTA
    bsf RCSTA, 4 ; CREN - Enable continuous receive
    movf RCREG, W ; Clear receiver register
    bsf STATUS, 5 ; select bank 1
    movlw 0x24 ; Enable transmission
    movwf TXSTA
    bsf PIE1, 5   ; Enable receive interrupt
    bsf INTCON, 7 ; Enable global interrupts
    bsf INTCON, 6 ; Enable peripheral interrupts
    bcf STATUS, 5 ; select bank 0
    return

在调试时注册值

07/26 现在我简化了我的整个代码,我仍然不知道问题出在哪里。 PORTD 连接到 LED。

#include <xc.inc>
    
; CONFIG
CONFIG  FOSC = HS             ; Oscillator Selection bits (HS oscillator)
CONFIG  WDTE = OFF            ; Watchdog Timer Enable bit (WDT disabled)
CONFIG  PWRTE = OFF           ; Power-up Timer Enable bit (PWRT disabled)
CONFIG  BOREN = OFF           ; Brown-out Reset Enable bit (BOR disabled)
CONFIG  LVP = OFF             ; Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
CONFIG  CPD = OFF             ; Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
CONFIG  WRT = OFF             ; Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
CONFIG  CP = OFF              ; Flash Program Memory Code Protection bit (Code protection off)  

DELAY_A equ 0x70
DELAY_B equ 0x71
DELAY_C equ 0x72
W_TEMP equ 0x75
STATUS_TEMP equ 0x76
 
psect   RESET_VECT,class=CODE,delta=2 ; PIC10/12/16
RESET_VECT:
    goto setup
    
psect   INT_VECT,class=CODE,delta=2 ; PIC10/12/16
INT_VECT:
   movwf W_TEMP
   swapf STATUS,W
   movwf STATUS_TEMP
   btfsc PIR1, 5
   call uart_rx_isr
   swapf STATUS_TEMP,W
   movwf STATUS
   movf W_TEMP,W
   retfie

uart_rx_isr:
    movf RCREG,0
    movwf TXREG
    bcf PIR1,5
    return

setup:
    bsf STATUS,5 ; select bank 1
    movlw 25    ; Set baud rate to 9600 (assuming 4 MHz crystal)
    movwf SPBRG
    movlw 0b10000000 ; Set RC6 as output (TX) and RC7 as input (RX)
    movwf TRISC
    bcf STATUS,5 ; select bank 0
    movlw 0x90 ; Enable serial port and continuous receive
    movwf RCSTA
    bsf STATUS,5 ; select bank 1
    movlw 0x24 ; Enable transmission
    movwf TXSTA

    bsf PIE1,5   ; Enable receive interrupt
    bsf INTCON,7 ; Enable global interrupts
    bsf INTCON,6 ; Enable peripheral interrupts
    
    bsf STATUS, 5
    bcf TRISD, 0
    bcf STATUS, 5
     
main:
    bsf PORTD, 0
    goto main


END

这是我所有的代码和价值观。我无法接收 RCREG 值,这与停止位有关。所以我的 Serail 调试助手没有传输数据?

寄存器值 串口调试助手

assembly uart mplab
1个回答
0
投票

我发现问题了。我的代码和RS232是对的。这个测试板有问题,导致我的RCREG一直是0。我换了另一个测试板后,我的RCREG就可以接收到数据了。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.