Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MSP430F5418 + uC/OSII - есть впросы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Vadim66
Начал пробовать uC/OSII для 430F5xx. Как обычно начал с мигания светодиода. Сразу затык. Не совпадает частота мигания светодиода с расчетной. Итак по порядку: компилятор IAR C/C++ Compiler for MSP430 4.20.1 [Evaluation] (4.20.1.20017)
Операционка: uC/OS-II Version : V2.87
Тики считаются от WDT. Исходный код - пример порта для MSP430F5438 с сайта uC/OSII.

В файле MSP430x54x.h ввел строки:
#define WDT_ADLY_1000_wad (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS__64+WDTSSEL__ACLK) /*wad 1.95ms */ т.е. тактируем от ACLK, делим на 64 = получаем 512 Гц.

В файле os_cfg.h ввел строки:
#define OS_TICKS_PER_SEC 512 /*wad тики берем с кварца 32768 Гц */ т.е. 512 тиков в секунду

В файле bsp.c ввел строки: в процедуре TMR_TickInit:
WDTCTL = WDT_ADLY_1000_wad; //от ACLK 32 кГц - т.е запускаются тики таймера

В файле app.c ввел строки: в процедуре AppTaskStart:
while (1) { /* Task body, always written as an infinite loop. */
AppDispUpdate();
OSTimeDlyHMSM(0, 0, 1, 0);
P1OUT ^= 0x1;//wad - добавленная строка - мигания светодиода.
}

Результат: мигание светодиода с периодом 6,488с вместо 2 секунд!
Далее играл с настройкой периода WDT и константой OS_TICKS_PER_SEC:
-- вместо WDTIS__64 поставил WDTIS__32K (/32768) и OS_TICKS_PER_SEC=1 Результат: Период 4,000 сек вместо 2сек
-- поставил WDTIS__8192 (/8192) и OS_TICKS_PER_SEC=4 Результат: Период 5,000 сек вместо 2сек
-- поставил WDTIS__512 (/512) и OS_TICKS_PER_SEC=64 Результат: Период 5,250 сек вместо 2сек

Внимание, вопрос. Кто-нибудь не натыкался на глюки с таймерам WDT - к примеру несоответствие документации в части коэф-тов деления? Кто-нибудь не натыкался на глюки с тиками в операционке?
rezident
А если попроще помигать, без использования ОС, частота та, которая желаемая?
Vadim66
Как назло: помучился, сообщение отправил и сразу решение нашел... все дело в строке : AppDispUpdate(); - никак не ожидал что на 1 Мгц она исполняется более 2 сек. Закомментировал - и сразу как часы заработало... Пошел копаться дальше... Тему не закрываю - думаю вопросы еще будут. Интересно: кто нибудь занимается MSP430F5xxxx + uC/OSII?
alexsl
Добрый день. Тоже начал разработку на f5xxx(без ос). Портировал старый проект с f1611 на f541x. Столкнулся с такой проблемой. Частота ACLK(32768Гц) плавает в зависимости от напряжения питания (изменял в пределах 2.6-4.0 В) расхождение частот составило 500Гц!! Причем, частота на ножке кварца стабильно стоит 32768Гц. Смотел двух канальным осциллом сразу на кварце и на ножке ACLK. Проверено на трех имеющихся образцах f5418(2шт), f5419(1шт). Никто не встречал такого поведения?
За ранее спасибо.

Update. Все на самом деле оказалось тривиально. Купленные емкости оказались не того номинала что заказывали.
Vadim66
Пытаюсь разобраться с DMA в 5418: передается не то что нужно. Как сделать? Исходные данные:
CODE
//#1#################### Инициализация контактного последовательного порта #########################
void SerialContactInit(void)
{
P3SEL = 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL0 = 0;
UCA0CTL1 |= UCSSEL_2; // SMCLK

//для скорости 19200
UCA0BR0 = 54; // 1MHz 19200 (see User's Guide)
UCA0BR1 = 0;
UCA0MCTL = UCBRS_5 + UCBRF_0; // Modulation

UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
//UCA0IE |= UCRXIE; // Запускаем прерывание на прием
__no_operation(); // For debugger

}

