25
Програмування мікроконтролерів MSP430 Лекція 12 Судаков О.О, Радченко С.П. «Сучасна мікропроцесорна техніка»

Програмування мікроконтролерів MSP430

  • Upload
    fai

  • View
    118

  • Download
    6

Embed Size (px)

DESCRIPTION

Лекція 1 2 Судаков О.О, Радченко С.П. « Сучасна мікропроцесорна техніка ». Програмування мікроконтролерів MSP430. Особливост і програмування MSP430. Середовища створення програм IAR Embedded Workbench Energia ( аналог Aduino) Бібл іотеки С,Ассемблер Програматор MSP-EXP430G2 Launchpad - PowerPoint PPT Presentation

Citation preview

Page 1: Програмування мікроконтролерів MSP430

Програмування мікроконтролерів MSP430

Лекція 12

Судаков О.О, Радченко С.П. «Сучасна мікропроцесорна техніка»

Page 2: Програмування мікроконтролерів MSP430

Особливості програмування MSP430 Середовища створення програм

IAR Embedded Workbench Energia (аналог Aduino) Бібліотеки С,Ассемблер

Програматор MSP-EXP430G2 Launchpad

Симуляція Симуляція в схемі Симуляція в Proteus

Програмування Процесор GPIO Таймер Компаратор АЦП

Page 3: Програмування мікроконтролерів MSP430

IAR Workbench Створити WORKSPACE

Вміст для проектів MENU->New->Workspace

Створити проект Project->Create New Project Одна програма Вибираємо мову програмування Вибираємо мікроконтролер

Project->Options->General->Device

Редагуємо файли Симулюємо

Page 4: Програмування мікроконтролерів MSP430

Плата MSP430 launchpad MSP430G2553 MSP430G2553 MSP430F16x 2 світлодіоди 2 кнопки Роз’єми Емуляція в схемі USB

Page 5: Програмування мікроконтролерів MSP430

Програмування GPIO Як правило 2 порта

P1,P2 За замовченням виводи GPIO Потрібні регістри

P1DIR,P2DIR – ввід чи вивід P1OUT, P2OUT – вивід P1IN, P2IN – ввід P1REN, P2REN-підтягуючий резистор

P1OUT, P2OUT – куди підтягувати P1IE, P2IE – дозвіл переривань P1IES, P2IES – по фронту чи спаду P1IFG, P2IFG – прапоці переривань

Процесор повинен «спати» для енергоефективності

Page 6: Програмування мікроконтролерів MSP430

Кнопка і світлодіод – переривання#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

Тактові генератори (BSC+)

Ввімкнення і вимкнення DCOCTL, BCSCTL1, BCSCTL2, BCSCTL3

Зміна частоти Подільник частоти DCOCTL, BCSCTL1, BCSCTL2, BCSCTL3

Затримки циклом Виконувати пустий цикл Не ефективно

Генерація вихідних сигналів регістри P1SEL,P2SEL Приєднання генератора до виходу

Page 8: Програмування мікроконтролерів MSP430

Приклад роботи з генераторами #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

Таймер Затримки

Запустити таймер Почекати поки дорахує Обробити переривання

Генерація сигналів Різної частоти ШІМ Записати необхідні значення в регістри

Вимірювання часу і частоти Захоплення від компаратора Час між двома захопленими значеннями

Послідовні протоколи UART SPI I2C

Page 10: Програмування мікроконтролерів MSP430

Затримки таймером#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

Генерація часових інтервалів і частот Застосувати неперервний режим і порівняння

Низька частота – період таймера Вищі частоти регістр CCR0, ССR1,CCR2 Під час обробки переривань збільшують регістри

Page 12: Програмування мікроконтролерів MSP430

Приклад – чотири частоти 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

Генерація вихідних сигналів Дорахували до значення в регістрі

Змінився вихідний сигнал Декілька режимів

Вихідний сигнал Приєднано до виводів регістр PxSEL1

Режими вихідних сигналів

ССR1/CCR0Reset/Set Set/ResetToggleSet

Page 14: Програмування мікроконтролерів MSP430

Генерація вихідного сигналу#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

Генерація ШІМ Період

Тактовим генератором ССR0

Скважність CCR0,CCR1,CCR2

Page 16: Програмування мікроконтролерів MSP430

Приклад генерації ШІМ#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

Передавач UART

Перадача побайтна Додаэться стартовий і

стоповий біт Запускається таймер Переривання

генерується кожен бітовий інтервал

Перемкнути виві вверх, або вниз в залежності від біта

В обробнику переривання зсув байта на 1 біт вліво

Page 18: Програмування мікроконтролерів MSP430

Передача байта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

Обробник переривання

#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

Використання #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

Вимірювання частоти Рахуємо кількість імпульсів одної частоти

за декілька періодів іншої частоти RC генератор – ВЧ не стабільний Кварцевий генератор –НЧ стабільний Запам’ятовуємо значення Масштабуємо частоту

Захоплюємо 2 рази по фронту кварцового генератора 1 Таймер на UART Він же для захоплення Обережно race condition!

Page 22: Програмування мікроконтролерів MSP430

Приклад програми вимырювання

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

Приклад обробника переривань#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

АЦП

Ввімкнути Встановити опорну напругу Встановити час sample and hold Створити обробник переривань Запустити перетворення Почекати, поки перетворення закінчиться

Page 25: Програмування мікроконтролерів MSP430

Приклад АЦП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) }