Перейти к содержанию
    

MSP430F5510 UART

Здравствуйте!

Помогите разобраться.

Что задумано - в одном из режимов отображения данных на ЖКИ передаться байт заголовка пакета и 3 байта из области памяти tx_bufer

Что получается - передается 4 байта (что правильно) - байт заголовка и 1й байт из области памяти tx_bufer (тоже правильно) и 2 и 3 байты неправильно, закономерности выявить не удалось.

В отладчике работает в железе - нет.

В чем дело помогите разобраться

Вот кусок кода:

 

; Флаги приема/передачи UART

;----------------------------

fl_tx_start equ 0x0001 ;

fl_tx_complete equ 0x0002

;fl_ equ 0x0004 ;

;fl_pak_ok equ 0x0008

fl_rx_timeout equ 0x0010

fl_rx_complete equ 0x0020

fl_rx_lenght equ 0x0040

fl_rx_start equ 0x0080

 

ORG 0x2400 ;0200

flags: ds 1; регистр флагов

flags_uart ds 1 ; регистр флагов UART

mode_ind: ds 1 ; номер режима индикации

mode_timer: ds 1 ; время индикации

...... тут еще ряд ячеек

tx_bufer: ds 0x46 ;буфер передатчика

rx_bufer: ds 0x46 ;буфер приемника

test_counter: ds 2

rx_time: ds 1 ; таймаут для приема по UART

tx_counter: ds 1 ; счетчик байт на передачу

;--------------

 

основной цикл

main_001:

 

тут отображение различной информации на жки с интервалом в 5с

 

test_send:

mov #tx_bufer,r5 ;установил указатель на начало буфера

mov.b #0x11,1(r5) ; соответственно записал туда 3 байта (для теста пишу прямые цифры, в дальнейшем д.б. заполнение блока полезными данными)

mov.b #0x22,0(r5) ;

mov.b #0x33,2(r5)

mov.b #0x03,tx_counter ; устанавливаем счетчик числа байт

mov #tx_bufer,r14 ; устанавливаем указатель на начало буфера

bis.b #fl_tx_start,flags_uart ; уст. флаг старт передачи

mov.b #start_byte,&UCA0TXBUF ; записываем стартовый байт в uart

jmp main_001 ; уходим из процедуры

 

прерывание

;----------------

;UART0 Interrupt

;----------------

USCIA0_UART_int: ;

add &UCA0IV, PC ; Add offset to jump table

reti ; Vector 0: No interrupt

jmp RXIFG_ISR ; Vector 2: RXIFG

TXIFG_ISR: ; Vector 4: TXIFG

bit.b #fl_tx_start,flags_uart ; если пришло прерывание а передачу никто не запускал то выход с очисткой всех флагов передачи

jz error_transmit

dec.b tx_counter ; уменьшаем счетчик числа передаваемых байт

jnz tx_next_byte ; если не 0 то передаем следующий байт

bic.b #fl_tx_start,flags_uart

bis.b #fl_tx_complete,flags_uart

tx_next_byte:

mov.b @r14+,&UCA0TXBUF

reti

; Task starts here

error_transmit:

bic.b #fl_tx_start,flags_uart

bic.b #fl_tx_complete,flags_uart

mov.b #0x00,tx_counter

reti ; Return

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в ассемблере не бум-бум. Вот только недавно закончилась тема по MSP430x5xx, с отладчиком работала без нет, проблема была в настройке тактирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в ассемблере не бум-бум. Вот только недавно закончилась тема по MSP430x5xx, с отладчиком работала без нет, проблема была в настройке тактирования.

 

Вроде разобрался

С тактированием все было правильно.

Проверял я на макетной платке, а интерфейс 232 было лень припаивать и взял валявшийся рядом кусок платы с 485. А на этой платке 485 всегда приемник разрешен был, соответственно получалась каша из переданых и тут-же принятых байт.

 

Теперь вот другой вопрос образовался. Данные лежат в ОЗУ. ТХ буфер - 8 битный. регистры - 16 битные

в итоге передаются только четные байты. Эту проблему я тоже обошел добавив флаг на передачу четных\нечетных байт и свопая старшую и младшие части регистра.

Как еще можно корректно организовать вывод в uart из памяти?

 

в основном цикле устанавливаем указатель на начало буфера

mov #ячейка_памяти,R14

 

в прерывании

USCIA0_UART_int: ;

add &UCA0IV, PC ; Add offset to jump table

reti ; Vector 0: No interrupt

jmp RXIFG_ISR ; Vector 2: RXIFG

TXIFG_ISR: ; Vector 4: TXIFG

bit.b #fl_tx_start,flags_uart

jz error_transmit

dec.b tx_counter

jnz tx_next_byte

bic.b #fl_tx_start,flags_uart

bis.b #fl_tx_complete,flags_uart

tx_next_byte:

mov.b @r14+,&UCA0TXBUF ;

reti

error_transmit:

bic.b #UCTXIFG,&UCA0IFG

bic.b #fl_tx_start,flags_uart

bic.b #fl_tx_complete,flags_uart

mov.b #0x00,tx_counter

reti ; Return

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для информации более 1 байта и служащей для передачи по UART я делаю структуру:

число записываю в word, а передачу начинаю с _0.

union _Real
  {
  signed int word;
  struct _byte
    {
    char _0;
    char _1;
    }
    byte;
  };

Изменено пользователем KARLSON

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо

С передачей разобрался. Заодно и с приемом тоже :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...