mcheb 0 30 июня, 2015 Опубликовано 30 июня, 2015 (изменено) · Жалоба Есть процессор 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 Изменено 30 июня, 2015 пользователем mcheb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikolyaN 0 30 июня, 2015 Опубликовано 30 июня, 2015 (изменено) · Жалоба Тут не совсем понятно чему равен 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); Удачи Изменено 30 июня, 2015 пользователем NikolyaN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 30 июня, 2015 Опубликовано 30 июня, 2015 · Жалоба #define BAUD 115200*1 #define FSYS 115200*32*2 UCA0BRW = FSYS/BAUD; Вы-бы хоть для начала НУ ХОТЬ НЕМНОГО задумались, хотя-бы на уровне знаний арифметики начальной школы, что получится в результате такой подстановки при #define BAUD 115200*2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 30 июня, 2015 Опубликовано 30 июня, 2015 (изменено) · Жалоба Вы-бы хоть для начала НУ ХОТЬ НЕМНОГО задумались, хотя-бы на уровне знаний арифметики начальной школы, что получится в результате такой подстановки при #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 Изменено 30 июня, 2015 пользователем mcheb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 30 июня, 2015 Опубликовано 30 июня, 2015 · Жалоба Спасибо! надо так: #define BAUD (115200*2) Да. А посему, запомните простую препростую вещь всегда, абсолютно всегда и абсолютно все дефайны заключать в скобки (ну только если, они ЯВНО,как текстовые литералы они не использутся). Даже если это #define DUMMY (1) Всегда! Дабы потом не думать о том что получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Isaev_ivan 0 8 июня, 2016 Опубликовано 8 июня, 2016 · Жалоба Добрый вечер, уважаемые форумчане!) Недавно возникла потребность передачи данных из микроконтроллера в ПК. Написал код на ассемблере, опираясь на 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. И я не пойму, что с ней происходит! Кто знает, отзовитесь пожалуйста :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба Где у вас происходит включение передатчика USART? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Isaev_ivan 0 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема Бит UTXE0 отвечает за передачу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема Бит UTXE0 отвечает за передачу URXE0 - а вектор евойный где ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Isaev_ivan 0 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба А он разве нужен?? Я же не использую прерывание по приему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
d7d1cd 0 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба Я же не использую прерывание по приему. А зачем тогда устанавливаете бит разрешения прерывания на прием? У Вас бит разрешения прерывания на передачу устанавливается один раз (не в основном цикле). На сколько я помню, после выполнения прерывания (после отправки данных), данный бит сбрасывается. То есть, у вас через USART должен отправиться только 1 байт. Вы пишете, что выполняете перезапуск программы. Позвольте уточнить: перезапуск программы в ПК или в МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Isaev_ivan 0 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба Ну да, Вы правы, бит разрешения прерывания на прием лишний. Вот тут написано, что бит UTXE0 не сбрасывается после обработки прерывания. Сбрасывается только бит UTXIFG0 и устанавливается после опустошения буфера TXBUF0 Или я чего-то недопонимаю?? В программе в ПК идет прием не одного байта, а потока информации. Перезапуск программы в ПК Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба "UTXE0" и не должен сбрасываться просто так - он выключает передатчик (это же вам не нужно?). "UTXIFG0" будет в "0" только на то время, пока сдвиговый регистр передатчика отправляет текущий байт данных, а UTXBUF уже содержит новый байт данных. По сему, передача единственного байта выглядит так: в основной программе разрешаете прерывание от пустого буфера передатчика bis.b #UTXIE0,&IE2 Loop: jmp Loop а в обработчике прерывания загружаете R7 в UTXBUFF и запрещаете прерывание от пустого буфера передатчика: mov.b R7, &TXBUF0; biс.b #UTXIE0,&IE2 И почему вы не пользуетесь при отладке JTAGом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Isaev_ivan 0 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба Извините, Obam, я не вполне понял что я делаю не так) у меня нет цели передачи одного байта. Я пользуюсь JTAGом только для прошивки в данном случае. у меня передается много данных. Но, если перезапускаю программу на ПК, то данные принимаются другие, вот в чем проблема( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 9 июня, 2016 Опубликовано 9 июня, 2016 · Жалоба Ага, я было решил, что вас смущает, почему передатчик сыплет данными без остановки (из вашего обработчика это и следует). А JTAGом можно (и это самое ценное) посмотреть содержимое чего угодно в контроллере и выяснить действительно ли дурит ПК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться