|
UART MSP430, baudrate > 115200 |
|
|
|
Jun 30 2015, 06:00
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 30 2015, 06:25
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602

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

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 8 2016, 19:06
|
Участник

Группа: Участник
Сообщений: 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. И я не пойму, что с ней происходит! Кто знает, отзовитесь пожалуйста
|
|
|
|
|
Jun 9 2016, 05:31
|
Участник

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

|
bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема Бит UTXE0 отвечает за передачу
|
|
|
|
|
Jun 9 2016, 06:13
|
Участник

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

|
А он разве нужен?? Я же не использую прерывание по приему.
|
|
|
|
|
Jun 9 2016, 06:47
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(Isaev_ivan @ Jun 9 2016, 09:13)  Я же не использую прерывание по приему. А зачем тогда устанавливаете бит разрешения прерывания на прием? У Вас бит разрешения прерывания на передачу устанавливается один раз (не в основном цикле). На сколько я помню, после выполнения прерывания (после отправки данных), данный бит сбрасывается. То есть, у вас через USART должен отправиться только 1 байт. Вы пишете, что выполняете перезапуск программы. Позвольте уточнить: перезапуск программы в ПК или в МК?
|
|
|
|
|
Jun 9 2016, 07:07
|
Участник

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

|
Ну да, Вы правы, бит разрешения прерывания на прием лишний. Вот тут написано, что бит UTXE0 не сбрасывается после обработки прерывания. Сбрасывается только бит UTXIFG0 и устанавливается после опустошения буфера TXBUF0 Или я чего-то недопонимаю?? В программе в ПК идет прием не одного байта, а потока информации. Перезапуск программы в ПК
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 9 2016, 09:07
|
Участник

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

|
Извините, Obam, я не вполне понял что я делаю не так) у меня нет цели передачи одного байта. Я пользуюсь JTAGом только для прошивки в данном случае. у меня передается много данных. Но, если перезапускаю программу на ПК, то данные принимаются другие, вот в чем проблема(
|
|
|
|
|
Jun 9 2016, 18:33
|
Участник

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

|
Genadi Zawidowski, спасибо, будем пробовать!
|
|
|
|
|
Jun 9 2016, 21:34
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Genadi Zawidowski @ Jun 9 2016, 22:23)  Если передатчик сплошным потоком в старт-стопном формате посылает что-то отличающееся от 0xFF - приемник вполне может попасть в "синхронизацию" на каком-то нулевом бите в потоке данных. И не выйти из этого состояния (приём искаженных значений) до паузы или 0xFF. Вставляйте в поток данных от передатчика 0xFF и посмотрите, что будет. Не обязательно. Можно наоборот - больше 0-ей посылать. Приёмник будет периодически вылетать во frame-error, пока не найдёт правильный старт. Плохо если идёт поток чего-то повторяющегося, типа: 0xF7,0xF7,0xF7,0xF7,... - в этом случае никогда не вылетит. Можно не только паузы делать, можно использовать BREAK для установки правильной битовой синхронизации.
|
|
|
|
|
Jun 10 2016, 13:54
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602

|
Цитата(Genadi Zawidowski @ Jun 10 2016, 00:52)  ПОток нулей не годится. Так как ноль он стартовый бит. Тема избитая и изъеженная. Бит - байт стаффинг, ЦеЭрЦе и тд. Тайм-аут
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|