PIC18f46k42 UART не получает

Сначала TL; DR: приемник 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

Любая помощь приветствуется; эта проблема - единственное, что мешает моему прогрессу на данный момент, и единственное, с чем я не смог разобраться самостоятельно.


person Chris    schedule 27.02.2018    source источник


Ответы (1)


Наконец-то разобрался (после значительного перерыва, чтобы освежить зрение).

Итак, этот ответ двоякий: он относится как к заданному здесь вопросу, так и к проблеме, для решения которой я создал эту тестовую программу.

Этот вопрос

Эта программа будет работать после исправления разрешения прерывания. 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 был помещен не в ту часть таблицы... Вдобавок, из всего, что нужно напортачить...

Что ж, с другой стороны, в обоих случаях я ошибся, а не в том, о чем ничего не знал. Спасибо всем, кто рассмотрел этот вопрос!

person Chris    schedule 06.03.2018