Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART MSP430
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
mcheb
Есть процессор MSP430F6723. UART на скоростях до 115200 работает нормально, на 230400 мусор выдаёт. Кто работал с такими скоростями, посоветуйте как?
Может где-то модуляцию включить? Хотя на 115200 и на 4МГц системной частоты всё ОК.
#define FREQXT1 32768
#define BAUD 115200*1
#define FSYS 115200*32*2
#define NUM_USCTL2 (FLLD_0 + (FSYS/FREQXT1) - 1)
#define NUM_DCO DCORSEL_4

UCA0CTL1 = UCSWRST; // **Put state machine in reset**
UCA0CTL0 = 0; // UART 8bit
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BRW = FSYS/BAUD; // 1.00MHz 38400 (see User's Guide)
// UCA0BR1 = 0; // 1.00MHz 38400
// UCA0MCTLW_ |= UCBRS_1 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0
NikolyaN
Тут не совсем понятно чему равен SMCLK. Предположим что == FSYS (7372800Hz вроде так у вас получается). И еще не понятно что такое "4МГц системной частоты"

Вообще, можно попробовать так:
Код
#define BAUD            230400ul
#define SMCLK_FREQ          7372800ul

UCA0BRW = (SMCLK_FREQ + BAUD / 2) / (16ul * BAUD);
UCA0MCTL = UCOS16 + UCBRF0 * (((SMCLK_FREQ + BAUD / 2) / BAUD) & 0x0f);


Удачи
zltigo
QUOTE (mcheb @ Jun 30 2015, 05:21) *
#define BAUD 115200*1
#define FSYS 115200*32*2
UCA0BRW = FSYS/BAUD;

Вы-бы хоть для начала НУ ХОТЬ НЕМНОГО задумались, хотя-бы на уровне знаний арифметики начальной школы, что получится в результате такой подстановки при
#define BAUD 115200*2

mcheb
Цитата(zltigo @ Jun 30 2015, 10:11) *
Вы-бы хоть для начала НУ ХОТЬ НЕМНОГО задумались, хотя-бы на уровне знаний арифметики начальной школы, что получится в результате такой подстановки при
#define BAUD 115200*2

А я проверял biggrin.gif
#define FREQXT1 32768
#define BAUD 115200*2
#define FSYS 115200*32*2
#define NUM_USCTL2 (FLLD_0 + (FSYS/FREQXT1) - 1)
#define NUM_DCO DCORSEL_4

UCA0BRW = FSYS/BAUD; // 1.00MHz 38400 (see User's Guide)
4798: b2 40 80 00 mov #128, &0x05c6 ;#0x0080
479c: c6 05

Спасибо! надо так:
#define BAUD (115200*2)
UCA0BRW = FSYS/BAUD; // 1.00MHz 38400 (see User's Guide)
4798: b2 40 20 00 mov #32, &0x05c6 ;#0x0020
479c: c6 05
Код
CC2511 USB Flash Loader
H - Help
U - USB-RS232 (Ctrl-Q end)
P - MCU FLASH LOADER
B - Self BootLoader
Q - REBOOT

UART>start : 230400 0 0 8 03

Taipit Stend Flash Loader
H - Help
A - 10bit ADC p3
S - Taipit Stend
F - FILE UTIL
zltigo
QUOTE (mcheb @ Jun 30 2015, 09:25) *
Спасибо! надо так:
#define BAUD (115200*2)

Да.
А посему, запомните простую препростую вещь всегда, абсолютно всегда и абсолютно все дефайны заключать в скобки (ну только если, они ЯВНО,как текстовые литералы они не использутся). Даже если это
#define DUMMY (1)
Всегда! Дабы потом не думать о том что получится.
Isaev_ivan
Добрый вечер, уважаемые форумчане!) Недавно возникла потребность передачи данных из микроконтроллера в ПК. Написал код на ассемблере, опираясь на Code_examples от TI, и то, что получилось, приведено ниже:

#include "msp430F1232.h"
RSEG CSTACK
DS16 0
RSEG CODE
;---------------------------------------------------------------------
; Установка тактирования от кварца
;---------------------------------------------------------------------
RESET mov #SFE(CSTACK),SP
mov #WDTPW+WDTHOLD,&WDTCTL ;OSTANOVKA WDT
BIC #OSCOFF, SR ; tAKTIROVANIE OT KVARCA
BIS.B #XTS, BCSCTL1
L1 BIC.B #OFIFG, &IFG1
MOV #0FFh, R15
L2 DEC R15
JNZ L2
BIT.B #OFIFG, &IFG1
JNZ L1
BIS.B #SELM_3, &BCSCTL2
;--------------------------------------------------------------------
; Инициализация USART
;--------------------------------------------------------------------
mov.b #200,R7
bis.b #SWRST,&UCTL0;
bis.b #030h,&P3SEL; P3.4,5 - USART
bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема
bis.b #CHAR, &UCTL0; Формат данных 8-разрядный
mov.b #SSEL0, &UTCTL0; UCLK=ACLK
mov.b #0100b,&UBR00; 5MHz/19200 = 260.4 = 100000100b
mov.b #0001b,&UBR10;
mov.b #0000, &UMCTL0; Без модуляции
bic.b #SWRST,&UCTL0; Сброс USART не включен
bis.b #URXIE0+UTXIE0,&IE2
bis.b #UTXIFG0,&IFG2; Флаг гтовности к прерыванию
Loop bis.w #LPM3+GIE,SR
nop
jmp Loop
;-------------------------------------------------------------------
USART0TX_ISR;
;-------------------------------------------------------------------
mov.b R7, &TXBUF0;
reti
;--------------------------------------------------------------------
; Векторы прерываний
;--------------------------------------------------------------------

COMMON INTVEC

ORG RESET_VECTOR
DW RESET

ORG USART0TX_VECTOR
DW USART0TX_ISR

END.

Из программы видно, что я просто хочу передать содержимое R7 в ПК. Трудность заключается в том, что это значение передается не всегда. Запускаю программу, которая считывает информацию с com порта (программа работает 100% правильно), она в тестовый файл записывает значение 200(правильное значение). В следующий раз, после перезапуска программы, в текстовый файл она записывает величину 14. Потом снова 200. И я не пойму, что с ней происходит! Кто знает, отзовитесь пожалуйста sm.gif
d7d1cd
Где у вас происходит включение передатчика USART?
Isaev_ivan
bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема

Бит UTXE0 отвечает за передачу
k155la3
Цитата(Isaev_ivan @ Jun 9 2016, 08:31) *
bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема

Бит UTXE0 отвечает за передачу


URXE0 - а вектор евойный где ?
Isaev_ivan
А он разве нужен?? Я же не использую прерывание по приему.
d7d1cd
Цитата(Isaev_ivan @ Jun 9 2016, 09:13) *
Я же не использую прерывание по приему.

А зачем тогда устанавливаете бит разрешения прерывания на прием?
У Вас бит разрешения прерывания на передачу устанавливается один раз (не в основном цикле). На сколько я помню, после выполнения прерывания (после отправки данных), данный бит сбрасывается. То есть, у вас через USART должен отправиться только 1 байт.
Вы пишете, что выполняете перезапуск программы. Позвольте уточнить: перезапуск программы в ПК или в МК?
Isaev_ivan
Ну да, Вы правы, бит разрешения прерывания на прием лишний.
Вот тут написано, что бит UTXE0 не сбрасывается после обработки прерывания. Сбрасывается только бит UTXIFG0 и устанавливается после опустошения буфера TXBUF0
Или я чего-то недопонимаю??
В программе в ПК идет прием не одного байта, а потока информации.



Перезапуск программы в ПК
Obam
"UTXE0" и не должен сбрасываться просто так - он выключает передатчик (это же вам не нужно?). "UTXIFG0" будет в "0" только на то время, пока сдвиговый регистр передатчика отправляет текущий байт данных, а UTXBUF уже содержит новый байт данных. По сему, передача единственного байта выглядит так:
в основной программе разрешаете прерывание от пустого буфера передатчика

bis.b #UTXIE0,&IE2
Loop:
jmp Loop

а в обработчике прерывания загружаете R7 в UTXBUFF и запрещаете прерывание от пустого буфера передатчика:

mov.b R7, &TXBUF0;
biс.b #UTXIE0,&IE2


И почему вы не пользуетесь при отладке JTAGом?
Isaev_ivan
Извините, Obam, я не вполне понял что я делаю не так) у меня нет цели передачи одного байта. Я пользуюсь JTAGом только для прошивки в данном случае. у меня передается много данных. Но, если перезапускаю программу на ПК, то данные принимаются другие, вот в чем проблема(
Obam
Ага, я было решил, что вас смущает, почему передатчик сыплет данными без остановки (из вашего обработчика это и следует).

А JTAGом можно (и это самое ценное) посмотреть содержимое чего угодно в контроллере и выяснить действительно ли дурит ПК.
Genadi Zawidowski
Цитата
Запускаю программу, которая считывает информацию с com порта (программа работает 100% правильно), она в тестовый файл записывает значение 200(правильное значение). В следующий раз, после перезапуска программы, в текстовый файл она записывает величину 14. Потом снова 200.


Если передатчик сплошным потоком в старт-стопном формате посылает что-то отличающееся от 0xFF - приемник вполне может попасть в "синхронизацию" на каком-то нулевом бите в потоке данных. И не выйти из этого состояния (приём искаженных значений) до паузы или 0xFF. Вставляйте в поток данных от передатчика 0xFF и посмотрите, что будет.
Isaev_ivan
Genadi Zawidowski, спасибо, будем пробовать!
jcxz
Цитата(Genadi Zawidowski @ Jun 9 2016, 22:23) *
Если передатчик сплошным потоком в старт-стопном формате посылает что-то отличающееся от 0xFF - приемник вполне может попасть в "синхронизацию" на каком-то нулевом бите в потоке данных. И не выйти из этого состояния (приём искаженных значений) до паузы или 0xFF. Вставляйте в поток данных от передатчика 0xFF и посмотрите, что будет.

Не обязательно. Можно наоборот - больше 0-ей посылать. Приёмник будет периодически вылетать во frame-error, пока не найдёт правильный старт. Плохо если идёт поток чего-то повторяющегося, типа: 0xF7,0xF7,0xF7,0xF7,... - в этом случае никогда не вылетит. Можно не только паузы делать, можно использовать BREAK для установки правильной битовой синхронизации.
Genadi Zawidowski
ПОток нулей не годится. Так как ноль он стартовый бит.
mcheb
Цитата(Genadi Zawidowski @ Jun 10 2016, 00:52) *
ПОток нулей не годится. Так как ноль он стартовый бит.

Тема избитая и изъеженная. Бит - байт стаффинг, ЦеЭрЦе и тд. Тайм-аут
jcxz
Цитата(Genadi Zawidowski @ Jun 10 2016, 03:52) *
ПОток нулей не годится. Так как ноль он стартовый бит.

Стартовый бит это не 0.
Это переход 1->0 с последующим сэмплированием линии на наличие нуля в одном или нескольких пробах на частоте оверсемплинга x16. Вот если все эти условия выполняются, тогда и принимается решение что имеется старт-бит.
А просто сплошной 0 - это сигнал BREAK.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.