jjjjjjein 0 25 января, 2012 Опубликовано 25 января, 2012 · Жалоба Нужно затактировать Таймер А от 200Гц. SMCLK тактируется от DCO, не знаю как нужную частоту получить (200Гц). void InitializationTimersMSP430 (void) // Функция инициализации внутренних аппаратных таймеров микроконтроллера MSP430F135 { // Общая инициализвция модуля тактирования микроконтроллера BCSCTL1 = 0x00; // Обнуление управляющего регистра BCSCTL1 BCSCTL2 = 0x00; // Обнуление управляющего регистра BCSCTL2 BCSCTL1 = RSEL0; // Сопротивление внутреннего резистора -> минимальное BCSCTL2 = SELM_0 | // Источник тактирования MCLK -> DCO DIVM_3 | // Делитель MCLK -> 8 SELS_0 | // Источник тактирования SMCLK -> DCO DIVS_3; // Делитель SMCLK -> 8 DCOCTL = DCO0 | // Частота генератора -> (??? Гц) MOD0 | MOD1 | MOD2 | MOD3 | MOD4; // Модулятор тактовой частоты DCO -> МАКСИМУМ LPM4; // Низкое энергопотребление // Инициализация таймера А TACTL = TASSEL_2 | // Источник тактирования таймера -> сигнал SMCLK (???МГц) ID_3 | // Предделитель таймера -> 8 MC_1; // Режим работы таймера -> счёт вверх до значения TACCR0 TACCR0 = 10000; // Счёт до значения -> 10000 TACCTL0 = CCIE; // Разрешение прерывания по захвату/сравнению, разрешение запроса прерывания от флага CCIFG } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 25 января, 2012 Опубликовано 25 января, 2012 · Жалоба У таймера А делитель есть только на 2, 4 и 8. Значит ваш SMCLK должен быть 200 Гц, 400 Гц, 800 Гц или 1.6 кГц. Делитель SMCLK имеет такие же варианты, значит DCO надо настроить на частоту 200 Гц, 400 Гц, 800 Гц, 1.6 кГц, 3.2 кГц, 6.4 кГц или 12.8 кГц. DCO можете подстраивать на нужную частоту вручную внешним резистором или автоматически по кварцевому резонатору (AppNote : Controlling the DCO Frequency of the MSP430x11x, SCIENTIFIC INSTRUMENTS USING THE TI MSP430 Tutorial 16c: Accurate Clocks). P.S. к тому же ваша программа закончится на строчке LPM4; так как прерывания запрещены и мк переходит в режим LPM4 со всеми отключеными источниками тактирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jjjjjjein 0 25 января, 2012 Опубликовано 25 января, 2012 · Жалоба У меня в библиотеке значение LPM4 немного изменено просто, так что всё впорядке) а мой вопрос немного изменился. мне надо создать ШИМ с частотой 200Гц, что бы можно было менять его скважность. Какой регистр отвечает за скважность ШИМа, я не совсем понимаю работу Таймера при выводе ШИМ сигналов. 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 25 января, 2012 Опубликовано 25 января, 2012 · Жалоба мне надо создать ШИМ с частотой 200Гц, что бы можно было менять его скважность. Какой регистр отвечает за скважность ШИМа За скважность ШИМа отвечает соотношение CCR0 и CCRx, где CCRx - защелка, с которой снимается ШИМ. CCR0 задает период импульсов (в режиме "вверх"), CCRx - длительность импульса. В зависимости от режима выхода OUT (сброс/установка или установка/сброс) импульсы будут положительные или отрицательные. В вашем случае нужно инициализировать TACCR1 (например) значением длительности импульса (относительно CCR0 = 40000) То есть CCR1 = CCR0 * PWM_value Плюс TACCTL1 = OUTMOD7; (конфигурация выхода, режим сброс/установка) ШИМ будет на ноге TA1 (альтернативная функция) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jjjjjjein 0 26 января, 2012 Опубликовано 26 января, 2012 · Жалоба А правильно ли написанна программа, чтобы изменять скважность ШИМа отправляя число по 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]); } } //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jjjjjjein 0 26 января, 2012 Опубликовано 26 января, 2012 · Жалоба Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются Или напишите кто-нибудь пример простой программы, как переслать 1 символ по UARTу, с инициализацией USART и функциями, которые используются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 26 января, 2012 Опубликовано 26 января, 2012 · Жалоба Примеры кода и работы с периферией лучше искать на страничке производителя http://www.ti.com/product/msp430f135 Ищите то, что называется Code Examples Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jjjjjjein 0 30 января, 2012 Опубликовано 30 января, 2012 · Жалоба Примеры кода на асемблере написанны. А может кто-нибудь простой код на си отправить, как один символ из гипертерминала по UARTу в контроллер MSP430F135 перенести? А то я в UARTе ничего не понимаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться