Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 14

Thí Nghiệm Vi Xử lý

Bài 1: GPIO
Bài 1.1
Yêu cầu: Sinh viên viết chương trình cho LED1 và LED2 sáng tắt luân phiên. Thời gian
giữa 2 lần sáng tắt là khoảng 1s.

Câu hỏi 1: Các LED được kết nối với MCU như hình trên. Điền vào chỗ trống để trả lời
các câu hỏi dưới đây.
+ LED1 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: Led 1 được nối với P2.2
+ LED2 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: Led 2 được nối với P2.1
+ Để LED sáng, phải xuất giá trị gì ra chân port?
Trả lời: Xuất mức cao ra chân Port tương ứng
Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống:
#include <msp430g2553.h>
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW | WDTHOLD ; // Stop WDT
P1DIR |= BIT0 + BIT6; //Configure P2.1 and P2.2 as Output
P1OUT &= BIT6; // Turn off LED1, LED2
P1OUT |= BIT0 ; // Turn on LED 1, turn off LED 2
while(1)
{ //Infinite loop
i= 30000; //Delay
do (i--);

while (i !=0);

//Toggle Port P2.1 and P2.2 using an exclusive-OR

P1OUT ^=BIT0 + BIT6;

}}

Bài 1.2
Yêu cầu: Sinh viên viết chương trình để đảo trạng thái LED1 mỗi khi SW1 được nhấn.

Câu hỏi 1: Các SW(switch) được kết nối với MCU như hình trên. Điền vào chỗ trống để
trả lời các câu hỏi dưới đây.
+ SW1 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: SW1 nối vào P1.0
+ SW2 nối vào chân nào của MCU? (Cổng (Port) nào?)
Trả lời: SW2 nối vào P1.1
+ Để đọc trạng thái switch, các chân port phải là input hay output?
Trả lời: các chân port phải là output
Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống:
#include <msp430g2553.h>

void main(void)

volatile unsigned int i;

WDTCTL = WDTPW | WDTHOLD ; // Stop WDT

P1DIR |= BIT0 ; //Configure P2.1 and P2.2 as Output

P1DIR &= ~BIT3; // Turn off LED1, LED2

P1REN|=BIT3;

P1OUT|=BIT3;

while(1)

{ while ((P1IN & BIT3));

P1OUT ^=BIT0;

for(i=3000;i!=0;i--); //Delay, button debounce

while (!(P1IN & BIT3)); //Wait for the release of the button

for(i=3000;i!=0;i--);

}}
Bài 2. GPIO & INTERRUPT
Bài 2.1
Yêu cầu: Sinh viên viết chương trình đảo trạng thái LED1 khi Switch 1 được nhấn.
Trong chương trình sử dụng ngắt trên chân port giao tiếp Switch.

Câu hỏi 1: Các SW(switch) được kết nối với MCU như hình trên. Điền vào chỗ trống để
trả lời các câu hỏi dưới đây.
+ SW1 nối vào chân Port gì của CPU?
Trả lời: Nối vào chân Port TA0
+ Khi Switch được nhấn, sẽ có chuyển trạng thái như thế nào trên chân PORT?
Trả lời : High to low
+ Để cho phép ngắt trên chân P1.0, ta phải ghi BIT0 vào bit=1 của thanh ghi PxIE
+ Để chọn cạnh xuống cho ngắt trên chân P1.0, ta phải ghi BIT0 vào bit=1 của thanh
ghi PxIES
Câu hỏi 2: Hoàn chỉnh chương trình bằng cách điền vào các chỗ trống:

#include <msp430g2553.h>

#pragma vector= PORT1_VECTOR

__interrupt void Port_1 (void)

//define an interrupt service routine at 0xFFE8

volatile unsigned int i;


P1OUT ^= BIT0;

for(i=3000;i!=0;i--); //Delay, button debounce

while ((P1IN & BIT3)); //Wait for the release of the button

for(i=3000;i!=0;i--); //Delay, button debounce

P1IFG &= ~BIT3; //Clean P1.0 Interrupt Flag (bit 0 of P1IFG register)

void main (void)

WDTCTL = WDTPW|WDTHOLD; //Stop Watchdog Timer

P1DIR |= BIT0; //Configure P2.2 as Output (LED1)

P1DIR &= ~BIT3; //Configure P1.0 as Input (S1)

P1IE |= BIT3; //Interrupt Enable in P1.0

P1IES |= BIT3; //P1.0 Interrupt flag high-to-low transition

P1REN|=BIT3;

