Jump to content

    

jjjjjjein

Участник
  • Content Count

    40
  • Joined

  • Last visited

Community Reputation

0 Обычный

About jjjjjjein

  • Rank
    Участник
  1. Здравствуйте, у меня есть плата с двумя контроллерами MSP430F135 и MSP430F168, соединенными по UART. Есть разъемы для подключения обоих контроллеров к ПК через UART. К 135 контроллеру подключен датчик температуры и 135 контроллер должен передавать температуру второму контроллеру а второй контроллер ПК. Ещё оба контроллера должны проверять друг друга, что оба они в рабочем состоянии. Как написать такую програму-драйвер? В какой из контроллеров её записать? Где можно почитать о подобных програмах? Может есть у кого-нибудь пример подобной програмы на других контроллерах?
  2. MSP430 ШИМ

    На третей ножке порта1 нужно создать ШИМ с регулируемой скважностью. Cкважность меняется при изменении параметра Peremennaya. Как скважность ШИМа- CCR1 связать с портом 1? В коде это место отмечено вопросами. int main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset _DINT(); // Запрещаем прерывания InitializationPortIO (); // Вызов функции инициализации портов ввода/вывода микроконтроллера InitializationTimersMSP430 (); // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 InitializationUSART (); // Вызов функции инициализации модуля USART InitializationADC (); // Вызов Функции инициализации модуля АЦП микроконтроллера _EINT(); // Разрещаем прерывания while (1) { if (Flag_1s == true) // Если флаг 1 секунды поставлен P1.......; // ??????????????? Flag_1s = false; } } // return 0; } //******************************************************************************** ********************************************************************************* ****************************** //************************************************************* ОПИСАНИЯ ФУНКЦИЙ ******************************************************************************** ************************ void InitializationTimersMSP430 (void) // Функция инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 { // Общая инициализвция модуля тактирования микроконтроллера BCSCTL1 = 0x00; // Обнуление управляющего регистра BCSCTL1 BCSCTL2 = 0x00; // Обнуление управляющего регистра BCSCTL2 BCSCTL1 = RSEL0 | RSEL1 | RSEL2; // Сопротивление внутреннего резистора -> МАКСИМУМ BCSCTL2 = SELM_2 | // Источник тактирования MCLK -> XT2CLK DIVM_0 | // Делитель MCLK -> 1 SELS | // Источник тактирования SMCLK -> XT2CLK DIVS_0; // Делитель SMCLK -> 1 DCOCTL = DCO0 | DCO1 | DCO2 | // Частота генератора -> МАКСИМУМ (8000000 Гц) MOD0 | MOD1 | MOD2 | MOD3 | MOD4; // Модулятор тактовой частоты DCO -> МАКСИМУМ LPM4; // Генераторы DCO и LFXT1 отключены // Инициализация Flash-памяти FCTL2 = 0xA553; // Предделитель частоты тактирования -> 20 (400000 Гц) // Инициализация таймера А TACTL = TASSEL_2 | // Источник тактирования таймера -> сигнал SMCLK MC_1 | // Режим работы таймера -> счёт вверх до значения TACCR0 ID_3; // Предделитель таймера -> 8 TACCR0 = 50000; // Счёт до значения -> 40000 TACCTL0 = CCIE; // Разрешение прерывания по захвату/сравнению CCR1 = CCR0 * Peremennaya; // Скважность ШИМа TACCTL1 = OUTMOD_7; // Конфигурация выхода, режим сброс/установка } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void InitializationPortIO (void) // Функция инициализации портов ввода вывода микроконтроллера { // Инициализация порта ввода/вывода №1 P1SEL = 0x06; // 3 вывод порта настроен как функция периферийного модуля P1OUT = 0x00; // На всех выводах порта установлены логические "0" P1DIR = 0x06; // 3 вывод порта настроен как выход }
  3. Цитата IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр Какой смысл в *i ? В том то и дело, что я не знаю этого, хочу, чтобы переменная (у меня было от 0 до 100, но можно от 0 до 20 например) задавала порядковый номер преобразованию АЦП, а потом, поделив на 20, считать среднее значение преобразований. Это для того, что если будут помехи (т. к. фильтра у контроллера на плате не стоит), не брать в расчет заведомо неверное преобразование АЦП, которое очень отличается от среднего значения.
  4. Через компорт прошиваю в программную память MSP430F135 программатором Olmex. Открываю гипертерминал и контроллер раз в секунду передаёт на экран время и температуру по UARTу. А нужно ещё писать в гипертерминале число от 0 до 100, чтобы эти данные передавались в контроллер. Ещё, может у кого есть примеры программных фильтров. Хочу, чтобы из 100 преобразований АЦП из напряжения в температуру среднее считал и сильно отличающиеся результаты выбрасывал. Но на языке си не знаю как это написать.
  5. Есть 2 кода. Один, для того, чтобы микроконтроллер принимал по UARTу данные, другой, микроконтроллер передаёт температуру со своего внутреннего датчика в гипертерминал через UART. По отдельности программы работают, а вместе нет. В чем может быть причина? И ещё вопрос. Программный фильтр в начале кода у меня наверно неправильно написан, как можно его исправить? int main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset _DINT(); // Запрещаем прерывания InitializationPortIO (); // Вызов функции инициализации портов ввода/вывода микроконтроллера InitializationTimersMSP430 (); // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 InitializationUSART (); // Вызов функции инициализации модуля USART InitializationADC (); // Вызов Функции инициализации модуля АЦП микроконтроллера _EINT(); // Разрещаем прерывания while (1) { ADC12CTL0 |= ADC12SC; // Выборка и запуск unsigned int i = 0; // Программный фильтр for(i=1; i<=100;) // Программный фильтр { IntDegC = (IntDegC + Code_ADC_CPU*i); // Программный фильтр i++; // Программный фильтр } IntDegC = (((IntDegC / 100)- 1855) * 667) / 4096; // Формула для температуры в градусах цельсия //IntDegC = ((IntDegC - 1855) * 667) / 4096; //----------------------------------------------------------------------------------------------------------- if (Flag_1s == true) // Приём по UART { UART_printf ("\r\ntime %u:%u:%u",TimeHour, TimeMinute, TimeSecond); // Передача времени UART_printf ("\r\nT=%u",IntDegC); // Передача температуры //------------------------------------------------------------------------------------------------------- if (ADC_MEASSURING == false) { ADC_MEASSURING = true; Code_ADC_CPU = 0; ADC12CTL0 |= 0x03; } if (FlagAcceptDataUART == true) { // Передача по UART данных if (Counter_UART_RXDATA == 4) {ASCI_TO_DESYATICHNAYA = (BUFER_UART_RXD [0] - 48)*100 + (BUFER_UART_RXD [1] - 48)*10 + (BUFER_UART_RXD [2] - 48);} else if(Counter_UART_RXDATA == 3) {ASCI_TO_DESYATICHNAYA = (BUFER_UART_RXD [0] - 48)*10 + (BUFER_UART_RXD [1] - 48);} else if(Counter_UART_RXDATA == 2) {ASCI_TO_DESYATICHNAYA = (BUFER_UART_RXD [0]) - 48;} UART_printf ("\r\nЗАДАНА МОЩНОСТЬ: %u\r\n" , ASCI_TO_DESYATICHNAYA); char Counter_UART_RXDATA1; for (Counter_UART_RXDATA1 = 0; Counter_UART_RXDATA1 <= 4;) { BUFER_UART_RXD[Counter_UART_RXDATA1] = 0; Counter_UART_RXDATA1 ++; } Counter_UART_RXDATA = 0; FlagAcceptDataUART = false; FlagOverloadBuferUART = false; } Flag_1s = false; } } // return 0; }
  6. Подскажите, как настроить ножку Р1.2 так, чтобы выводить на неё ШИМ сигнал? // Инициализация порта ввода/вывода №1 P1SEL = 0x00; // Все выводы порта настроены как цыфровые линии P1DIR = 0x04; // 3 вывод порта настроен как выход
  7. ADC MSP430

    Эти то биты, это понятно. Они сам режим изменяют. А кроме них, что изменить. Я переделала код, но АЦП не работает. ADC12CTL1 = SHP | // Источник сигнала SAMPCON -> таймер выборки и хранения ADC12SSEL0 | ADC12SSEL1 | // Источник тактирования АЦП -> тактовая частота SMCLK CONSEQ_2 | // Режим работы АЦП -> повторяющийся одноканальный CSTARTADD_15 | // Стартовый адрес начала преобразования АЦП -> ADC12MEM15 ADC12DIV_3; Спасибо за пример. Если ещё примеры скинете, то буду рада)
  8. ADC MSP430

    АЦП работает в режиме "повторяющаяся последовательность каналов"(ниже написан код). Хочу перейти на режим "повторяющийся одноканальный". Какие регистры изменить и что добавить для работы АЦП в "повторяющемся одноканальном" режиме, чтобы брать из ячейки памяти №15 данные о температуре с внутреннего температурного датчика? void InitializationADC (void) // Функция инициализации модуля АЦП микроконтроллера { // Управляющий регистр 0 АЦП12 - ADC12CTL0 ADC12CTL0 = ADC12ON | // Включаем модуль АЦП MSC | // Разрешаем режим множественных выборок и преобразований (только для последовательных и повторных режимов преобразования) SHT1_4; // Устанавливаем время выборки и хранения для ячеек памяти результатов преобразования с 8 по 15 равным 32 циклам // ENC | // Разрешаем преобразование // ADC12SC; // Запускаем преобразование // Управляющий регистр 1 АЦП12 - ADC12CTL1 ADC12CTL1 = SHP | // Источник сигнала SAMPCON -> таймер выборки и хранения ADC12SSEL0 | ADC12SSEL1 | // Источник тактирования АЦП -> тактовая частота SMCLK CONSEQ_3 | // Режим работы АЦП -> повторяющаяся последовательность каналов // CONSEQ_2 | // Режим работы АЦП -> повторяющийся одноканальный CSTARTADD_15 | // Стартовый адрес начала преобразования АЦП -> ADC12MEM15 ADC12DIV_3; // Тактовый делитель частоты тактирования = 4 // Управляющий регистр памяти преобразований АЦП12 ADC12MCTL15 = INCH_10; // Для ячейки памяти №15 включаем внутренний датчик температуры // Управляющий регистр разрешения прерываний АЦП - ADC12IE ADC12IE = ADC12IV_ADC12IFG15; // Разрешаем прерывание от АЦП при заполнении 15 ячейки памяти }
  9. Нужноотправлять по UARTу температуру в градусах цельсия раз в секунжу. По UARTу нормально передаёт, только какую то константу, а не температуру const int ADC_RETURN_TEMPERATURA_32[]={500,500,499,499,499,498,498,498,497,497,496,496,496,495,495,495,494,494,49 4,493,493,492,492,492,491,491,491,490,490,490,489,489,489, 488,488,487,487,487,486,486,486,485,485,485,484,484,484,483,483,483,482,482,481, 481,481,480,480,480,479,479,479,478,478,478,477,477, 477,476,476,476,475,475,475,474,474,474,473,473,473,472,472,472,471,471,471,470, 470,469,469,469,468,468,468,467,467,467,466,466,466, 465,465,465,464,464,464,463,463,463,462,462,462,462,461,461,461,460,460,460,459, 459,459,458,458,458,457,457,457,456,456,456,455,455, 455,454,454,454,453,453,453,452,452,452,451,451,451,451,450,450,450,449,449,449, 448,448,448,447,447,447,446,446,446,446,445,445,445, 444,444,444,443,443,443,442,442,442,441,441,441,441,440,440,440,439,439,439,438, 438,438,437,437,437,437,436,436,436,435,435,435,434, 434,434,434,433,433,433,432,432,432,431,431,431,431,430,430,430,429,429,429,429, 428,428,428,427,427,427,426,426,426,426,425,425,425, 424,424,424,424,423,423,423,422,422,422,422,421,421,421,420,420,420,420,419,419, 419,418,418,418,418,417,417,417,416,416,416,416,415, 415,415,414,414,414,414,413,413,413,413,412,412,412,411,411,411,411,410,410,410, 409,409,409,409,408,408,408,408,407,407,407,406,406, 406,406,405,405,405,405,404,404,404,403,403,403,403,402,402,402,402,401,401,401, 401,400,400,400,399,399,399,399,398,398,398,398,397, 397,397,397,396,396,396,396,395,395,395,395,394,394,394,393,393,393,393,392,392, 392,392,391,391,391,391,390,390,390,390,389,389,389, 389,388,388,388,388,387,387,387,387,386,386,386,386,385,385,385,385,384,384,384, 384,383,383,383,383,382,382,382,382,381,381,381,381, 380,380,380,380,379,379,379,379,378,378,378,378,377,377,377,377,377,376,376,376, 376,375,375,375,375,374,374,374,374,373,373,373,373, 372,372,372,372,371,371,371,371,371,370,370,370,370,369,369,369,369,368,368,368, 368,368,367,367,367,367,366,366,366,366,365,365,365, 365,365,364,364,364,364,363,363,363,363,362,362,362,362,362,361,361,361,361,360, 360,360,360,360,359,359,359,359,358,358,358,358,358, 357,357,357,357,356,356,356,356,356,355,355,355,355,354,354,354,354,354,353,353, 353,353,352,352,352,352,352,351,351,351,351,350,350, 350,350,350,349,349,349,349,349,348,348,348,348,348,347,347,347,347,346,346,346, 346,346,345,345,345,345,345,344,344,344,344,344,343, 343,343,343,343,342,342,342,342,341,341,341,341,341,340,340,340,340,340,339,339, 339,339,339,338,338,338,338,338,337,337,337,337,337, 336,336,336,336,336,335,335,335,335,335,334,334,334,334,334,333,333,333,333,333, 332,332,332,332,332,331,331,331,331,331,330,330,330, 330,330,329,329,329,329,329,328,328,328,328,328,328,327,327,327,327,327,326,326, 326,326,326,325,325,325,325,325,324,324,324,324,324, 324,323,323,323,323,323,322,322,322,322,322,321,321,321,321,321,321,320,320,320, 320,320,319,319,319,319,319,318,318,318,318,318,318, 317,317,317,317,317,316,316,316,316,316,316,315,315,315,315,315,314,314,314,314, 314,314,313,313,313,313,313,313,312,312,312,312,312, 311,311,311,311,311,311,310,310,310,310,310,309,309,309,309,309,309,308,308,308, 308,308,308,307,307,307,307,307,307,306,306,306,306, 306,305,305,305,305,305,305,304,304,304,304,304,304,303,303,303,303,303,303,302, 302,302,302,302,302,301,301,301,301,301,301,300,300, 300,300,300,300,299,299,299,299,299,299,298,298,298,298,298,298,297,297,297,297, 297,297,296,296,296,296,296,296,295,295,295,295,295, 295,294,294,294,294,294,294,294,293,293,293,293,293,293,292,292,292,292,292,292, 291,291,291,291,291,291,290,290,290,290,290,290,290, 289,289,289,289,289,289,288,288,288,288,288,288,287,287,287,287,287,287,287,286, 286,286,286,286,286,285,285,285,285,285,285,285,284, 284,284,284,284,284,283,283,283,283,283,283,283,282,282,282,282,282,282,281,281, 281,281,281,281,281,280,280,280,280,280,280,280,279, 279,279,279,279,279,278,278,278,278,278,278,278,277,277,277,277,277,277,277,276, 276,276,276,276,276,276,275,275,275,275,275,275,275, 274,274,274,274,274,274,274,273,273,273,273,273,273,272,272,272,272,272,272,272, 271,271,271,271,271,271,271,270,270,270,270,270,270, 270,269,269,269,269,269,269,269,269,268,268,268,268,268,268,268,267,267,267,267, 267,267,267,266,266,266,266,266,266,266,265,265,265, 265,265,265,265,264,264,264,264,264,264,264,264,263,263,263,263,263,263,263,262, 262,262,262,262,262,262,261,261,261,261,261,261,261, 261,260,260,260,260,260,260,260,259,259,259,259,259,259,259,259,258,258,258,258, 258,258,258,257,257,257,257,257,257,257,257,256,256, 256,256,256,256,256,255,255,255,255,255,255,255,255,254,254,254,254,254,254,254, 254,253,253,253,253,253,253,253,253,252,252,252,252, 252,252,252,251,251,251,251,251,251,251,251,250,250,250,250,250,250,250,250,249, 249,249,249,249,249,249,249,248,248,248,248,248,248, 248,248,247,247,247,247,247,247,247,247,246,246,246,246,246,246,246,246,245,245, 245,245,245,245,245,245,244,244,244,244,244,244,244, 244,243,243,243,243,243,243,243,243,242,242,242,242,242,242,242,242,241,241,241, 241,241,241,241,241,241,240,240,240,240,240,240,240, 240,239,239,239,239,239,239,239,239,238,238,238,238,238,238,238,238,238,237,237, 237,237,237,237,237,237,236,236,236,236,236,236,236, 236,236,235,235,235,235,235,235,235,235,234,234,234,234,234,234,234,234,234,233, 233,233,233,233,233,233,233,232,232,232,232,232,232, 232,232,232,231,231,231,231,231,231,231,231,231,230,230,230,230,230,230,230,230, 229,229,229,229,229,229,229,229,229,228,228,228,228, 228,228,228,228,228,227,227,227,227,227,227,227,227,227,226,226,226,226,226,226, 226,226,226,225,225,225,225,225,225,225,225,225,224, 224,224,224,224,224,224,224,224,223,223,223,223,223,223,223,223,223,222,222,222, 222,222,222,222,222,222,221,221,221,221,221,221,221, 221,220,220,220,220,220,220,220,220,220,219,219,219,219,219,219,219,219,219,218, 218,218,218,218,218,218,218,218,217,217,217,217,217, 217,217,217,217,217,216,216,216,216,216,216,216,216,216,215,215,215,215,215,215, 215,215,215,214,214,214,214,214,214,214,214,214,214, 213,213,213,213,213,213,213,213,213,212,212,212,212,212,212,212,212,212,212,211, 211,211,211,211,211,211,211,211,210,210,210,210,210, 210,210,210,210,210,209,209,209,209,209,209,209,209,209,208,208,208,208,208,208, 208,208,208,208,207,207,207,207,207,207,207,207,207, 207,206,206,206,206,206,206,206,206,206,206,205,205,205,205,205,205,205,205,205, 204,204,204,204,204,204,204,204,204,204,203,203,203, 203,203,203,203,203,203,203,202,202,202,202,202,202,202,202,202,202,201,201,201, 201,201,201,201,201,201,201,200,200,200,200,200,200, 200,200,200,200,199,199,199,199,199,199,199,199,199,199,198,198,198,198,198,198, 198,198,198,198,197,197,197,197,197,197,197,197,197, 197,196,196,196,196,196,196,196,196,196,196,195,195,195,195,195,195,195,195,195, 195,194,194,194,194,194,194,194,194,194,194,193,193, 193,193,193,193,193,193,193,193,193,192,192,192,192,192,192,192,192,192,192,191, 191,191,191,191,191,191,191,191,191,190,190,190,190, 190,190,190,190,190,190,189,189,189,189,189,189,189,189,189,189,189,188,188,188, 188,188,188,188,188,188,188,187,187,187,187,187,187, 187,187,187,187,187,186,186,186,186,186,186,186,186,186,186,185,185,185,185,185, 185,185,185,185,185,185,184,184,184,184,184,184,184, 184,184,184,183,183,183,183,183,183,183,183,183,183,183,182,182,182,182,182,182, 182,182,182,182,181,181,181,181,181,181,181,181,181, 181,181,180,180,180,180,180,180,180,180,180,180,180,179,179,179,179,179,179,179, 179,179,179,179,178,178,178,178,178,178,178,178,178, 178,177,177,177,177,177,177,177,177,177,177,177,176,176,176,176,176,176,176,176, 176,176,176,175,175,175,175,175,175,175,175,175,175, 175,174,174,174,174,174,174,174,174,174,174,174,173,173,173,173,173,173,173,173, 173,173,173,172,172,172,172,172,172,172,172,172,172, 172,171,171,171,171,171,171,171,171,171,171,171,170,170,170,170,170,170,170,170, 170,170,170,169,169,169,169,169,169,169,169,169,169, 169,168,168,168,168,168,168,168,168,168,168,168,167,167,167,167,167,167,167,167, 167,167,167,166,166,166,166,166,166,166,166,166,166, 166,166,165,165,165,165,165,165,165,165,165,165,165,164,164,164,164,164,164,164, 164,164,164,164,163,163,163,163,163,163,163,163,163, 163,163,163,162,162,162,162,162,162,162,162,162,162,162,161,161,161,161,161,161, 161,161,161,161,161,160,160,160,160,160,160,160,160, 160,160,160,160,159,159,159,159,159,159,159,159,159,159,159,158,158,158,158,158, 158,158,158,158,158,158,158,157,157,157,157,157,157, 157,157,157,157,157,157,156,156,156,156,156,156,156,156,156,156,156,155,155,155, 155,155,155,155,155,155,155,155,155,154,154,154,154, 154,154,154,154,154,154,154,154,153,153,153,153,153,153,153,153,153,153,153,152, 152,152,152,152,152,152,152,152,152,152,152,151,151, 151,151,151,151,151,151,151,151,151,151,150,150,150,150,150,150,150,150,150,150, 150,150,149,149,149,149,149,149,149,149,149,149,149, 149,148,148,148,148,148,148,148,148,148,148,148,148,147,147,147,147,147,147,147, 147,147,147,147,147,146,146,146,146,146,146,146,146, 146,146,146,146,145,145,145,145,145,145,145,145,145,145,145,145,145,144,144,144, 144,144,144,144,144,144,144,144,144,143,143,143,143, 143,143,143,143,143,143,143,143,142,142,142,142,142,142,142,142,142,142,142,142, 142,141,141,141,141,141,141,141,141,141,141,141,141, 140,140,140,140,140,140,140,140,140,140,140,140,140,139,139,139,139,139,139,139, 139,139,139,139,139,139,138,138,138,138,138,138,138, 138,138,138,138,138,137,137,137,137,137,137,137,137,137,137,137,137,137,136,136, 136,136,136,136,136,136,136,136,136,136,136,135,135, 135,135,135,135,135,135,135,135,135,135,135,134,134,134,134,134,134,134,134,134, 134,134,134,134,133,133,133,133,133,133,133,133,133, 133,133,133,133,132,132,132,132,132,132,132,132,132,132,132,132,132,132,131,131, 131,131,131,131,131,131,131,131,131,131,131,130,130, 130,130,130,130,130,130,130,130,130,130,130,130,129,129,129,129,129,129,129,129, 129,129,129,129,129,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,127,127,127,127,127,127,127,127,127,127,127,127,127,127, 126,126,126,126,126,126,126,126,126,126,126,126,126, 126,125,125,125,125,125,125,125,125,125,125,125,125,125,125,124,124,124,124,124, 124,124,124,124,124,124,124,124,124,124,123,123,123, 123,123,123,123,123,123,123,123,123,123,123,122,122,122,122,122,122,122,122,122, 122,122,122,122,122,122,121,121,121,121,121,121,121, 121,121,121,121,121,121,121,121,120,120,120,120,120,120,120,120,120,120,120,120, 120,120,120,119,119,119,119,119,119,119,119,119,119, 119,119,119,119,119,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118, 118,117,117,117,117,117,117,117,117,117,117,117,117, 117,117,117,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,115, 115,115,115,115,115,115,115,115,115,115,115,115,115, 115,115,115,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,113, 113,113,113,113,113,113,113,113,113,113,113,113,113, 113,113,113,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112, 112,111,111,111,111,111,111,111,111,111,111,111,111, 111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 110,110,110,110,109,109,109,109,109,109,109,109,109, 109,109,109,109,109,109,109,109,109,109,108,108,108,108,108,108,108,108,108,108, 108,108,108,108,108,108,108,108,108,107,107,107,107, 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,106,106,106, 106,106,106,106,106,106,106,106,106,106,106,106,106, 106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 105,105,105,105,105,105,105,104,104,104,104,104,104, 104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,103,103,103, 103,103,103,103,103,103,103,103,103,103,103,103,103, 103,103,103,103,103,103,103,103,102,102,102,102,102,102,102,102,102,102,102,102, 102,102,102,102,102,102,102,102,102,102,102,102,102, 102,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, 101,101,101,101,101,101,101,101,101,101,100,100,100, 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100, 100,100,100,100,100,100,100,100}; int main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset _DINT(); // Запрещаем прерывания InitializationPortIO (); // Вызов функции инициализации портов ввода/вывода микроконтроллера InitializationTimersMSP430 (); // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 InitializationUSART (); // Вызов функции инициализации модуля USART InitializationADC (); // Вызов Функции инициализации модуля АЦП микроконтроллера _EINT(); // Разрещаем прерывания while (1) { if (Flag_1s == true) { Temperatura_CPU = ADC_RETURN_TEMPERATURA_32[(ADC12MEM15 - L_ADRES_MASSIV_ADC)]; UART_printf ("\r\n Temperatura=%u",Temperatura_CPU); ADC12MEM15 = 0; Flag_1s = false; } } // return 0; } //******************************************************************************** ********************************************************************************* ****************************** //********************************************************** ОБРАБОТЧИКИ ПРЕРЫВАНИЙ ******************************************************************************** ********************* #pragma vector = TIMERA0_VECTOR // Прерывание от таймера А (срабатывает каждые 50 мс) __interrupt void isr_TACCR0() { ProgramCounter_1 ++; if (ProgramCounter_1 >= 20) { Flag_1s = true; TimeSecond ++; if (TimeSecond > 59) { TimeSecond = 0; TimeMinute ++; } if (TimeMinute > 59) { TimeMinute = 0; TimeHour ++; } if (TimeHour > 250) { TimeHour = 0; } ProgramCounter_1 = 0; } } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #pragma vector = USART0RX_VECTOR // Прерывание от приёмника UART () __interrupt void isr_URXIFG0(void) { BUFER_UART_RXD [Counter_UART_RXDATA] = U0RXBUF; if (BUFER_UART_RXD [Counter_UART_RXDATA] == 0x0d) { FlagAcceptDataUART = true; } Counter_UART_RXDATA ++; if (Counter_UART_RXDATA > MAX_BUFER_UART_RXD) { Counter_UART_RXDATA = 0; FlagOverloadBuferUART = true; } } //******************************************************************************** ********************************************************************************* ****************************** //************************************************************* ОПИСАНИЯ ФУНКЦИЙ ******************************************************************************** ************************ void InitializationTimersMSP430 (void) // Функция инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 { // Общая инициализвция модуля тактирования микроконтроллера BCSCTL1 = 0x00; // Обнуление управляющего регистра BCSCTL1 BCSCTL2 = 0x00; // Обнуление управляющего регистра BCSCTL2 BCSCTL1 = RSEL0 | RSEL1 | RSEL2; // Сопротивление внутреннего резистора -> МАКСИМУМ BCSCTL2 = SELM_2 | // Источник тактирования MCLK -> XT2CLK DIVM_0 | // Делитель MCLK -> 1 SELS | // Источник тактирования SMCLK -> XT2CLK DIVS_0; // Делитель SMCLK -> 1 DCOCTL = DCO0 | DCO1 | DCO2 | // Частота генератора -> МАКСИМУМ (8000000 Гц) MOD0 | MOD1 | MOD2 | MOD3 | MOD4; // Модулятор тактовой частоты DCO -> МАКСИМУМ LPM4; // Генераторы DCO и LFXT1 отключены // Инициализация таймера А TACTL = TASSEL_2 | // Источник тактирования таймера -> сигнал SMCLK MC_1 | // Режим работы таймера -> счёт вверх до значения TACCR0 ID_3; // Предделитель таймера -> 8 TACCR0 = 50000; // Счёт до значения -> 50000 TACCTL0 = CCIE; // Разрешение прерывания по захвату/сравнению // Инициализация таймера B } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void InitializationPortIO (void) // Функция инициализации портов ввода вывода микроконтроллера { // Инициализация порта ввода/вывода №1 // Инициализация порта ввода/вывода №2 // Инициализация порта ввода/вывода №3 P3SEL |= BIT4 | BIT5; // Выводы 4 и 5 порта 3 настроены как выводы альтернативных функций (USART) P3DIR |= BIT4; // Вывод 4 порта 3 настраиваем как выход - TXD P3DIR &= ~BIT5; // Вывод 5 порта 3 настраиваем как вход - RXD0 } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void InitializationUSART (void) // Функция инициализации модуля USART микроконтроллера { // Инициализации модуля USART0 UTCTL0 = SSEL1 | SSEL0; // Источник тактирования таймера -> сигнал SMCLK UCTL_0 = CHAR; // Количество бит во фрейме -> 8 UBR00 = 0x45; // Установка коэффициента предделителя USART для скорости приёма/передачи = 115200 при тактовой частоте 8000000 МГц UBR10 = 0x00; // |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||| UMCTL0 = 0xBA; // Установка коэффициента модулятора USART для скорости приёма/передачи = 115200 при тактовой частоте 8000000 МГц ME1 = UTXE0 | // Включаем передатчик UART URXE0; // Включаем приёмник UART IE1 |= URXIE0; // Enable USART0 RX interrupt // U1CTL &= ~SWRST; //reset UART logic } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void UART_putChar (char c) // UART1 Transmit Subroutine. Send ony byte via UART. @param c Character to send. { while ((IFG1 & UTXIFG0) == 0); // Wait for ready U1TXBUF U0TXBUF = c; // send data } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- char UART_getCharIsReady (void) // Check UART's input buffer. @return TRUE: if input buffer contains received data. { return (IFG1 & URXIFG0) != 0; } //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- char UART_getChar (void) // Receive one byte via UART. This function waits for the input (blocking).@return Received character. { while (!UART_getCharIsReady ()); return U0RXBUF; } //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void UART_write (const char *buf, int length) // Write string buffer to UART. @param buf String buffer to send. @param length Length of string buffer. { int i; for (i = 0; i < length; i++) { UART_putChar (buf[i]); } } //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void UART_printf (const char *fmt, ...) // Printf function which uses UART interface to send. @param fmt Printf format string. Example: "Value: %02i\r\n" { // UART_printf ("Number: %02i\r\n", number); static va_list valist; char buf[UART_PRINTF_BUF_SIZE]; va_start (valist, fmt); vsnprintf (buf, sizeof (buf), fmt, valist); va_end (valist); UART_write (buf, strlen (buf)); } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void InitializationADC (void) // Функция инициализации модуля АЦП микроконтроллера { //ПЕРВЫЙ ВАРИАНТ КОДА ДЛЯ РАБОТЫ С АЦП (повтаряющаяся последовательность каналов) // Управляющий регистр 0 АЦП12 - ADC12CTL0 ADC12CTL0 = ADC12ON | // Включаем модуль АЦП REF2_5V | // Выбираем значение опорного напряжения равным 2,5 В REFON | // Включаем генератор опорного напряжения MSC | // Разрешаем режим множественных выборок и преобразований (только для последовательных и повторных режимов преобразования) SHT0_3 | // Устанавливаем время выборки и хранения для ячеек памяти результатов преобразования с 0 по 7 равным 32 циклам SHT1_3; // Устанавливаем время выборки и хранения для ячеек памяти результатов преобразования с 8 по 15 равным 32 циклам // Управляющий регистр 1 АЦП12 - ADC12CTL1 ADC12CTL1 = SHP | // Источник сигнала SAMPCON -> таймер выборки и хранения ADC12SSEL0 | ADC12SSEL1 | // Источник тактирования АЦП -> тактовая частота SMCLK CONSEQ_3 | // Режим работы АЦП -> повторяющаяся последовательность каналов CSTARTADD_0 | // Стартовый адрес начала преобразования АЦП -> ADC12MEM0 ADC12DIV_2; // Тактовый делитель частоты тактирования = 3 // Управляющий регистр памяти преобразований АЦП12 ADC12MCTL15 = INCH_11; // Для ячейки памяти №15 выбираем внутренний источник опрного напряжения, внутренний датчик температуры // Управляющий регистр разрешения прерываний АЦП - ADC12IE ADC12IE = ADC12IV_ADC12IFG15; // Разрешаем прерывание от АЦП при заполнении 15 ячейки памяти }
  10. UART

    Спасибо всем за такие подробные ответы и за ваше безграничное терпение по поводу моего абсолютного не знания микроконтроллеров)
  11. UART

    //************************************************** ПОДКЛЮЧАЕМЫЕ К ПРОЕКТУ БИБЛИОТЕКИ ******************************************************************************** ****************** #include "msp430x13x.h" // Стандартная библиотека описания микроконтроллеров серии MSP430x13x #include "stdbool.h" // Стандартная библиотека для работы с переменными типа BOOL #include "stdio.h" // Стандартная библиотека ввовда/вывода #include "stdint.h" #include "usart_msp430.h" // Подключение библиотеки для работы с модулем USART микроконтроллера MSP430F135 data_convert_adc.h //******************************************************************************** ********************************************************************************* ****************************** //************************************************* ГЛОБАЛЬНЫЕ ПНРЕМЕННЫЕ ******************************************************************************** *************** volatile uint16_t t_interrupt; // 16-разрядный целочисленный тип без знака uint16_t time1, time2,t1, t2; // 16-разрядный целочисленный тип без знака //******************************************************************************** ********************************************************************************* ****************************** //************************************************* ФУНКЦИИ ПРЕДСТАВЛЕННЫЕ ДАННЫМ МОДУЛЕМ ******************************************************************************** *************** uint16_t clock_10ms(void) { do { t1=t_interrupt; t2=t_interrupt; } while(t1 != t2); return t2; } void InitializationTimersMSP430 (void); // Функция инициализации внутренних аппаратных таймеров микроконтроллера void InitializationPortIO (void); // Функция инициализации портов ввода вывода микроконтроллера void InitializationUSART (void); // Функция инициализации модуля USART микроконтроллера //******************************************************************************** ********************************************************************************* ****************************** //************************************************************** ТЕЛО МОДУЛЯ ******************************************************************************** **************************** //******************************************************************************** ********************************************************************************* ****************************** void main( void ) { WDTCTL = WDTPW + WDTHOLD; // Остановка сторожевого таймера, чтобы предотвратить время сброса _DINT(); // Запрещаем прерывания InitializationPortIO (); // Вызов функции инициализации портов ввода/вывода микроконтроллера InitializationTimersMSP430 (); // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 InitializationUSART (); // Вызов функции инициализации модуля USART _EINT(); // Разрещаем прерывания time1 = clock_10ms(); // time2 = clock_10ms(); for (;;) { if ((clock_10ms() - time1) >= 100) //проверка периода (1сек) { // А вот в этом месте мне надо передать по UART 1 символ, UART инициализирован, а вот как написать само действие передачи, ни разу в жизни не видела, и всякие примеры кода и пдф по msp мне не советуйте, ибо всеравно ничего из них не пойму // Передача по UART time1 = clock_10ms(); } //if ((clock_10ms() - time2) >= 50) //проверка периода // { P4OUT ^= BIT4; // time2 = clock_10ms(); // } } /* while (1) { if (Flag_100ms == true) // Если поставлен флаг 100мс { P4OUT = ~(P4OUT & BIT3); // Состояние 4 вывода 4 порта меняется Flag_100ms = false; // Флаг убирается } } */ } //******************************************************************************** ********************************************************************************* ****************************** //********************************************************** ОБРАБОТЧИКИ ПРЕРЫВАНИЙ ******************************************************************************** ********************* #pragma vector=TIMERA0_VECTOR // Прерывание от таймера А (срабатывает каждые 10 мс) __interrupt void isr_TACCR0() { t_interrupt += 1UL; //инкремент переменной времени прерывания }
  12. UART

    Примеры кода на сайте техас инструмент на асемблере написанны. А может кто-нибудь простой код на си написать, как один символ из гипертерминала по UARTу в контроллер MSP430F135 перенести? А то я в UARTе ничего не понимаю
  13. Примеры кода на асемблере написанны. А может кто-нибудь простой код на си отправить, как один символ из гипертерминала по UARTу в контроллер MSP430F135 перенести? А то я в UARTе ничего не понимаю
  14. Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются
  15. А правильно ли написанна программа, чтобы изменять скважность ШИМа отправляя число по UART через гипертерминал от ПК к MSP430? Не знаю, как основной код программы написать, который под комментарием // Передача данных по UART. int main( void ) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset _DINT(); // Запрещаем прерывания InitializationPortIO (); // Вызов функции инициализации портов ввода/вывода микроконтроллера InitializationTimersMSP430 (); // Вызов функции инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 InitializationUSART (); // Вызов функции инициализации модуля USART _EINT(); // Разрещаем прерывания while (1) { // Передача данных по UART if (Flag_1s == true) { Transmit_UART_Debug_Info (); } Flag_1s = false; } //******************************************************************************** ********************************************************************************* ****************************** void InitializationTimersMSP430 (void) // Функция инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 { // Общая инициализвция модуля тактирования микроконтроллера BCSCTL1 = 0x00; // Обнуление управляющего регистра BCSCTL1 IFG1 &= ~XT2OFF; // XT2 = HF XTAL int y; // Включение XT2 do { IFG1 &= ~OFIFG; // Очистка флага OFIFG for (y = 0xFF; y > 0; y--); // Задержка } while (IFG1 & OFIFG); // проверка BCSCTL2 = 0x00; // Обнуление управляющего регистра BCSCTL2 DCOCTL = DCO0 | DCO1 | DCO2 | // Частота генератора -> МАКСИМУМ (8000000 Гц) MOD0 | MOD1 | MOD2 | MOD3 | MOD4; // Модулятор тактовой частоты DCO -> МАКСИМУМ BCSCTL1 = RSEL0 | RSEL1 | RSEL2; // Сопротивление внутреннего резистора -> МАКСИМУМ BCSCTL2 = SELM_2 | // Источник тактирования MCLK -> XT2CLK DIVM_0 | // Делитель MCLK -> 1 SELS | // Источник тактирования SMCLK -> XT2CLK DIVS_0; // Делитель SMCLK -> 1 LPM4; // Генераторы DCO и LFXT1 отключены // Инициализация таймера А TACTL = TASSEL_2 | // Источник тактирования таймера -> сигнал SMCLK (8МГц) ID_0 | // Предделитель таймера -> 1 MC_1; // Режим работы таймера -> счёт вверх до значения TACCR0 TACCR0 = 40000; // Счёт до значения -> 40000 TACCTL0 = CCIE; // Разрешение прерывания по захвату/сравнению, разрешение запроса прерывания от флага CCIFG CCR1 = CCR0 * PWM_value; // Скважность ШИМа TACCTL1 = OUTMOD_7; // Конфигурация выхода, режим сброс/установка } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void InitializationPortIO (void) // Функция инициализации портов ввода вывода микроконтроллера { // Инициализация порта ввода/вывода №3 P3SEL |= BIT4 | BIT5; // Выводы 4 и 5 порта 3 настроены как выводы альтернативных функций (USART) P3DIR |= BIT4; // Вывод 4 порта 3 настраиваем как выход - TXD P3DIR &= ~BIT5; // Вывод 5 порта 3 настраиваем как вход - RXD0 // Инициализация порта ввода/вывода №4 P4SEL = 0x00; // Все выводы порта настроены как цыфровые линии P4OUT = 0x00; // На всех выводах порта установлены логические "0" P4DIR = 0xFF; // Все выводы порта настроены как выходы // Инициализация порта ввода/вывода №6 P6SEL |= BIT0 | BIT1 | BIT2; // Выводы 0, 1 и 2 порта 6 настроены как выводы альтернативных функций (ADC) // P6SEL = 0x07; P6DIR &= ~BIT0; // Вывод 0 порта 6 настраиваем как вход - канал ADC0 P6DIR &= ~BIT1; // Вывод 1 порта 6 настраиваем как вход - канал ADC1 P6DIR &= ~BIT2; // Вывод 2 порта 6 настраиваем как вход - канал ADC2 // P6DIR = 0xF8; P6OUT = 0x00; } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void InitializationUSART (void) // Функция инициализации модуля USART микроконтроллера { // Инициализации модуля USART0 UTCTL0 = SSEL1 | SSEL0; // Источник тактирования таймера -> сигнал SMCLK UCTL_0 = CHAR; // Количество бит во фрейме -> 8 UBR00 = 0x45; // Установка коэффициента предделителя USART для скорости приёма/передачи = 115200 при тактовой частоте 8000000 МГц UBR10 = 0x00; // |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||| UMCTL0 = 0xBA; // Установка коэффициента модулятора USART для скорости приёма/передачи = 115200 при тактовой частоте 8000000 МГц ME1 = UTXE0 | // Включаем передатчик UART URXE0; // Включаем приёмник UART IE1 |= URXIE0; // Enable USART0 RX interrupt // U1CTL &= ~SWRST; //reset UART logic } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void UART_putChar (char c) // UART1 Transmit Subroutine. Send ony byte via UART. @param c Character to send. { while ((IFG1 & UTXIFG0) == 0); // Wait for ready U1TXBUF U0TXBUF = c; // send data } //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void UART_write (const char *buf, int length) // Write string buffer to UART. @param buf String buffer to send. @param length Length of string buffer. { int i; for (i = 0; i < length; i++) { UART_putChar (buf[i]); } } //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------