Page 1
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 1/13
Page 2 of 2 < Prev 1
Các lệnh trong lập trình MSP430Discussion in 'Lớp C7' started by nhok 9x, Sep 9, 2012.
Theo mình để dịch trái bit thì mình có thể nhân 2.
P1OUT+=P1OUT;
Dịch phải thì có thể chia 2
P1OUT/=2;
Cách này tuy đúng nhưng không nên dùng. Vì tập lệnh
MCU (Lệnh Assembly) thường có sẵn các lệnh dịch bit,
còn cách lệnh toán thì cùng lắm chỉ hỗ trợ đến cộng/trừ .
Do vậy, chuyển lệnh dịch bit sang các lệnh nhân/chia làm
Home VideoForum Cover Forums
Forums
Forums
Search ForumsSearch Forums What's New?What's New?
Members Help
Forum Cover Forums Thành viên Payitforward Club Học viên CLB C2 - C7
Lớp C7
2
ctcngh
Thành Viên PIF
Học tập.... mò mẫm
ctcngh, Sep 11, 2012 #21
Manhdd
Ban Chủ Nhiệm
...
ctcngh said: ↑
Theo mình để dịch trái bit thì mình có thể nhân 2.
P1OUT+=P1OUT;
Dịch phải thì có thể chia 2
P1OUT/=2;
Log in or Sign up
Page 2
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 2/13
phuong le, honghiep and kisseshacker like this.
lãng phí tài nguyên (Bộ nhớ+Thời gian xử lý) của hệ thống
Manhdd, Sep 11, 2012 #22
phuong le
Thành Viên PIF
IceSandwich said: ↑
Sau khi xem mấy cái post mình có đóng góp thế
này:
Vì con msp430g nó không có thanh ghi bit cho 1
PORT như trên PIC, hình như muốn xuất giá trị thì
chỉ tác động lên P1OUT nên không thể dùng
phép gắn cho cả PORT được.
Code gợi ý của mình như sau
Code:
nhok 9x said: ↑
Tình hình là hôm nay mới nhận
kit về và rất thích thú với việc
vọc em nó. Tuy nhiên, vì mới
làm quen với lập trình C cho
MSP430 nên mình còn khá bỡ
ngỡ. Vì vậy mình xin lập topic
này để các bạn newmem như
mình có thể trao đổi, thảo luận
và học hỏi thêm.
Đầu tiên là mình hỏi về lệch
dịch bit. Mình định làm dàn Led
trong mạch chạy qua chạy lại,
nhưng không biết cấu trúc của
lệnh dịch là gì. Mình định xuất
ra P1.
Cái thứ 2 là mình định cho P1.i
với i chạy từ 0->7, như vậy có
lệnh nào thực hiện điều đó
không?
Ví dụ nếu viết theo pascal là
for i:=0 to 7 do
P1.i := 1;
Page 3
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 3/13
Rebirth likes this.
ủa sao em copy i chang mà cái mạch e nó đơ như cây cơ
???
Bạn đã tắt WatchDog Timer chưa vậy? Nếu không tắt thì
sẽ không chạy được đâu.
Code:
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0xFF; // Set mode out mode cho P1P1SEL = 0; // Set mode GPIOP1SEL2 = 0;P1OUT &= ~0xFF; // Reset all pins while (1){ unsigned char i, temp = 0x01; for (i=0; i<8; i++) { P1OUT &= ~0xFF; // Reset all pins P1OUT |= temp; // Set pins temp = temp << 1; _delay_cycles(100000); // Delay 100 ms }}
Với đoạn code trên thì nó sẽ thực hiện cháy từng
led trên PORT LED, cứ sau 1 ms thì cháy 1 con
theo thứ tự dịch sang trái (chú ý là do LED trên
MAIN kích bằng mức 0 nên với code này nó sẽ
sáng hết 7 led và chỉ tắt 1 led thôi)
phuong le, Sep 12, 2012 #23
IceSandwich
Thành Viên PIF
Robocon 2013 - Một lần và mãi mãi :)
IceSandwich, Sep 12, 2012 #24
phuong le IceSandwich said: ↑
Bạn đã tắt WatchDog Timer chưa vậy? Nếu không
Page 4
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 4/13
ò hjhj chạy đc òi ủa mà cái lệnh trên có ý nghĩa
như thế nào a?
Code:
void main(void){ P1DIR |= BIT0; P1DIR |= BIT6; WDTCTL = WDTPW + WDTHOLD; for (;;) { volatile unsigned int i; P1OUT ̂= BIT0|BIT6; i = 50000; do (i--); while (i != 0); }}
nếu e để nó trong code trên thì hai đền nhấp nháy có độ
dừng, còn nếu ko có thì nhấp nháy liên tục???
dòng
Code:
WDTCTL = WDTPW + WDTHOLD;
dùng để tắt WatchDog Timer nếu để nó còn hoạt động
thì cứ sau một thời gian khi mà WatchDog Timer ràn
Thành Viên PIF
tắt thì sẽ không chạy được đâu.
Code:
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
phuong le, Sep 12, 2012 #25
phương tuấn
TOT
Page 5
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 5/13
vuong_pn and phuong le like this.
thì nó sẽ tự động reset lại vdk nên code của em viết
không có dòng đó thì sẽ bị reset liên tục. nên sẽ xin
ra hiện tượng nháy liên tục.
phương tuấn, Sep 12, 2012 #26
mafiaWolf
Thành Viên PIF
Sao không đổi avatar được ta :(.... Để cái hình avatar này "ruồi bu" wa' à :(
phuong le said: ↑
ò hjhj chạy đc òi ủa mà cái lệnh trên có ý
nghĩa như thế nào a?
Code:
void main(void){ P1DIR |= BIT0; P1DIR |= BIT6; WDTCTL = WDTPW + WDTHOLD; for (;;) { volatile unsigned int i; P1OUT ̂= BIT0|BIT6; i = 50000; do (i--); while (i != 0); }}
IceSandwich said: ↑
Bạn đã tắt WatchDog Timer
chưa vậy? Nếu không tắt thì
sẽ không chạy được đâu.
Co
de
:
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
Page 6
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 6/13
Nhìn code là thấy dân pro rồi .. CLB ta sắp có nhân
tài mới
nếu e để nó trong code trên thì hai đền nhấp
nháy có độ dừng, còn nếu ko có thì nhấp nháy
liên tục???
mafiaWolf, Sep 12, 2012 #27
phuong le
Thành Viên PIF
mafiaWolf said: ↑
phuong le said: ↑
ò hjhj chạy đc òi ủa
mà cái lệnh trên có ý nghĩa
như thế nào a?
Co
de
:
IceSandwich
said: ↑
Bạn đã tắt
WatchDog
Timer chưa
vậy? Nếu
không tắt
thì sẽ
không chạy
được đâu.
C
o
d
e
:
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;
Page 7
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 7/13
úi giời ạ copy cái này liếc cái kia mới ra cái code trên
á
Nhìn code là thấy dân pro rồi .. CLB ta sắp
có nhân tài mới
void main(void){ P1DIR |= BIT0; P1DIR |= BIT6; WDTCTL = WDTPW + WDTHOLD; for (;;) { volatile unsigned int i; P1OUT ̂= BIT0|BIT6; i = 50000; do (i--); while (i != 0); }}
nếu e để nó trong code trên
thì hai đền nhấp nháy có độ
dừng, còn nếu ko có thì nhấp
nháy liên tục???
phuong le, Sep 12, 2012 #28
phuong le
Thành Viên PIF
phương tuấn said: ↑
dòng
Code:
WDTCTL = WDTPW + WDTHOLD;
dùng để tắt WatchDog Timer nếu để nó
còn hoạt động thì cứ sau một thời gian
khi mà WatchDog Timer ràn thì nó sẽ
Page 8
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 8/13
à dậy chu kì nháy của nó mặc định là nhiêu a?
Code:
#include <msp430g2553.h> void main(void){ WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0; P1DIR |= BIT6; for (;;) { { volatile unsigned int i; P1OUT ̂= BIT0|BIT6; i = 50000; do (i--); while (i != 0); } _delay_cycles(10000000); }}
e thêm cai delay này vô thì 10s nháy lần, còn nếu không
có lệnh delay thì mặc định là 1s hả a
phuong le: mình nói thế này cho bạn dễ hiểu .Tất cả các
lệnh muốn thực hiện thì cần phải có 1 thời gian tương
ứng.Trong máy thì gọi nó là chu kì máy-Machine
cycle(MC)
Trong con msp 430g2553 1 chu kì máy là 1us (10^-6 s)
.Mỗi lệnh mình giả sử là mất 1us để thực hiện(thực tế thì
không phải lệnh nào cũng 1us).Như vậy 3 dòng lệnh :
{
i=50000;
tự động reset lại vdk nên code của em
viết không có dòng đó thì sẽ bị reset
liên tục. nên sẽ xin ra hiện tượng nháy
liên tục.
phuong le, Sep 12, 2012 #29
cxduc92
Thành Viên PIF
Page 9
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 9/13
phuong le and 2death like this.
do(i--);
while(i!=0);
}
thật ra chỉ là delay 50000MC= 50000 x 1u= 50 ms = 0.05
s (coi như bỏ qua 2 us của 2 dòng đầu)
Còn lệnh _delay_cycles(10 000 000) là 1 lệnh delay đc
định nghĩa sẵn của g2553 .Ý nghĩa của _delay_cycles(n) là
delay n MC.Lệnh của bạn có nghĩa là delay 10 000 000
MC= 10s.Vậy là cứ mỗi 10s nó đảo trạng thái
p/s: theo ý mình thì bạn chỉ cần sửa 1 chỗ là điều khiển đc
tất cả các chu kì nhấp nháy này thôi
vd: bạn muốn nó cứ 1s nháy 1 lần=> n= 1/ (10^-6)=1
000 000.Như vậy
...
while(1)//for(;;)
{
P1OUT^=BIT1|BIT6;
_delay_cycles(1 000 000);
}
Thế là xong
à, cho mình hỏi chút: cái lệnh nhảy đến nhãn cho trước
trong đây là gì vậy? Vd trong 8051 là sjmp....
phải dùng lệnh máy thôi...go to.. mà hình như không ai xài
cxduc92, Sep 13, 2012 #30
nhok 9x
Trứng gà
nhok 9x, Sep 16, 2012 #31
mafiaWolf nhok 9x said: ↑
à, cho mình hỏi chút: cái lệnh nhảy đến nhãn cho
trước trong đây là gì vậy? Vd trong 8051 là
sjmp....
Page 10
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 10/13
cxduc92, phuong le, honghiep and 1 other person like this.
nhiều
"Never use goto statement" : các lập trình viên ở ngôn
ngữ cấp cao thường nhắc nhau như vậy
Ở khía cạnh ngôn ngữ máy, ASM, CPU cần các tập lệnh
JMP để thực hiện rẽ nhánh và lặp. Tuy nhiên, với các
ngôn ngữ có tính "người" hơn (C, C++, Java, ...) thì việc
sử dụng GOTO làm mất tính cấu trúc của chương trình,
khiến chương trình rất khó đọc và sửa chữa. Nhiều ngôn
ngữ thậm chí không có lệnh GOTO. Các lệnh điều khiển rẽ
nhánh và lặp trong c: if, switch-case, for, while, ... đều có
thể thay thế GOTO và giúp chương trình có cấu trúc hơn
cho hỏi làm thế nào để config 2 timer, Timer A0 xùng
xuất PWM qua chân p1.6.
Timer A1 đếm lên trong vòng 25ms.
anh em chỉ giáo.
void ConfigTimer(void)
{
CCTL0=CCIE; //CCR0 interrupt enabled
TA0CTL = TASSEL_2 + MC_1; // SMCLK, up mode
}
void ConfigPWM(void)
{
CCR0=1000; // PWM Period=50HZ
CCTL1 = OUTMOD_7; // CCR1 reset/set
CCR1=0; // PWM duty cycle
}
Thành Viên PIF
Sao không đổi avatar được ta :(.... Để cái hình avatar này "ruồi bu" wa' à :(
mafiaWolf, Sep 16, 2012 #32
Manhdd
Ban Chủ Nhiệm
...
nhok 9x said: ↑
à, cho mình hỏi chút: cái lệnh nhảy đến nhãn cho
trước trong đây là gì vậy? Vd trong 8051 là
sjmp....
Manhdd, Sep 17, 2012 #33
doancongthang
Thành Viên PIF
Page 11
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 11/13
////////////////////////////////////////////////////////////////
///////
void Configdemxung (void)
{
TA1CCTL0 = CCIE; // CCR0 interrupt enabled
TA1CCR0 = 25000;
TA1CTL = TASSEL_2 + MC_1; // SMCLK, upmode
}
và ngắt như thế này thì trong có hợp lí không
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void)
{Speed = pulse - pre_pulse; //so xung trong 25ms
pre_pulse = pulse;
Speed = (Speed*40*60)/400;
}
Timer A1 ngắt trong vòng 25ms
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void)
{
//CCR1=CCR1+1; // Increace Duty Cycle
//if(CCR1==1001) CCR1=0; // If Duty Cycle =100%, reset it
CCR1 = Output;
}
Timer a0 xuất pwm theo chu kì là CCR1
doancongthang, Jun 3, 2013 #34
honghiep
Ban Chủ Nhiệm
doancongthang said: ↑
cho hỏi làm thế nào để config 2 timer, Timer A0
xùng xuất PWM qua chân p1.6.
Timer A1 đếm lên trong vòng 25ms.
anh em chỉ giáo.
void ConfigTimer(void)
{
CCTL0=CCIE; //CCR0 interrupt enabled
TA0CTL = TASSEL_2 + MC_1; // SMCLK, up
mode
}
void ConfigPWM(void)
Page 12
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 12/13
Page 2 of 2 < Prev 1
TweetTweet 0 0
Contact Us Forum Cover Top
Nhìn có vẻ là hợp lí. Nhưng nếu muốn xuất PWM cần
config cho chân P1.6 nữa
Share This Page
{
CCR0=1000; // PWM Period=50HZ
CCTL1 = OUTMOD_7; // CCR1 reset/set
CCR1=0; // PWM duty cycle
}
///////////////////////////////////////////////////////
////////////////
void Configdemxung (void)
{
TA1CCTL0 = CCIE; // CCR0 interrupt enabled
TA1CCR0 = 25000;
TA1CTL = TASSEL_2 + MC_1; // SMCLK, upmode
}
và ngắt như thế này thì trong có hợp lí không
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void)
{Speed = pulse - pre_pulse; //so xung trong 25ms
pre_pulse = pulse;
Speed = (Speed*40*60)/400;
}
Timer A1 ngắt trong vòng 25ms
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void)
{
//CCR1=CCR1+1; // Increace Duty Cycle
//if(CCR1==1001) CCR1=0; // If Duty Cycle =100%,
reset it
CCR1 = Output;
}
Timer a0 xuất pwm theo chu kì là CCR1
honghiep, Jun 4, 2013 #35
2
Forum Cover Forums Thành viên Payitforward Club Học viên CLB C2 - C7
Lớp C7
Page 13
25/02/2014 Các lệnh trong lập trình MSP430 | Page 2 | Payitforward Community
www.payitforward.edu.vn/forum/threads/811/page-2 13/13
Forum software by XenForo™ ©2010-2012 XenForo Ltd. Terms and Rules Privacy Policy
Câu lạc bộ nghiên cứu khoa học - Khoa Điện_Điện Tử - Trường đại học Bách Khoa Tp. HCM