P1OUT|=BIT3;

_BIS_SR (LPM3_bits + GIE); //Low Power Mode with interrupts enabled

Bài 2.2
Yêu cầu: Sinh viên viết chương trình cho phép/không cho phép LED1 nhấp nháy khi
Switch 1 được nhấn.
#include <msp430g2553.h>

void main(void)

WDTCTL = WDTPW | WDTHOLD;

unsigned char blink_status=1;

volatile unsigned int i;

P1DIR |= BIT0;// khai bao OUTput=led p1.0

P1DIR &= ~BIT3;//khai bao input=nut p1.3

P1OUT |= BIT0;//bat den 1.0

P1REN |= BIT3;//khai bao nut bam

while(1)

if(blink_status==1)

P1OUT^= BIT0;//dao trang thai p1.0

i = 15000;//giu trang thai p1.0 khi dem tu 15k-0

do(i--);

while(i!=0);

if(!(P1IN&BIT3))//neu bam nut bam thi d/k dung =0

i = 1500;

do(i--);

while(i!=0);

while(!(P1IN&BIT3));

i = 1500;

do(i--);

while(i!=0);
if(blink_status==1)

P1OUT &= ~BIT0;//tat den led p1.0

blink_status = 0;

}else

blink_status = 1;

Bài 2.3
Yêu cầu: Sinh viên viết chương trình cho phép/không cho phép LED1 nhấp nháy khi
Switch 1 được nhấn. Trong chương trình sử dụng ngắt trên chân port giao tiếp Switch.
Hướng dẫn: Sinh viên vận dụng kiến thức và các hướng dẫn đã có trong bài 2.1 và 2.2
để viết chương trình.
#include <msp430g2553.h>

volatile unsigned int i;

unsigned char NHAY=1;

void main(void)

WDTCTL = WDTPW | WDTHOLD;

P1DIR |= BIT0;

P1DIR &= ~BIT3;

P1REN |= BIT3;

P1OUT |= BIT0;

while(1)

if(!(P1IN & BIT3))

while(!(P1IN & BIT3));

P1IE |= BIT3;
P1IES |= BIT3;

_BIS_SR(LPM3_bits + GIE);

#pragma vector= PORT1_VECTOR

__interrupt void Port(void)

while(1)

if(NHAY==1)

P1OUT^= BIT0;

i = 15000;

do(i--);

while(i!=0);

