megabuks 0 15 августа, 2012 Опубликовано 15 августа, 2012 · Жалоба Здравствуйте! Помогите разобраться. Что задумано - в одном из режимов отображения данных на ЖКИ передаться байт заголовка пакета и 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 1 16 августа, 2012 Опубликовано 16 августа, 2012 · Жалоба Я в ассемблере не бум-бум. Вот только недавно закончилась тема по MSP430x5xx, с отладчиком работала без нет, проблема была в настройке тактирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megabuks 0 16 августа, 2012 Опубликовано 16 августа, 2012 · Жалоба Я в ассемблере не бум-бум. Вот только недавно закончилась тема по 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 0 17 августа, 2012 Опубликовано 17 августа, 2012 · Жалоба Может эта тема поможет http://electronix.ru/forum/index.php?showtopic=105043 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 17 августа, 2012 Опубликовано 17 августа, 2012 (изменено) · Жалоба Для информации более 1 байта и служащей для передачи по UART я делаю структуру: число записываю в word, а передачу начинаю с _0. union _Real { signed int word; struct _byte { char _0; char _1; } byte; }; Изменено 17 августа, 2012 пользователем KARLSON Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megabuks 0 17 августа, 2012 Опубликовано 17 августа, 2012 · Жалоба Спасибо С передачей разобрался. Заодно и с приемом тоже :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться