реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> UART MSP430, baudrate > 115200
mcheb
сообщение Jun 30 2015, 02:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Есть процессор 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

Сообщение отредактировал mcheb - Jun 30 2015, 02:25
Go to the top of the page
 
+Quote Post
NikolyaN
сообщение Jun 30 2015, 06:00
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-08-09
Пользователь №: 52 074



Тут не совсем понятно чему равен 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);


Удачи

Сообщение отредактировал NikolyaN - Jun 30 2015, 06:02
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 30 2015, 06:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
mcheb
сообщение Jun 30 2015, 06:25
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Цитата(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


Сообщение отредактировал mcheb - Jun 30 2015, 06:28
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 30 2015, 10:27
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (mcheb @ Jun 30 2015, 09:25) *
Спасибо! надо так:
#define BAUD (115200*2)

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Isaev_ivan
сообщение Jun 8 2016, 19:06
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-07-15
Пользователь №: 87 652



Добрый вечер, уважаемые форумчане!) Недавно возникла потребность передачи данных из микроконтроллера в ПК. Написал код на ассемблере, опираясь на 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
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jun 9 2016, 04:55
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Где у вас происходит включение передатчика USART?
Go to the top of the page
 
+Quote Post
Isaev_ivan
сообщение Jun 9 2016, 05:31
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-07-15
Пользователь №: 87 652



bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема

Бит UTXE0 отвечает за передачу
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 9 2016, 05:59
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



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

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


URXE0 - а вектор евойный где ?
Go to the top of the page
 
+Quote Post
Isaev_ivan
сообщение Jun 9 2016, 06:13
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-07-15
Пользователь №: 87 652



А он разве нужен?? Я же не использую прерывание по приему.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jun 9 2016, 06:47
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(Isaev_ivan @ Jun 9 2016, 09:13) *
Я же не использую прерывание по приему.

А зачем тогда устанавливаете бит разрешения прерывания на прием?
У Вас бит разрешения прерывания на передачу устанавливается один раз (не в основном цикле). На сколько я помню, после выполнения прерывания (после отправки данных), данный бит сбрасывается. То есть, у вас через USART должен отправиться только 1 байт.
Вы пишете, что выполняете перезапуск программы. Позвольте уточнить: перезапуск программы в ПК или в МК?
Go to the top of the page
 
+Quote Post
Isaev_ivan
сообщение Jun 9 2016, 07:07
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-07-15
Пользователь №: 87 652



Ну да, Вы правы, бит разрешения прерывания на прием лишний.
Вот тут написано, что бит UTXE0 не сбрасывается после обработки прерывания. Сбрасывается только бит UTXIFG0 и устанавливается после опустошения буфера TXBUF0
Или я чего-то недопонимаю??
В программе в ПК идет прием не одного байта, а потока информации.



Перезапуск программы в ПК
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 9 2016, 08:37
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



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

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

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

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


И почему вы не пользуетесь при отладке JTAGом?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Isaev_ivan
сообщение Jun 9 2016, 09:07
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-07-15
Пользователь №: 87 652



Извините, Obam, я не вполне понял что я делаю не так) у меня нет цели передачи одного байта. Я пользуюсь JTAGом только для прошивки в данном случае. у меня передается много данных. Но, если перезапускаю программу на ПК, то данные принимаются другие, вот в чем проблема(
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 9 2016, 09:20
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Ага, я было решил, что вас смущает, почему передатчик сыплет данными без остановки (из вашего обработчика это и следует).

А JTAGом можно (и это самое ценное) посмотреть содержимое чего угодно в контроллере и выяснить действительно ли дурит ПК.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 11:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01503 секунд с 7
ELECTRONIX ©2004-2016