Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430F5510 UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
megabuks
Здравствуйте!
Помогите разобраться.
Что задумано - в одном из режимов отображения данных на ЖКИ передаться байт заголовка пакета и 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
KARLSON
Я в ассемблере не бум-бум. Вот только недавно закончилась тема по MSP430x5xx, с отладчиком работала без нет, проблема была в настройке тактирования.
megabuks
Цитата(KARLSON @ Aug 16 2012, 07:21) *
Я в ассемблере не бум-бум. Вот только недавно закончилась тема по 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

d7d1cd
Может эта тема поможет http://electronix.ru/forum/index.php?showtopic=105043
KARLSON
Для информации более 1 байта и служащей для передачи по UART я делаю структуру:
число записываю в word, а передачу начинаю с _0.
Код
union _Real
  {
  signed int word;
  struct _byte
    {
    char _0;
    char _1;
    }
    byte;
  };
megabuks
Спасибо
С передачей разобрался. Заодно и с приемом тоже sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.