UTXEN не будет устанавливать
Чип PIC24FJ256GB210
Бит #UTXEN на UART #3 не будет установлен.
Он устанавливает отлично на UART #1, используя точно такую же последовательность команд. То же самое для UART #2.
РАБОТАЕТ...
096E6 204000 mov.w #0x400,0x0000 111: Mov #Uart_1_Status_Control_Pattern, W0 ;Defined in CONSTANT.INC file
096E8 881110 mov.w 0x0000,0x0222 112: Mov W0, U1STA ;ibid, page 230 Reg 17-2
FAILS...
09748 204000 mov.w #0x400,0x0000 248: Mov.W #Uart_3_Status_Control_Pattern, W0 ;Defined in CONSTANT.INC file
0974A 881290 mov.w 0x0000,0x0252 249: Mov.W W0, U3STA ;ibid, page 230, Reg 17-2
Поэтому я подумал: "О, это один бит, который я хочу, и полное перемещение слова поверх всех битов, доступных только для чтения, как-то вызывает проблему. Я просто сделаю один бит".
Нет, до сих пор не установите этот бит.
FAILS...
09754 A84253 bset.b 0x0253,#2 256: Bset.W U3STA, #UTXEN ;DEBUG DEBUG DEBUG Date: 2013-02-18 Time: 11:37:07
--ОБНОВИТЬ--
Я могу установить бит в MpLab. Какая разница?
Я действительно смущен. Что еще может быть здесь задействовано, что мешает установить этот бит?
2 ответа
Ошибка
Наряду с регистром состояния UART для каждого UART в PIC24, который я использую, есть соответствующий регистр режима UART.
В этом случае его зовут U3MODE
,
В этом регистре соответствующего режима есть бит "UART Enable"
В этом случае этот бит называется UARTEN
, что (согласно моей документации для этого конкретного PIC) старшего разряда.
По материалам дела p24FJ256GB210.inc
который я использую, чтобы собрать это, они определили это так...
.equiv UARTEN, 0x000F
Если этот бит в регистре U3MODE не установлен, прежде чем пытаться установить UTXEN
бит в соответствующем регистре состояния (в этом случае U3STA
регистр), то регистр статуса не изменит своего значения так, как вы хотите.
Исправление
Установить UARTEN
немного в U3MODE
сначала зарегистрируйтесь, затем вы можете установить UTXEN
немного в U3STA
регистр.
Пример кода
Я скопировал из окна разборки здесь, чтобы дать и исходные, и фактические шестнадцатеричные значения, и физическое шестнадцатеричное кодирование каждой инструкции.
Ярлыки - это на самом деле просто consttants, которые я придумал; код, который работает, код, который вы можете прочитать; такого рода идеи. Вы можете увидеть их значения в разделах разборки каждой инструкции.
Большое дело в этом случае состоит в том, чтобы убедиться, что бит старшего разряда U3MODE
зарегистрироваться, прежде чем пытаться установить биты в U3STA
регистр.
Это решило эту проблему.
;-------------------------------------
; --- THIS MUST COME FIRST ---
;
280080 mov.w #0x8008,0x0000 Mov.W #Uart_3_Mode_Pattern, W0 ;Defined in Constant.Inc File
881280 mov.w 0x0000,0x0250 Mov.W W0, U3MODE ;Documented in Manual DS39975A, p. 228, Register 17-1
;
; --- IN ORDER FOR THIS TO WORK ---
;
204000 mov.w #0x400,0x0000 Mov.W #Uart_3_Status_Control_Pattern, W0 ;Defined in CONSTANT.INC file
881290 mov.w 0x0000,0x0252 Mov.W W0, U3STA ;Manual DS39975A, page 230, Reg 17-2
Подвернулся этим сам (спасибо за пост) и в итоге нашел:
Справочное руководство по семейству микрочипов PIC24F, раздел 21.4 КОНФИГУРАЦИЯ UART, подраздел 21.4.1 Включение UART говорит: "Бит UTXEN не должен устанавливаться, пока не будет установлен бит UARTEN, иначе передачи по UART не будут включены".