else {

P1OUT ^=BIT0;

if(!(P1IN & BIT3))

i = 1500;

do(i--);

while(i!=0);

while(!(P1IN & BIT3));

i = 15000;

do(i--);

while(i!=0);

if(NHAY==1)
{

P1OUT &=~ BIT0;

NHAY = 0;

} else

P1OUT ^= BIT0;

NHAY = 1;

break;

P1IFG &= ~BIT3;

Bài 2.4
Yêu cầu: Sinh viên viết chương trình cho phép LED1 và không cho phép LED2 nhấp
nháy khi Switch 1 được nhấn, không cho phép LED1 và cho phép LED2 nhấp nháy khi
Switch 2 được nhấn.
Hướng dẫn: Sinh viên vận dụng kiến thức và các hướng dẫn đã có trong bài 2.1 và 2.2
để viết chương trình.
#include <msp430g2553.h>

volatile unsigned int i;

unsigned char led=1;

void main(void)

WDTCTL = WDTPW | WDTHOLD;

P1DIR |= BIT0;

P1DIR |= BIT6;

P1DIR &= ~BIT3;

P1REN |= BIT3;

// P1OUT &= ~(BIT0+BIT6);


while(1)

if(!(P1IN & BIT3))

while(!(P1IN & BIT3));

led = ~led;

if(led==1)

P1OUT^=BIT0;

P1OUT&=~BIT6;

for(i=30000;i>0;i--);

else

P1OUT^=BIT6;

P1OUT&=~BIT0;

for(i=30000;i >0;i--);

Bài 2.5
Yêu cầu: Sinh viên viết chương trình cho phép LED1 và không cho phép LED2 nhấp
nháy khi Switch 1 được nhấn, không cho phép LED1 và cho phép LED2 nhấp nháy khi
Switch 2 được nhấn. Trong chương trình sử dụng ngắt trên chân port giao tiếp Switch.
Hướng dẫn: Sinh viên vận dụng kiến thức và các hướng dẫn đã có trong bài 2.1 và
2.2 để viết chương trình.
#include <msp430g2553.h>

volatile unsigned int i;

unsigned char led=1;

void main(void)
{

WDTCTL = WDTPW | WDTHOLD;

P1DIR |= BIT0;

P1DIR |= BIT6;

P1DIR &= ~BIT3;

P1REN |= BIT3;

while(1)

if(!(P1IN & BIT3))

while(!(P1IN & BIT3));

P1IE |= BIT3;

P1IES |= BIT3;

_BIS_SR(LPM3_bits + GIE);

#pragma vector= PORT1_VECTOR

__interrupt void Port(void)

while(1)

if(!(P1IN &BIT3))

while(!(P1IN & BIT3));

led = ~led;

if(led==1)

P1OUT^=BIT0;
P1OUT&=~BIT6;

for(i=30000;i>0;i--);

else

P1OUT^=BIT6;

P1OUT &=~ BIT0;

for(i=30000;i>0;i--);

P1IFG &= ~BIT3;

Bài 3: TIMER
Bài 3.1
Yêu cầu: Sinh viên viết chương trình đảo trạng thái LED1 và LED2 sau thời gian 1s, sử
dụng ngắt BASIC TIMER 1 interrupt
Câu hỏi 1: Để vô hiệu hóa Watchdog Timer ta phải ghi vào thanh ghi WDTCTL một giá
trị bằng bao nhiêu?
Trả Lời: WDTCTL = 0xFFFF
Câu hỏi 2: Cấu hình FLL+
Một thạch anh tần số 32768 Hz được nối vào bộ dao động LFXT1. Ta phải ghi vào
thanh ghi FLL_CTL0 giá trị gì để chọn tạ bên trong có giá trị 8pF?
Trả Lời: FLL_CTL0 |= XCAP8PF
Với các thanh ghi ở giá trị mặc định, tần số của các tín hiệu xung nhịp sẽ bằng bao
nhiêu?
Trả Lời:
ACLK = LFXT1CLK;
MCLK = LFXT1CLK, XT2CLK ( nếu sẵn có), hoặc DCOCLK;
SMCLK = LFXT1CLK, XT2CLK ( nếu sẵn có), hoặc DCOCLK;
Câu hỏi 3: Cấu hình GPIO
LED1 và LED2 được nối vào chân P2.2 P2.1. Ta phải ghi vào thanh ghi nào với giá trị
gì để cầu hình cho 2 chân PORT này thành output còn lại là input?
Trả Lời: P2DIR = BIT6;
Ta phải ghi thanh ghi nào với giá trị gì để LED1 sáng LED2 tắt?
Trả Lời: P2OUT = BIT0;
Câu hỏi 4: Cấu hình cho Basic Timer 1:
Ta dùng Basic Timer 1 để tạo ngắt. Basic Timer gồm 2 bộ đếm mắc nối tiếp, trong đó
ngõ vào của BTCNT2 là ngõ ra của BTCNT1/256. Ngõ vào của BTCNT1 là tín hiệu
ACLK có tần số 32768 Hz. Ngõ ra của BTCNT2 phải được chia cho bao nhiêu để có
ngắt Basic Timer 1 có chu kỳ là 1s?
Trả Lời: Phải chia cho 32
Giá trị phải ghi vào các thanh ghi sau là bao nhiêu để có số chia cho BTCNT2 như trên
và cho phép ngắt?
Trả Lời:
BTCTL = BT_fCLK2_DIV32;
IE2= BIT1;
Câu hỏi 5: Chế độ công suất thấp
Chương trình đơn giản đảo trạng thái LED1 và LED2 trong ngắt. Chế độ công suất thấp
nào nên được sử dụng?
Trả Lời: LPM3
Khi đó nguồn xung nhịp nào sẽ tích cực trong suốt quá trình hoạt động?
Trả Lời: Xung nhịp ACLK
Câu hỏi 6:Hoàn tất chương trình:
#include <msp430g2553.h>

#pragma vector = BASICTIMER_VECTOR

__interrupt void basic_timer_ISR(void)

P1OUT ^=BIT6; // LED2 toogle

void main(void)

{
WDTCTL = WDTPW | WDTHOLD ; // Stop WDT

FLL_CTL0 |= XCAP8PF ; // Set load cap for 32k xtal

BTCTL = BT_fCLK2_DIV64; // (ACLK/256)/64

IE1 |= BTIE ; // Enable BT interrupt with 0.5 period

// LED1 & LED2 configuration

P1DIR = BIT6; // P2.2 and P2.1 as digital output

P1OUT = BIT0; // LED1 on and LED2 off

__bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupt

You might also like