Осваиваем микроконтроллер MSP430
|
|
| Пн, 24.12.2012, 22:13 | Сообщение # 1
|
frenele
Постов: 30
ОК |
Здравствуйте уважаемые форумчане! Решил я поделится свежими знания по программированию нового микроконтроллера MSP430 для радиолюбителей.
Компания Техас Инструменс разработала для начинающих недорогой отладочный набор MSP-EXP430G2. На сегодняшний день это самое дешевое отладочное средство. Я купил такой набор всего за 319 рублей. В него входит два микроконтроллера и отладочная плата с программатором с поддержкой внутрисхемной отладки.
Добавлено (24.12.2012, 22:51) --------------------------------------------- На сайте производителя предполагаются две бесплатные среды разработки Code Composer Studio IAR Embedded Workbench Kickstart
Вот пример проекта мигание светодиода от таймера Добавлено (24.12.2012, 23:13) --------------------------------------------- #include <msp430g2553.h>
void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 |= DIVA_0; // ACLK/1 BCSCTL3 |= XCAP_3; // 12.5pF cap- setting for 32768Hz crystal BCSCTL2 = SELS + SELM_2;
CCR0 = 512; // 512 -> 1 sec, 30720 -> 1 min CCTL0 = CCIE; // CCR0 interrupt enabled TA0CTL = TASSEL_2 + ID_3 + MC_1; // ACLK, /8, upmode
P1DIR = 0xFF; // All P1.x outputs P1OUT = 0; // All P1.x reset
P2DIR = 0xFF; // All P2.x outputs P2OUT = 0; // All P2.x reset
_BIS_SR(GIE); //interrupt Enable
while (1) // mainLoop {
} }
#pragma vector=TIMER0_A0_VECTOR __interrupt void Timer0_A0 (void) { P1OUT ^= 0x01; // Toggle P1.0 }
|
|
| Вт, 25.12.2012, 07:51 | Сообщение # 2
|
skateman
Постов: 2201
Друзья |
frenele, какой объем кода халявный IAR для MSP поддерживает?
|
|
| Вт, 25.12.2012, 21:53 | Сообщение # 3
|
frenele
Постов: 30
ОК |
Цитата (skateman) какой объем кода халявный IAR для MSP поддерживает?
IAR Embedded Workbench Kickstart - 4 кБт Code Composer Studio - 16 кБтДобавлено (25.12.2012, 22:50) --------------------------------------------- Выкладываю инициализацию UARTа для связи с компьютером скорость 9600 бод и подключен кварц 32768 Гц
void init_UART() { UCA0CTL1 |= UCSWRST; // Reset on USARTA UCA0CTL1 |= UCSSEL_1; // CLK = ACLK UCA0BR0 = 0x03; // 32kHz/9600 = 3.41 UCA0BR1 = 0x00; // UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt } void init_PORTS() { P1DIR = BIT1 + BIT2; // P1.1,2 outputs P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD P1SEL2= BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD P1OUT = 0; // All P1.x reset P2DIR = 0xFF; // All P2.x outputs P2OUT = 0; // All P2.x reset }
Добавлено (25.12.2012, 22:53) --------------------------------------------- И обработчик прерывания #pragma vector= USCIAB0RX_VECTOR __interrupt void USCIAB0RX (void) { while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF+1; // TX -> RXed character unsigned int b = UCA0RXBUF;
if ( b == '...') это пример { } else { } }
|
|
| Ср, 26.12.2012, 07:28 | Сообщение # 4
|
skateman
Постов: 2201
Друзья |
frenele, к коду желательно комментов побольше и на нашем славянском. Как я понял в MSP глобального разрешения прерываний не требуется?
|
|
| Ср, 26.12.2012, 18:30 | Сообщение # 5
|
frenele
Постов: 30
ОК |
Цитата (skateman) Как я понял в MSP глобального разрешения прерываний не требуется?
Тоже требуется, вот строка: пример на Си
_BIS_SR(GIE); //Разрешение маскируемых прерываний
пример на ассемблер
bis.b #GIE,SR ;Разрешение маскируемых прерываний
Я буду по русски писать коменты, все коды которые я выкладываю опробованы мною.
|
|
| Чт, 27.12.2012, 06:51 | Сообщение # 6
|
skateman
Постов: 2201
Друзья |
Теперь ясно. Видимо разница от AVR не особая.
|
|
| Чт, 27.12.2012, 17:10 | Сообщение # 7
|
frenele
Постов: 30
ОК |
Цитата (skateman) Теперь ясно. Видимо разница от AVR не особая.
Разница очень большая. Архитектура и принципы работы модулей очень сильно отличаются от авр и пик. Микроконтроллер способен работать на разных клоках одновременно и переходить с одного клока на другой. Допустим ядро работает на одном тактовом генераторе, а периферия на другом, UART на третем.
|
|
| Чт, 27.12.2012, 17:28 | Сообщение # 8
|
skateman
Постов: 2201
Друзья |
Цитата (frenele) Допустим ядро работает на одном тактовом генераторе, а периферия на другом, UART на третем. Круто. Жаль времени нет, а то бы поковырял.
|
|
| Чт, 27.12.2012, 17:52 | Сообщение # 9
|
frenele
Постов: 30
ОК |
Вот пример реализации шим на порт P1.6
void init_TAMERS() { TA0R =0; // начальное значение таймера TA0CCR0 = 500; // установка периода TA0CTL |= TASSEL_1 + ID_0 + MC_1; // ACLK, /8, счёт таймера в верх TA0CCR1 = 400; // Собственно регистр отвечающий за шим TA0CCTL1 |= OUTMOD_6; // режим установка/сброс порта P1.6
P1DIR |= BIT6; // P1.6 на выход P1SEL |= BIT6; // P1.6 альтернативная функция вывода P1OUT = 0; // Очистка порта P1 }
Прерывание не нужно. TA0CCR1 - в этот регистр загружаешь число для изменения длительности импульса (шим)
Обращаю особое внимание на принцип работы таймера. Его период определятся регистром сравнения TA0CCR0, а не загрузкой нового значения в обработчике прерывания как реализуется в пик и авр контроллерах.
В MSP430 таймер может инкриминироваться от начального значения как и в авр и пик, а вот сбрасываться в нуль может не только по переполнению, а сравнению с регистром TA0CCR0. Что исключает непредсказуемые задержки при новом счёте. Это важно для временных диаграмм требующих особой точности.
|
|
| Пт, 28.12.2012, 07:30 | Сообщение # 10
|
skateman
Постов: 2201
Друзья |
Цитата (frenele) Его период определятся регистром сравнения TA0CCR0, а не загрузкой нового значения в обработчике прерывания как реализуется в пик и авр контроллерах. Цитата (frenele) В MSP430 таймер может инкриминироваться от начального значения как и в авр и пик, а вот сбрасываться в нуль может не только по переполнению, а сравнению с регистром TA0CCR0 в авр это тож есть
|
|