PIC18f46k42 UART没有收到

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PIC18f46k42 UART没有收到相关的知识,希望对你有一定的参考价值。

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的地址被放在了桌子的错误部分......加上所有的东西搞砸......

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

以上是关于PIC18f46k42 UART没有收到的主要内容,如果未能解决你的问题,请参考以下文章

PIC18F 分钟和小时定时器

从蓝牙设备从 pic18f4525 上的 RCREG 读取数据

将 FreeRTOS 与 XC8 编译器一起使用

PIC18F26Q43 SPI 从机不接收数据

我用mplab 编写一个pic18f252的c 程序,创建时显示:can't open "pic.h" head file such director

基于PIC18F97J60单片机协议栈设计