//#2##### Старт передачи данных по контактному адаптеру с использованием DMA #####################
void SerialContactTransmitDmaStart (void)
{
DMA0CTL |= DMAEN; // запуск передачи
}
//#2#####
void SerialContactTransmitDmaOn (void)
{
//Настройка DMA для передачи буфера
// канал DMA0 на передачу с USCIA0 transmit
DMACTL0 = DMA0TSEL_17;
DMACTL1 = 0;
DMACTL2 = 0;
DMACTL3 = 0;
DMACTL4 = 0;

// Single transfer; destination address unchanged;
// Передача по байтам;
// DMAEN - откл; DMA interrupt Disabled;
DMA0CTL = DMADT_0 + DMADSTINCR_0 + DMASRCINCR_3 + DMADSTBYTE + DMASRCBYTE + DMALEVEL;

// Адрес источника данных
DMA0SA = (char*)&SerialBuffer;
// Адрес приемника данных
DMA0DA = (char*)&UCA0TXBUF;
// Количество байтов
DMA0SZ = CountSerialByte;

}

void SerialContactTransmitDmaOff (void)
{
DMA0CTL = 0;
DMA0SA = 0;
DMA0DA = 0;
DMA0SZ = 0;
}

void preparationBuffer(void) //временная процедура для подготовки передачи данных
{
char i;

for(i = 0; i < 255; i++)
{
//*(char*)&SerialBuffer[i] = i;
SerialBuffer[i] = i;
SerialInputBuffer[i] = 0; //приемный буфер очищаем
}
__no_operation();

}


Готовлю массив от 0 до 0xFE - 255 байт на передачу. Запускаю и получается на выходе:
CODE
FDh FBh F9h F7h F5h F3h F1h EFh EDh EBh E9h E7h E5h E3h E1h DFh DDh DBh D9h D7h
D5h D3h D1h CFh CDh CBh C9h C7h C5h C3h C1h BFh BDh BBh B9h B7h B5h B3h B1h AFh
ADh ABh A9h A7h A5h A3h A1h 9Fh 9Dh 9Bh 99h 97h 95h 93h 91h 8Fh 8Dh 8Bh 89h 87h
85h 83h 81h 7Fh 7Dh 7Bh 79h 77h 75h 73h 71h 6Fh 6Dh 6Bh 69h 67h 65h 63h 61h 5Fh
5Dh 5Bh 59h 57h 55h 53h 51h 4Fh 4Dh 4Bh 49h 47h 45h 43h 41h 3Fh 3Dh 3Bh 39h 37h
35h 33h 31h 2Fh 2Dh 2Bh 29h 27h 25h 23h 21h 1Fh 1Dh 1Bh 19h 17h 15h 13h 11h 0Fh
0Dh 0Bh 09h 07h 05h 03h 01h FFh 3Fh 9Fh EEh EAh E6h E2h DEh DAh D6h D2h CEh CAh
C6h C2h BEh BAh B6h B2h AEh AAh A6h A2h 9Eh 9Ah 96h 92h 8Eh 8Ah 86h 82h 7Eh 7Ah
76h 72h 6Eh 6Ah 66h 62h 5Eh 5Ah 56h 52h 4Eh 4Ah 46h 42h 3Eh 3Ah 36h 32h 2Eh 2Ah
26h 22h 1Eh 1Ah 16h 12h 0Eh 0Ah 06h 02h FEh 1Fh 8Fh DCh D4h CCh C4h BCh B4h ACh
A4h 9Ch 94h 8Ch 84h 7Ch 74h 6Ch 64h 5Ch 54h 4Ch 44h 3Ch 34h 2Ch 24h 1Ch 14h 0Ch
04h FCh 0Fh 87h B8h A8h 98h 88h 78h 68h 58h 48h 38h 28h 18h 08h F8h 07h 83h 70h
50h 30h 10h F0h 03h 81h E0h 01h 00h


Почему передача ведется с конца массива, да еще и через байт?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.