Assembly PIC18f46k42 UART未接收

Assembly PIC18f46k42 UART未接收,assembly,embedded,uart,pic18,Assembly,Embedded,Uart,Pic18,TL;DR first:UART1接收器未接收;请告诉我我做错了什么 更详细的版本: 我目前正在从事一个项目,该项目使用UART在两个PIC18f46k42芯片之间发送状态报告。之前使用f8722芯片在原型板上进行的测试工作正常,但在切换到f46k42之后,我只能让发射机工作;接收缓冲区根本不填充 我已经检查并重新检查了文档中描述的设置(数据表的第480页有一个基本检查表),因此我得出结论,这要么是一个我不知道的简单错误,要么是我忽略了其他设置 调试时检查的一些详细信息和事项: 我正在使用mp

TL;DR first:UART1接收器未接收;请告诉我我做错了什么

更详细的版本:

我目前正在从事一个项目,该项目使用UART在两个PIC18f46k42芯片之间发送状态报告。之前使用f8722芯片在原型板上进行的测试工作正常,但在切换到f46k42之后,我只能让发射机工作;接收缓冲区根本不填充

我已经检查并重新检查了文档中描述的设置(数据表的第480页有一个基本检查表),因此我得出结论,这要么是一个我不知道的简单错误,要么是我忽略了其他设置

调试时检查的一些详细信息和事项:

  • 我正在使用mpasm编程、MPLABX和PICKIT3

  • U1RXB不填充任何内容,甚至不填充垃圾数据

  • 所有的控制寄存器都是我想要设置的;可能不会错过班克塞尔
  • 引脚设置为数字,接收引脚设置为输入
  • 在示波器上检查变送器;按预期发出信号
  • 仔细检查数据极性是否正确
  • 显式设置我能想到的每个控制寄存器,以防万一
这里有一些测试代码,使用单个芯片(希望确保我的另一个芯片没有坏/振荡器有明显的不同),并且没有所有的铃铛和哨声,以便专注于UART问题。它不是很漂亮(包含其他测试中不必要的工件),因此我提前表示歉意。此代码从未到达接收子例程,接收缓冲区中从未有任何内容(0x00,应为0x87),接收FIFO从未溢出。有趣的是,在运行此测试时,RXIDL位是清晰的,尽管它实际上从未收到任何东西

;UART TEST

    #include <p18F46k42.inc> 
    CONFIG  WDTE = OFF
    CONFIG  LVP = OFF
    CONFIG  FEXTOSC = HS          ; External Oscillator Selection (HS (crystal oscillator) above 8 MHz; PFM set to high power)
    CONFIG  RSTOSC = HFINTOSC_1MHZ




PROCR   EQU 0x02    ;Temp register for receiving 
PROCT   EQU 0x03    ;Temp register for transmitting 

    ORG 0x00
    GOTO    START
    ORG 0x100
START:
    BCF TRISD,0
    BCF PORTD,0
    BANKSEL ANSELC
    BCF     ANSELC,7
    BCF     ANSELC,6
    BSF    TRISC,7
    BCF     TRISC,6

UART1_INIT:
    BANKSEL U1BRGL
    MOVLW   d'207' ;particularly slow baud rate for testing purposes
    MOVWF   U1BRGL
    CLRF    U1BRGH
    BANKSEL U1CON0
    MOVLW   b'00110000'  ;enable tx and rx for UART1; 8-bit, no parity
    MOVWF   U1CON0
    MOVLW   b'10000000'  ;enable UART1 module
    MOVWF   U1CON1
    MOVLW   b'00000000'  ;normal polarity (high idle)
    MOVWF   U1CON2

    BANKSEL PIE0
    MOVLW   b'01001000';Turn on UART1, and Receive interrupts
    MOVWF   PIE3


    BANKSEL INTCON0
    BSF INTCON0,GIEH

    BANKSEL U1RXPPS
    MOVLW   b'00010111' ;PORTC,7 for U1 receive pin
    MOVWF   U1RXPPS
    BANKSEL RC6PPS
    MOVLW   b'00010011' ;PORTC,6 for U1 tx pin
    MOVWF   RC6PPS

MAIN:
    MOVLW   0x87
    MOVWF   PROCT
    CALL    TRANSMT
M2:
    BANKSEL PIR3
    BTFSS   PIR3,3  ;check for full receive buffer
    BRA MAIN
    CALL    RECEIVE
    BRA MAIN


TRANSMT: 
    BANKSEL U1FIFO
    BTFSS   U1FIFO,5    ;Check if transmit register is empty
    BRA     TRANSMT     ;If not, wait until it is empty
    MOVF    PROCT,W
    BANKSEL U1TXB
    MOVWF   U1TXB       ;Send data
    RETURN

