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

Post on 07-Jan-2016

118 Views

Category:

Documents

6 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

Лекція 12

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

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

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

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

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

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

IAR Workbench Створити WORKSPACE

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

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

Project->Options->General->Device

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

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

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

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

ССR1/CCR0Reset/Set Set/ResetToggleSet

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

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

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

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

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

Передавач UART

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

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

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

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

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

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

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

#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; }

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

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

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

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

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

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); } }

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

АЦП

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

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

top related