имеется код
Код
#include <msp430x16x.h>
#pragma vector=USART0RX_VECTOR
__interrupt void RxD()
{
int byte = RXBUF0;
DoSomething();
}
int main()
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL = 0x30;
U0CTL = CHAR; // Установить длину данных - 8 бит
UTCTL0 = 0x20; // Источник тактирования ACLK
U0BR0 = 0x03
U0BR1 = 0x00;
U0MCTL = 0x4A;
// Включить модуль USART через SFR (прием и передача)
ME1 |= (UTXE0 | URXE0);
// Разрешить прерывания по приему
IE1 |= URXIE0;
// Очищаем SWRST бит
U0CTL &= ~SWRST;
_EINT();
_BIS_SR(LPM0_bits | GIE);
}
#pragma vector=USART0RX_VECTOR
__interrupt void RxD()
{
int byte = RXBUF0;
DoSomething();
}
int main()
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL = 0x30;
U0CTL = CHAR; // Установить длину данных - 8 бит
UTCTL0 = 0x20; // Источник тактирования ACLK
U0BR0 = 0x03
U0BR1 = 0x00;
U0MCTL = 0x4A;
// Включить модуль USART через SFR (прием и передача)
ME1 |= (UTXE0 | URXE0);
// Разрешить прерывания по приему
IE1 |= URXIE0;
// Очищаем SWRST бит
U0CTL &= ~SWRST;
_EINT();
_BIS_SR(LPM0_bits | GIE);
}
стабилизирующий резонатор имеет частоту 32768 Гц. В Отладчике ставлю брейкпоинт в теле прерывания RxD(), чтобы отследить значения принятых данных. Данные не совпадают с теми, что отправляю с компьютера (скорость 9600). С четностями и стоповыми битами ошибок нет 100%.
Если назначить U0BR0 = 0x1b, U0MCTL = 0x03 (для скорости 1200 бод, на компьютере скорость соответственно тоже меняется), то все нормально работает.
А вопрос почему? в книжке написано, что при такой передаче ошибка составляет 15%. разве это много?
И еще: если использовать резонатор с бОльшей частотой (скажем 2 МГц), то U0BR0 и U0BR1 расчитываются из соотношения (частота резонатора) / скорость. А как расчитывается значение U0MCTL? Да и вообще для чего этот регистр нужен. Дайте, кто-нибудь ссылку, плз.
[добавлено]
Если использовать резонатор 2 МГц, конденсаторами какой емкости его лучше снабдить?