RECEIVE:
    BANKSEL PIR0
    BCF     PIR3,U1RXIF   ;Clear interrupt flag
    BANKSEL U1RXB
    MOVF    U1RXB,W
    MOVWF   PORTD
    RETURN

    END
;UART测试
#包括
CONFIG WDTE=OFF
配置LVP=OFF
配置FEXTOSC=HS;外部振荡器选择(8 MHz以上的HS(晶体振荡器);PFM设置为高功率)
配置RSTOSC=HFINTOSC_1MHZ
PRORC EQU 0x02;接收用临时寄存器
PROCT EQU 0x03;传输用温度寄存器
组织0x00
开始
组织0x100
开始:
BCF-TRISD,0
BCF端口D,0
班克塞尔安塞尔
BCF安塞尔克,7
BCF ANSELC,6
BSF TRISC,7
BCF TRISC,6
UART1_INIT:
班克塞尔U1BRGL
MOVLW d'207';用于测试的波特率特别低
MOVWF U1BRGL
CLRF U1BRGH
班克塞尔U1CON0
MOVLW b'00110000';启用UART1的发送和接收;8位,无奇偶校验
MOVWF U1CON0
MOVLW b'10000000';启用UART1模块
MOVWF U1CON1
MOVLW b'00000000';正常极性(高怠速)
MOVWF U1CON2
班克塞尔皮耶0
MOVLW b'01001000';打开UART1,并接收中断
MOVWF PIE3
班克塞尔国际会议
BSF INTCON0,GIEH
班克塞尔U1Rxps
MOVLW b'00010111';端口C,7用于U1接收引脚
MOVWF U1Rxps
班克塞尔RC6PPS
MOVLW b'00010011';端口C,6用于U1 tx引脚
MOVWF RC6PPS
主要内容:
MOVLW 0x87
MOVWF程序
呼叫TRANSMT
M2:
班克塞尔PIR3
BTFSS PIR3,3;检查接收缓冲区是否已满
文胸总管
呼叫接收
文胸总管
TRANSMT:
班克塞尔U1FIFO
BTFSS U1FIFO,5;检查发送寄存器是否为空
胸罩;如果没有,请等待它变空
MOVF PROCT,W
班克塞尔U1TXB
MOVWF-U1TXB;发送数据
返回
收到:
班克塞尔PIR0
BCF-PIR3,U1RXIF;清除中断标志
班克塞尔U1RXB
MOVF U1RXB,W
MOVWF端口D
返回
结束
感谢您的帮助;这个问题是目前阻碍我进步的唯一因素,也是我唯一无法独自解决的问题。

终于解决了(在一次重要的休息之后,我的眼睛恢复了活力)

所以,这个答案是双重的,既适用于这里的问题,也适用于我创建这个测试程序来解决的问题

这个问题

该程序将在修复中断启用后工作。不应设置U1RXIE(PIE3,4)。这是我一个令人尴尬的疏忽。不过,我仍然不知道为什么在没有读取接收缓冲区的情况下清除了标志。以下是上述不正确设置的工作版本:

UART1_INIT:
    BANKSEL U1BRGL
    MOVLW   d'207'
    MOVWF   U1BRGL
    CLRF    U1BRGH
    BANKSEL U1CON0
    MOVLW   b'00110000'
    MOVWF   U1CON0
    MOVLW   b'10000000'
    MOVWF   U1CON1
    MOVLW   b'00000000'
    MOVWF   U1CON2

    BANKSEL PIE0
    MOVLW   b'01000000';Turn on UART1 interrupts
    MOVWF   PIE3


    BANKSEL INTCON0
    BSF INTCON0,GIEH

    BANKSEL U1RXPPS
    MOVLW   b'00010111' ;PORTC,7 for U1 recieve pin
    MOVWF   U1RXPPS
    BANKSEL RC6PPS
    MOVLW   b'00010011' ;PORTC,6 for U1 tx pin
    MOVWF   RC6PPS
整体问题

如果它有助于任何人阅读:我的实际代码应该在接收到数据字节时中断。调试时,它没有到达ISR,我从未在接收缓冲区中看到任何东西,也从未看到设置的中断标志。因此,我开始尝试使用上面的代码来根除错误;一旦我修复了它,我就返回到另一个测试(使用中断)。由于它仍然不起作用,我知道这与中断有关

结果是,我在指向IVT时弄错了,所以我的ISR地址被放在了表格的错误部分。。。另外,在所有要搞砸的事情中

好吧,从好的方面来说,这两件事我都搞砸了,而不是我一无所知。感谢所有看过这个问题的人