А правильно ли написанна программа, чтобы изменять скважность ШИМа отправляя число по 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]);
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------