Програмування мікроконтролерів msp430
DESCRIPTION
Лекція 1 2 Судаков О.О, Радченко С.П. « Сучасна мікропроцесорна техніка ». Програмування мікроконтролерів MSP430. Особливост і програмування MSP430. Середовища створення програм IAR Embedded Workbench Energia ( аналог Aduino) Бібл іотеки С,Ассемблер Програматор MSP-EXP430G2 Launchpad - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/1.jpg)
Програмування мікроконтролерів MSP430
Лекція 12
Судаков О.О, Радченко С.П. «Сучасна мікропроцесорна техніка»
![Page 2: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/2.jpg)
Особливості програмування MSP430 Середовища створення програм
IAR Embedded Workbench Energia (аналог Aduino) Бібліотеки С,Ассемблер
Програматор MSP-EXP430G2 Launchpad
Симуляція Симуляція в схемі Симуляція в Proteus
Програмування Процесор GPIO Таймер Компаратор АЦП
![Page 3: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/3.jpg)
IAR Workbench Створити WORKSPACE
Вміст для проектів MENU->New->Workspace
Створити проект Project->Create New Project Одна програма Вибираємо мову програмування Вибираємо мікроконтролер
Project->Options->General->Device
Редагуємо файли Симулюємо
![Page 4: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/4.jpg)
Плата MSP430 launchpad MSP430G2553 MSP430G2553 MSP430F16x 2 світлодіоди 2 кнопки Роз’єми Емуляція в схемі USB
![Page 5: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/5.jpg)
Програмування GPIO Як правило 2 порта
P1,P2 За замовченням виводи GPIO Потрібні регістри
P1DIR,P2DIR – ввід чи вивід P1OUT, P2OUT – вивід P1IN, P2IN – ввід P1REN, P2REN-підтягуючий резистор
P1OUT, P2OUT – куди підтягувати P1IE, P2IE – дозвіл переривань P1IES, P2IES – по фронту чи спаду P1IFG, P2IFG – прапоці переривань
Процесор повинен «спати» для енергоефективності
![Page 6: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/6.jpg)
Кнопка і світлодіод – переривання#include "io430.h" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR &= ~BIT3; // bit3 - 0 all-1 input mode P1REN |= BIT3; // enable pull up resistor P1OUT |= BIT3; //turn pullup on P1IES |= BIT3; //fall P1IFG &= ~BIT3; //clear interrupt flag P1IE |= BIT3; //enable interrupt at bit 3 //led P1DIR |= BIT0; // bit0 - 1 all 0 ouutput mode P1OUT &= ~BIT0; // set output to 0 __bis_SR_register(LPM4_bits+GIE); // stop CPU and enable interrupts return 0; } #pragma vector=PORT1_VECTOR __interrupt void port1_interrupt(void) { P1IFG &= ~BIT3; //clear interrupt flag P1OUT^=BIT0; //toggle led }
![Page 7: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/7.jpg)
Тактові генератори (BSC+)
Ввімкнення і вимкнення DCOCTL, BCSCTL1, BCSCTL2, BCSCTL3
Зміна частоти Подільник частоти DCOCTL, BCSCTL1, BCSCTL2, BCSCTL3
Затримки циклом Виконувати пустий цикл Не ефективно
Генерація вихідних сигналів регістри P1SEL,P2SEL Приєднання генератора до виходу
![Page 8: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/8.jpg)
Приклад роботи з генераторами #include "msp430g2553.h"
int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR=0xff; DCOCTL=CALDCO_1MHZ; // MCLK = DCO 1MHz BCSCTL1=CALBC1_1MHZ+DIVA_3; //ACLK=XLF1/8 BCSCTL1+=DIVS_3; // SMCLK=DCO/8 P1SEL |= 0x11; // P1.0,4 ACLK, SMCLK output while(1){ volatile unsigned int i =50000; //5*10^4 P1OUT ^= BIT6; while(i--); } }
![Page 9: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/9.jpg)
Таймер Затримки
Запустити таймер Почекати поки дорахує Обробити переривання
Генерація сигналів Різної частоти ШІМ Записати необхідні значення в регістри
Вимірювання часу і частоти Захоплення від компаратора Час між двома захопленими значеннями
Послідовні протоколи UART SPI I2C
![Page 10: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/10.jpg)
Затримки таймером#include "msp430g2553.h" void delay_msec(int msec){ TACCR0 = 32; //count to 32 TACTL = TASSEL_1+MC_1+TAIE; //from quartz up to TACCR0 interrupt for (int i=0; i<msec; i++) _BIS_SR(LPM3_bits + GIE); //sleep } int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR=0xff; while(1){ P1OUT ^= BIT6; delay_msec (1000); } return 0; } #pragma vector=TIMER0_A1_VECTOR __interrupt void timer_wait(void){ switch( TAIV ) { case 2: break; // CCR1 not used case 4: break; // CCR2 not used case 10: _BIC_SR_IRQ(LPM3_bits); //wake up // overflow break; } }
![Page 11: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/11.jpg)
Генерація часових інтервалів і частот Застосувати неперервний режим і порівняння
Низька частота – період таймера Вищі частоти регістр CCR0, ССR1,CCR2 Під час обробки переривань збільшують регістри
![Page 12: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/12.jpg)
Приклад – чотири частоти 1 таймер
#include "msp430g2553.h" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR=0xff; CCTL0=CCIE; CCTL1=CCIE; CCTL2=CCIE; TACTL = TASSEL_1+MC_2+TAIE; //from quartz _BIS_SR(LPM3_bits+GIE); return 0; } #pragma vector=TIMER0_A0_VECTOR __interrupt void timer_wait0(void){ TACCR0 += 32768; P1OUT^=BIT0; } #pragma vector=TIMER0_A1_VECTOR __interrupt void timer_wait1(void){ switch( TAIV ){
case 2: TACCR1 += 16384; break; // CCR1 not used case 4: TACCR2 += 8192; break; // CCR2 not used case 10: P1OUT ^=BIT6;// overflow
break; }
}
![Page 13: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/13.jpg)
Генерація вихідних сигналів Дорахували до значення в регістрі
Змінився вихідний сигнал Декілька режимів
Вихідний сигнал Приєднано до виводів регістр PxSEL1
Режими вихідних сигналів
ССR1/CCR0Reset/Set Set/ResetToggleSet
![Page 14: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/14.jpg)
Генерація вихідного сигналу#include "msp430g2553.h" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR=0xff; P1SEL|=BIT6; CCTL1=OUTMOD_4; //toggle TA0.1 CCR1=32768; // toggle 2 times per period TACTL = TASSEL_1+MC_2; //from quartz cont mode _BIS_SR(LPM3_bits+GIE); return 0; }
Для коректної генерації частоти Необхідно добавити обробку перериванняCCR1+=32768
![Page 15: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/15.jpg)
Генерація ШІМ Період
Тактовим генератором ССR0
Скважність CCR0,CCR1,CCR2
![Page 16: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/16.jpg)
Приклад генерації ШІМ#include "msp430g2553.h" void pwm_pin6(unsigned int period, unsigned int duty){ CCR0=period; CCR1=duty; } int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR=0xff; P1SEL|=BIT6; CCTL1=OUTMOD_7; //reset/set pwm_pin6(1000,900); TACTL = TASSEL_2+MC_1; //from SMCLK up mode P1DIR &=~BIT3; P1REN |= BIT3; // enable pull up resistor P1OUT |= BIT3; //turn pullup on P1IES |= BIT3; //fall P1IFG &= ~BIT3; //clear interrupt flag P1IE |= BIT3; //enable interrupt at bit _BIS_SR(LPM0_bits+GIE); return 0; } volatile int up = 1; #pragma vector=PORT1_VECTOR __interrupt void port1_interrupt(void) { if(CCR1 == CCR0 && up > 0 ) up=-1; if(CCR1 == 0 && up < 0 ) up=1; pwm_pin6(1000,CCR1+up*20); P1IFG &= ~BIT3; }
![Page 17: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/17.jpg)
Передавач UART
Перадача побайтна Додаэться стартовий і
стоповий біт Запускається таймер Переривання
генерується кожен бітовий інтервал
Перемкнути виві вверх, або вниз в залежності від біта
В обробнику переривання зсув байта на 1 біт вліво
![Page 18: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/18.jpg)
Передача байтаunsigned int RXTXData; //buffer unsigned char BitCnt; void itoa(unsigned char * buf, unsigned int i, unsigned int *size){ (*size)=0; do {buf[(*size)++]=(unsigned char)(i%10)+'0';}while(i/=10); } void TX (unsigned char* buf, int size){ for (int i=size-1; i>=0; i--){ RXTXData = buf[i]; BitCnt = 0x0A; //10 bit start+byte+stop while (CCR0 != TAR) CCR0=TAR; // make CCR0=timer counter CCR0 += Bitime; //set compare register to bit time for wait RXTXData|= 0x100; // set stop bit RXTXData = RXTXData<<1; // set start bit CCTL0 = OUTMOD0+CCIE; //set 1 at out while(CCTL0 & CCIE) _BIS_SR(LPM3_bits+GIE); } }
![Page 19: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/19.jpg)
Обробник переривання
#pragma vector=TIMER0_A0_VECTOR __interrupt void timer_wait0(void){ CCR0 += Bitime; // Add Offset to CCR0 if ( BitCnt == 0) CCTL0 &= ~ CCIE; // All bits TXed else{ CCTL0 |= OUTMOD2; // TX Space if (RXTXData & 0x01) CCTL0 &= ~ OUTMOD2; // TX Mark RXTXData = RXTXData >> 1; BitCnt --; } LPM3_EXIT; }
![Page 20: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/20.jpg)
Використання #include "msp430g2553.h" #include "TX.h" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; TACTL = TASSEL_1+MC_2; //CONtinuous mode from quartz P1SEL |= TXD; // set timer output to P1.1 P1DIR |= TXD; //set P1.1 to output CCTL0 = OUT+OUTMOD0+CCIE; //set OUT bit to 1 for output 1 while(1){ unsigned int sz; unsigned char buf[10]; itoa(buf,100,&sz); TX(buf,sz); TX("\n\r",2); } return 0; }
![Page 21: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/21.jpg)
Вимірювання частоти Рахуємо кількість імпульсів одної частоти
за декілька періодів іншої частоти RC генератор – ВЧ не стабільний Кварцевий генератор –НЧ стабільний Запам’ятовуємо значення Масштабуємо частоту
Захоплюємо 2 рази по фронту кварцового генератора 1 Таймер на UART Він же для захоплення Обережно race condition!
![Page 22: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/22.jpg)
Приклад програми вимырювання
unsigned int data[2]; volatile int num=0; volatile int mode=0; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; while(1){ num=0; mode=1; // timer for measure CCTL0 = CAP+CCIE+CCIS_1+CM_1+SCS; //capture on quartz TACTL = TACLR+TASSEL_2+MC_2+ID_3; //CONtinuous mode SMCLK /8 _BIS_SR(LPM0_bits+GIE); mode=0; // timer for UART long int freq=(data[1]-data[0])*8*32768/1000; unsigned int sz=1; unsigned char buf[10]; itoa(buf,freq,&sz) TX(buf,sz); TX("\n\rzHk",5); } }
![Page 23: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/23.jpg)
Приклад обробника переривань#pragma vector=TIMER0_A0_VECTOR __interrupt void timer_wait1(void){ if(mode>0 ){ data[num++]=CCR0; if(num==2) { CCTL0 &= ~CCIE; LPM0_EXIT; } }else{ timer_wait0(); LPM3_EXIT; } }
![Page 24: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/24.jpg)
АЦП
Ввімкнути Встановити опорну напругу Встановити час sample and hold Створити обробник переривань Запустити перетворення Почекати, поки перетворення закінчиться
![Page 25: Програмування мікроконтролерів MSP430](https://reader033.vdocuments.mx/reader033/viewer/2022061614/56813d45550346895da7045c/html5/thumbnails/25.jpg)
Приклад АЦПint main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled ADC10CTL1 = INCH_4; // input A1 ADC10AE0 |= BIT4; // PA.4 ADC option select while (1){ ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start _BIS_SR(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit unsigned int sz=1; unsigned char buf[10]; unsigned long v=ADC10MEM; v=v*3300/1023; itoa(buf,v,&sz); TX(buf,sz); TX("\n\rVm",4); } return 0; } #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) }