ArtemTom 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Чип MSP430F449IPZ, кварцевый резонатор PK-206 32.768MHz. Комп <-RS232-> MSP430F449 <-> Внешнее устройство С компа передаются данные на внешнее устройство через плату с MSP, внешнее устройство отправляет по запросу данные назад на ПК. В программе начинаю так и все работает: #include <msp430x44x.h> #define P1ON 0x90 #define P2ON 0x60 #define DTR1 0x02 #define DTR2 0x01 void main(void) { WDTCTL = WDTPW + WDTHOLD; // FLL module FLL_CTL0 |= XCAP0PF; FLL_CTL1= XT2OFF; //SMCLK - on, XT2 - off, MCLK - DC0CLK, SMCLK -DCOCLK, ACLK devider 1 FLL_CTL0 = DCOPLUS; SCFQCTL = 128-1; SCFI0 = FLLD_2 +FN_2; // DCO 1.4 - 12 MHz (FLLD_2 +FN_2) // FLL module // Порты на комп UCTL0=SWRST; UTCTL0 = SSEL1; // UCLK = SMCLK UBR10 = 0x01; // 8MHz 19200 UBR00 = 0xA0; // 8MHz 19200 UMCTL0 = 0xBB; // 8MHz 19200 UCTL0 = 0x10; // 8n1 P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD P2DIR |= 0x10; // P2.4 output ME1 |= UTXE0 + URXE0; // вкл USART0 TXD/RXD UCTL0 &= ~SWRST; IE1 |= URXIE0; // вкл USART0 RX interrupt //Внешнее устройство UTCTL1 = SSEL1; // UCLK = SMCLK UBR11 = 0x01; // 8MHz 19200 UBR01 = 0xA0; // 8MHz 19200 UMCTL1 = 0xBB; // 8MHz 19200 UCTL1 = 0x10; // 8n1 P4SEL = 0x03; // P4.0,1 = USART1 TXD/RXD P4DIR = 0xFD; // P4.1 output ME2 |= UTXE1 + URXE1; // USART1 TXD/RXD IE2 &= ~0x30; // откл RxTx interrupts P4OUT = 0x50; // откл RX and TX BTCTL = BT_ADLY_125; // BT_fLCD_DIV128 SVSCTL = 0x70; // SVS 2.65 volt P1IE = DTR1+DTR2; // вкл INT at port 1 and port 2 IE2 |= BTIE; // вкл basic timer WDTCTL = WDT_ARST_1000; // Start WDT (1sec) IE1 |= 0x01; // вкл WDT interrupt; _EINT(); } #pragma vector=UART0RX_VECTOR __interrupt void usart0_rx (void) { IFG1 &= ~URXIFG0; while ((IFG2 & UTXIFG1) == 0); TXBUF1 = RXBUF0; } #pragma vector=UART1RX_VECTOR __interrupt void usart1_rx (void) { IFG2 &= ~URXIFG1; while ((IFG1 & UTXIFG0) == 0); TXBUF0 = RXBUF1; } #pragma vector=BASICTIMER_VECTOR __interrupt void RTC(void) { IFG2 &= ~BTIFG; // Reset WotchDog Timer WDTCTL = WDT_ARST_1000; } Пытаюсь менять строки: UBR10 = 0x01; // 8MHz 19200 UBR00 = 0xA0; // 8MHz 19200 UMCTL0 = 0xBB; // 8MHz 19200 На другую скорость, при этом передаются иероглифы. Пробовал но нескольким файлам расчетов этих параметров. Наверно затупил где-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Пробовал но нескольким файлам расчетов этих параметров. Наверно затупил где-то? Наверняка. У меня 115200 от 2МГц спокойно работало на 149-м, без всяких выкрутасов. Не думаю, чтобы в 449 что-то сильно поменялось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Наверно затупил где-то? Так у вас же ОЖИДАНИЯ торчат в процедурах обработки прерываний! - Вещь невиданная. И еще хотите, чтобы прерывания обрабатывались с большой скоростью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArtemTom 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба while ((IFG2 & UTXIFG1) == 0); Эти чтоль? Как по мануалу, ждём Ready. Да и не в большой скорости дело, просто не могу настроить скорость отличную от 19200. Хотя может быть проблема и во внешнем устройстве. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба while ((IFG2 & UTXIFG1) == 0); не могу настроить скорость отличную от 19200. Ну так приведите пример, для какой скорости чего настраивали. Хотя я не понимаю, какие могут быть проблемы - входную тактовую частоту UART поделить на битрейт и разнести по двум байтам Так у вас же ОЖИДАНИЯ торчат в процедурах обработки прерываний! Это может повлиять на задержки между байтами, но не на формат кадра - то есть были бы пропуски, но между правильными символами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба кварцевый резонатор PK-206 32.768MHz.А разве кто-то обещал, что проц будет работать с такой частотой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Это может повлиять на задержки между байтами, но не на формат кадра - то есть были бы пропуски, но между правильными символами Это влияет на учет числа принимаемых/отсылаемых байт. Пока МК в прерывании висит на ожидании, новые поступающие по UART байты не учитываются, пропадая всуе. А потом говорится, что байты де пропали. Если ожидания там нет, то и ожидать нечего. Советую ради теста закоментарить ожидания и посмотреть как это скажется на скорости. А вообще-то программы взаимной пересылки между обоими UART'ами так не пишут. Никаких ожиданий быть не должно, а нужна буферизация. Т.е. в прерывании от поступления байта этот байт пишется в (самодельный) FIFO, из которого потом второй UART тоже по прерыванию (на этот раз от опустошения передатчика) забирает байты для передачи. В случае необходимости перекрестной пересылки - заводят два таких буфера для очередей на передачу для каждого из UART. И перехватывают 4 прерывания - по готовности передатчика и наличию в приемнике по каждому UART. Принимаемые байты пишутся в буфера очередей с одновременным разрешением прерывания по опустошению передатчика своего соседа. А в своем прерывании по опустошению передатчика забираешь байт из своего буфера и отсылаешь его. Если же буфер пуст, то маскируешь собственное прерывание по опустошению. Разрешать его будет сосед, когда запишет для тебя что-то в буфер. Где-то так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArtemTom 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба А разве кто-то обещал, что проц будет работать с такой частотой?Ну тут я опечатался немного, не MHz конечно. Пробовал так, для 9600 UBR10 = 0x03; UBR00 = 0x41; UMCTL0 = 0xBB; программы взаимной пересылки между обоими UART'ами так не пишут.Да я пока для примера, получится, буду обделывать. Сейчас постарался поменьше ненужного кода пихать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Пробовал так, для 9600 UBR10 = 0x03; UBR00 = 0x41; UMCTL0 = 0xBB; Вроде никакого криминала, хотя при таком соотношении частот можно смело занулять модулятор. Скорее всего, дело в PC-шной части. Хотя... Сейчас некогда разбираться, а вы случайно половинки регистров от разных УАРТов не перемешали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArtemTom 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Да вроде ничего не перемешивал на 19200 все же работает. Ладно, вроде все правильно, должно работать, наверно дело в чем то другом. Думал может кто подскажет из-за чего всякая лабуда в ком-порт может поступать, как-будто скорость не ту указал. Щас пошаманю немного может получится чего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба ArtemTom, у вас тактовая частота SMCLK выбрана 12МГц, вы от нее же и тактируете UART, так почему же расчетная частота для тактирования у вас 8МГц? Это раз. Во-вторых, изучите внимательно раздел, где описаны источники прерываний USART и условия при которых сбрасываются флаги прерываний. Никакие опросы флагов в прерывании не требуются. Переход по вектору прерывания уже является фактом наличия установленного флага прерывания. Для передатчика этот же факт перехода по вектору прерывания является причиной для автоматического сброса флага данного прерывания. Программно сбрасывать флаг не нужно. Так можно потерять следующее прерывание. Для сброса же флага прерывания приемника UASRT есть два условия: чтение буфера приемника, либо программный сброс флага. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Да вроде ничего не перемешивал на 19200 все же работает. Потому что настройки одинаковые. А если вы берёте один байт от новой скорости, а другой - от старой - получится полная каша. Проверьте для успокоения. Похоже на то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ArtemTom 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба у вас тактовая частота SMCLK выбрана 12МГц, вы от нее же и тактируете UART, так почему же расчетная частота для тактирования у вас 8МГц? Это раз.Я думал что 8MHz указал. В примерах правда такой вариант есть: FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set, freq = xtal x D x N+1 SCFI0 |= FN_4; // x2 DCO freq, 8MHz nominal DCO SCFQCTL = 121; // (121+1) x 32768 x 2 = 7.99 MHz Можете ткнуть пальцем почему в моём случае 12 MHz, а то я видимо не разобрался? Если можно, разъясните пожалуйста по подробней про UMCTL0, не разберусь с этой модуляцией, как её указывать? а вы случайно половинки регистров от разных УАРТов не перемешали? Проверьте для успокоения. Похоже на то. Тут я видимо тоже не понял. Как проверить? Да, флаги я тоже зря наставил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Можете ткнуть пальцем почему в моём случае 12 MHz, а то я видимо не разобрался?А я на ваши комментарии ориентировался, лень было проверять :) Если очень нужно, то давайте вместе разберемся. Если можно, разъясните пожалуйста по подробней про UMCTL0, не разберусь с этой модуляцией, как её указывать?Когда-то VAI выкладывал здесь экселевский файлик для расчета параметров UART. См. приложение. ModRegister_vai.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Тут я видимо тоже не понял. Как проверить? По даташиту. Всё нормально. UART0 Transmit buffer UTXBUF0 077h Receive buffer URXBUF0 076h Baud rate UBR10 075h Baud rate UBR00 074h Modulation control UMCTL0 073h Receive control URCTL0 072h Transmit control UTCTL0 071h UART control UCTL0 070h Я думал, что UBR10 и UBR01 можно случайно попутать.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться