PIC18f46k42 UART 未接收
PIC18f46k42 UART not receiving
首先是 TL;DR:UART1 接收器未接收;请告诉我我做错了什么。
更详细的版本:
我目前正在从事一个项目,该项目使用 UART 在两个 PIC18f46k42 芯片之间发送状态报告。之前使用 f8722 芯片在原型板上进行的测试工作正常,但在切换到 f46k42 之后,我只能让发射器工作;接收缓冲区根本没有填满。
我已经检查并重新检查了文档中描述的设置(数据表的第 480 页有一个基本检查表),所以我得出结论,这要么是我无视的简单错误,要么是是我忽略的其他设置。
我在调试时检查过的一些细节和事情:
我正在使用 mpasm、MPLABX 和 PICKIT3 进行编程
U1RXB没有填充任何东西,甚至没有垃圾数据
- 所有的控制寄存器都是我打算设置的;可能不会缺少 BANKSEL
- 引脚设置为数字,接收引脚设置为输入
- 检查示波器上的变送器;信号符合预期
- 再次检查数据极性是否正确
- 明确设置我能想到的每个控制寄存器,以防万一
这是一些使用单个芯片的测试代码(想确保我的其他芯片没有坏/振荡器明显不同)并且没有所有的花里胡哨以专注于 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
感谢任何帮助;这个问题是目前唯一阻碍我进步的问题,也是我自己唯一无法解决的问题。
终于弄明白了(经过重要的休息以刷新我的眼睛)。
所以,这个答案是双重的,既适用于这里的问题,也适用于我创建此测试程序要解决的问题。
这个问题
此程序将在修复中断使能后运行。不应设置 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 地址被放置在 table 的错误部分......此外,所有事情都搞砸了.. .
好吧,好的一面是,这两件事都是我搞砸的,而不是我一无所知的事情。感谢所有看过这个问题的人!
首先是 TL;DR:UART1 接收器未接收;请告诉我我做错了什么。
更详细的版本:
我目前正在从事一个项目,该项目使用 UART 在两个 PIC18f46k42 芯片之间发送状态报告。之前使用 f8722 芯片在原型板上进行的测试工作正常,但在切换到 f46k42 之后,我只能让发射器工作;接收缓冲区根本没有填满。
我已经检查并重新检查了文档中描述的设置(数据表的第 480 页有一个基本检查表),所以我得出结论,这要么是我无视的简单错误,要么是是我忽略的其他设置。
我在调试时检查过的一些细节和事情:
我正在使用 mpasm、MPLABX 和 PICKIT3 进行编程
U1RXB没有填充任何东西,甚至没有垃圾数据
- 所有的控制寄存器都是我打算设置的;可能不会缺少 BANKSEL
- 引脚设置为数字,接收引脚设置为输入
- 检查示波器上的变送器;信号符合预期
- 再次检查数据极性是否正确
- 明确设置我能想到的每个控制寄存器,以防万一
这是一些使用单个芯片的测试代码(想确保我的其他芯片没有坏/振荡器明显不同)并且没有所有的花里胡哨以专注于 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
感谢任何帮助;这个问题是目前唯一阻碍我进步的问题,也是我自己唯一无法解决的问题。
终于弄明白了(经过重要的休息以刷新我的眼睛)。
所以,这个答案是双重的,既适用于这里的问题,也适用于我创建此测试程序要解决的问题。
这个问题
此程序将在修复中断使能后运行。不应设置 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 地址被放置在 table 的错误部分......此外,所有事情都搞砸了.. .
好吧,好的一面是,这两件事都是我搞砸的,而不是我一无所知的事情。感谢所有看过这个问题的人!