[C7] Bài tập đầu tiên: Nhấp nháy led

Manhdd

Cố Vấn CLB
Staff member
Không biết mấy em C7 đã nạp được chương trình cho chip trên mạch main chưa nhỉ? :D
Nếu nạp được rồi thì mấy em chuyển qua nghịch mấy con led trên board đi nhé :1cool_byebye:

Để làm tốt việc này, ngoài mấy nội dung trong bài giảng, chúng ta cần hiểu rõ thêm:
+ Lệnh trì hoãn: __delay_cycles(xxx); // xxx là số chu kì máy được trì hoãn. Trong khoảng thời gian trì hoãn, MCU không làm gì cả (NOP: no operation). Nếu các nguồn clock của MCU không được config (như code mẫu), MCU sẽ chạy ở 1MHz, tức chu kì máy là 1us. Delay 1000000 chu kì máy chúng ta sẽ được 1 giây.
+ Về việc sử dụng số hex thay cho số nhị phân (0x00 = binary: 00000000; 0xFF = binary: 11111111) , lệnh dịch bit P1OUT << 1, các toán tử tăng giảm: P1OUT++, các lệnh điều kiện, vòng lặp, ... các em chịu khó xem lại C cơ bản nhé, có thể tham khảo ở luồng này
+ Nguyên lý điều khiển led: Tất cả các led của chúng ta được nối anode lên nguồn 3V3, tín hiệu điều khiển ở cathode. Do vậy, khi xuất 1 tức là đặt điện áp 3V3 ở cathode, led sẽ tắt; ngược lại, xuất 0 led sẽ sáng.

Đây là 1 đoạn code mẫu chạy led (mới viết, mấy em test luôn :d)
Code:
#include <msp430g2553.h> // or <msp430.h>
void main(void)
{
    unsigned int i;        // declare variable
    WDTCTL = WDTPW + WDTHOLD;        // Stop watch dog timer
    P1DIR |= 0xFF;            // Set all Port 1 to output direction
    P1OUT = 0xFE;                    // initiation, set Led at P1.0 on
 
 
    while(1)                        // infinite loop
    {
        for(i=0; i<=6;i++)
            {
            P1OUT =(P1OUT<<1)+1;  // shift led left           
            __delay_cycles(500000);    // Delay 0.5s
            }
        for(i=0; i<=6;i++)
            {
            P1OUT =(P1OUT>>1)+0x80;// shift led right
            __delay_cycles(500000);    // Delay 0.5s
            }
    }
}
Các em đổ thử lên con chip trên board, lấy bus 8 (hay 8 cọng bus 1) nối J9 với J17 coi led chạy rồi ngâm cứu code, hiểu rồi thì lập trình cho led chạy đủ kiểu đi nhé. Các kiểu các em có thể tự nghĩ ra, xem mấy clip này để tham khảo một số kiểu nhé :1cool_byebye:
HTML:
http://www.youtube.com/watch?v=qt4mimuz5rQ
http://www.youtube.com/watch?v=E8g_06NJEkc
http://www.youtube.com/watch?v=maDLJVoxZbs&feature=related
http://www.youtube.com/watch?v=44kMuDAa7BM&feature=endscreen&NR=1
Chú ý: trong mấy clip trên có điều khiển độ sáng của led, ở "đẳng cấp" của C7 mới chỉ điều khiển được led on/off thôi nhé =))
Chúc mấy em nghịch led vui, gặp lại chúng ta sẽ học tiếp phần input của GPIO :)
 

nickcat

Gian thương PIF
Code:
#include <msp430g2553.h>
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;        // Ngưng watch dog timer
    P1DIR |= 0xFF;            // Mặc định Port 1 là xuất
    P1OUT = 0xAA;                    // đầu tiên cho port 1 xuất ra là 01010101
 
    while (1)
    {
        P1OUT ^= 0xFF;    //cho xor với 11111111 để tao thành 10101010 nháy qya nháy lại
        __delay_cycles(500000);
    }
}
Viết chơi up mọi người nạp zô chạy thử, ai có led nháy nháy nào hay hay up lên mình coi với.

//2death:
Good job baby!
Các bạn nối tiếp bạn này chia sẻ code mình làm để cùng học được nhiều hơn nhé.
 

nguyễn đình huân

Cố Vấn CLB
mình cũng up thử 1 code góp vui
Code:
/*
* main.c
*/
#include <msp430.h>
void main(void)
{
    unsigned int k;// declare variable
    unsigned int led1 = 0x01, led2 = 0x80;
        WDTCTL = WDTPW + WDTHOLD;        // Stop watch dog timer
        P1DIR = 0xFF;            // Set Port 1 to output direction
        P1OUT = 0xFF;                    // initiation, turn off all leds
        while(1)                        // infinite loop
        {
            k = 1;
            for(k=1; k<=6;k++)
            {
                P1OUT = ~(led1 + led2);
                if (k<4)
                {led2 >>= 1; led1 <<= 1;}
                else
                {led2 <<= 1; led1 >>= 1;}
                _delay_cycles(1000000);
            }
        }
}
 

vanthinhvt92

Thành Viên PIF
Code:
#include<msp430g2152.h>
unsigned char x,y,t;
 
void thietlap(void)
  {
    WDTCTL=WDTPW+WDTHOLD;
    P1SEL=0;
    P1SEL2=0;
    P2SEL=0;
    P2SEL2=0;
    P1DIR=0x01;
    P2DIR=0x00;
  }
void kt(void)
{
    y=P1IN&0x08;  //doc gia tri p1.3 vao y
    if (y==8)    //cho cho khi p1.3 xuong 0
    {
        kt();
    }
    else
    {
        x=x+1;
    }
}
void main(void)
{
    thietlap();
    while(1)
    {
        kt();
        t=x%2;
        if(t==0)
        {
            P1OUT|=0x01;
        }
 
        else
        {
            P1OUT&=0x00;
        }
    }
 
}
 

nhok 9x

Trứng gà
Mình cũng tham gia một đoạn nhỏ, nhưng chức năng hơi khác nhá !!!!!!!!!!
#include<msp430g2553.h>
unsigned char x,y,t;

void thietlap(void)
{
WDTCTL=WDTPW+WDTHOLD;// code này có nhiệm vụ là nếu bấm nút thì led sẽ thay đổi trạng thái ;
P1DIR=0x01;
......................................
P1OUT&=0x00;// co bam nut thi tat led
}
}
}
Code của bạn dài kinh ^_^
Đây là video chương trình do mình làm. Kiểu này noel đem ra treo, khỏi mất công mua đèn Trung Quốc =))
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Code:
#include<msp430g2152.h>
unsigned char x,y,t;
 
void thietlap(void)
  {
    WDTCTL=WDTPW+WDTHOLD;
    P1SEL=0;
    P1SEL2=0;
    P2SEL=0;
    P2SEL2=0;
    P1DIR=0x01;
    P2DIR=0x00;
  }
void kt(void)
{
    y=P1IN&0x08;  //doc gia tri p1.3 vao y
    if (y==8)    //cho cho khi p1.3 xuong 0
    {
        kt();
    }
    else
    {
        x=x+1;
    }
}
void main(void)
{
    thietlap();
    while(1)
    {
        kt();
        t=x%2;
        if(t==0)
        {
            P1OUT|=0x01;
        }
 
        else
        {
            P1OUT&=0x00;
        }
    }
 
}
cái chỗ if (y==8) hình như....:cool_what: nếu mà = thì giá trị ở đó bằng 1 mà..sao là nối GND ta
 

vanthinhvt92

Thành Viên PIF
Code:
#include<msp430g2152.h>
unsigned char x,y,t;
 
void thietlap(void)
  {
    WDTCTL=WDTPW+WDTHOLD;
    P1SEL=0;
    P1SEL2=0;
    P2SEL=0;
    P2SEL2=0;
    P1DIR=0x01;
    P2DIR=0x00;
  }
void kt(void)
{
    y=P1IN&0x08;  //doc gia tri p1.3 vao y
    if (y==8)    //cho cho khi p1.3 xuong 0
    {
        kt();
    }
    else
    {
        x=x+1;
    }
}
void main(void)
{
    thietlap();
    while(1)
    {
        kt();
        t=x%2;
        if(t==0)
        {
            P1OUT|=0x01;
        }
 
        else
        {
            P1OUT&=0x00;
        }
    }
 
}
cái chỗ if (y==8) hình như....:cool_what: nếu mà = thì giá trị ở đó bằng 1 mà..sao là nối GND ta
Thi mình ghi là chờ cho xuống mức 0 đó ???
 

omega5161

Thành Viên PIF
Code:
#include <msp430g2553.h>
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;        // Stop watch dog timer
    P1DIR |= 0xFF;            // Set all Port 1 to output direction
      unsigned int i,k;
      while(1)                     
    {
          P1OUT =0xFF;
        for (i=0;i<=7;i++)
        {
            P1OUT =P1OUT<<1;
            _delay_cycles(100000);
        }
        k=1;
        for (i=1;i<=8;i++)
        {
              P1OUT +=k;
              k*=2;
              _delay_cycles(100000);
        }
 
    }
}
moi người cho ý kiến với
 

nhok 9x

Trứng gà
Code:
#include <msp430g2553.h>
........................................
              P1OUT +=k;
              k*=2;
              _delay_cycles(100000);
        }
 
    }
}
moi người cho ý kiến với
Uh, code này cũng được đấy, nhưng dùng lệnh dịch bit, kết hợp phép '+' cho nhanh và dễ hiểu:
(P1OUT << 1) +0x01;
đỡ phải dùng thêm biến k nữa ^_^. Làm thêm nhiều kiểu nữa đi bạn :D
 

tranthienchi

Trứng gà
help TOT hum nay em mới rãnh lấy ra làm vô CCS5 copy code của mọi người + code cũ hum bữa làm trên lớp nhưng lần này sao không thấy hiện ra thanh run ==" mà nó lại ghi lỗi usb kết nối hok dc ,và hok kết nối đối tượng j j đó chẳng hiểu trong khi đèn 1 led sáng và khi chuyển cong tắc có 1 đèn led nữa sáng vậy usb phải cắm oài nó mới chuyển điện qua chứ sao CCS5 bảo kết nối không được anh chi giúp với :(((((
Untitled.png
 

Kisses Hacker

Art Supporter
Staff member
help TOT hum nay em mới rãnh lấy ra làm vô CCS5 copy code của mọi người + code cũ hum bữa làm trên lớp nhưng lần này sao không thấy hiện ra thanh run ==" mà nó lại ghi lỗi usb kết nối hok dc ,và hok kết nối đối tượng j j đó chẳng hiểu trong khi đèn 1 led sáng và khi chuyển cong tắc có 1 đèn led nữa sáng vậy usb phải cắm oài nó mới chuyển điện qua chứ sao CCS5 bảo kết nối không được anh chi giúp với :(((((
Không hiểu bạn đang nói cái gì :botay: Nhìn hình mới hiểu được sơ sơ vấn đề. Gõ tiếng Việt trong sáng nhé bạn. Mấy dấu chấm dấu phẩy có tốn tiền đâu mà hà tiện :2cool_burn_joss_stick:

Hình như bạn đang tìm cách kết nối board main bạn làm với launchpad phải không. Giờ bạn thử kết nối với chip nằm trên launchpad trước xem sao. Nếu ok thì hẳng kết nối với board main của bạn. Coi hướng dẫn nối dây (nằm đâu đó trong diễn đàn) trước nhá.
 

tranthienchi

Trứng gà
kiss: hum bữa đã test trên launchpad code led chớp ,h đã chuyển sang board cắm dây đúng hướng dẫn ,kiểm tra kĩ oài T^T ,giờ quay sang gắn chip lên lauch chỉ còn 1 led bên phần usb sáng,còn 2 led trong msp hok thấy sáng nữa :(( kiểu này hok bik có phải chíp bị hư gãy chân phải hok :(
mafia:cắm chặt oài TOT
 

vanthinhvt92

Thành Viên PIF
kiss: hum bữa đã test trên launchpad code led chớp ,h đã chuyển sang board cắm dây đúng hướng dẫn ,kiểm tra kĩ oài T^T ,giờ quay sang gắn chip lên lauch chỉ còn 1 led bên phần usb sáng,còn 2 led trong msp hok thấy sáng nữa :(( kiểu này hok bik có phải chíp bị hư gãy chân phải hok :(
mafia:cắm chặt oài TOT
Bạn vào device Manager, chọn phần Ports( COM & LPT) xem thử nó có hiện chữ MSP430- UART chưa, nếu chưa tức là kit launchpad chưa có kết nối với máy tính đó !!!!!!!!!!!!!!!!!!!!!!!!:4cool_beauty:
 

Kisses Hacker

Art Supporter
Staff member
kiss: hum bữa đã test trên launchpad code led chớp ,h đã chuyển sang board cắm dây đúng hướng dẫn ,kiểm tra kĩ oài T^T ,giờ quay sang gắn chip lên lauch chỉ còn 1 led bên phần usb sáng,còn 2 led trong msp hok thấy sáng nữa :(( kiểu này hok bik có phải chíp bị hư gãy chân phải hok :(
mafia:cắm chặt oài TOT
Cắm dây vào board main thì phần dưới của LaunchPad đâu còn gì để mà chớp nữa. Lúc này mấy cái chân bên board main của bạn mới chớp ấy. Bạn thấy 1 led bên phần usb (đúng hơn là phần debug của LaunchPad) sáng, còn 2 led bên phần MSP không sáng là đúng rồi.

P.s: cái gì mà cứ TOT TOT mãi thế =.= Biết từ đó là gì không, dùng cẩn thận kẻo ra đảo =))
 

phuong le

Thành Viên PIF
Code:
#include <msp430g2553.h>
#define LED 0xFF
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= LED;
    while(1)
    {
        int i, A[] = {BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7};
        for(i=4;i<8;i++)
                    {
                    P1OUT |= LED;
                    P1OUT &= ~A[i];
                    P1OUT &= ~A[7-i];
                    if (i == 0)
                        i=4;
                    _delay_cycles(500000);
                    }
    }
}
viết theo kiểu này có thể ứng dụng nhiều kiểu nháy led hok mấy a chị ?
 

nhok 9x

Trứng gà
Code:
#include <msp430g2553.h>
        for(i=4;i<8;i++)
                    {
                    P1OUT |= LED;
                    P1OUT &= ~A[i];
                    P1OUT &= ~A[7-i];
                    if (i == 0)
                        i=4;
viết theo kiểu này có thể ứng dụng nhiều kiểu nháy led hok mấy a chị ?
Đoạn này khó hiểu quá nhỉ, i đang tăng từ 4 mà, làm sao =0 đc, nếu muốn bằng thì phải chờ nó tràn, integer thì hơi bị lâu tràn đó :D.
Có phải ý đồ thuật toán của bạn là cho 2 đầu sáng rồi chạy vào giữa đúng ko? Có gì bạn cứ đổ lên kit là bik đúng hay sai liền mà ^_^

P.s: cái gì mà cứ TOT TOT mãi thế =.= Biết từ đó là gì không, dùng cẩn thận kẻo ra đảo =))
Nếu anh đoán ko nhầm thì đó là chữ tượng hình cái mặt khóc đó kisseshacker ơi, ko có j` xấu xa ở trỏng đâu em ^_^.
Ví dụ như vầy nè @@, ^_^, <3, T_T, ToT, ="=. Chat zới mấy pé teen wài nên bik keke
 

phuong le

Thành Viên PIF
Đoạn này khó hiểu quá nhỉ, i đang tăng từ 4 mà, làm sao =0 đc, nếu muốn bằng thì phải chờ nó tràn, integer thì hơi bị lâu tràn đó :D.
Có phải ý đồ thuật toán của bạn là cho 2 đầu sáng rồi chạy vào giữa đúng ko? Có gì bạn cứ đổ lên kit là bik đúng hay sai liền mà ^_^
cái trên em viết thì ok òi đó, nhưng ý em hỏi viết theo cái kiểu của e có thể ứng dụng cho nhiều kiểu nháy led khác nhau hok??
 

linh lê

Trứng gà
disco :))
Code:
/*
* main.c
*/
#include <msp430.h>
 
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;        // Stop watch dog timer
        P1DIR |= 0xFF;            // Set all Port 1 to output direction
          unsigned int i;
          P1OUT =0xFE;
          while(1)
        {
              for(i=1;i<8;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<4;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<3;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<6;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<2;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<2;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<4;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<8;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<3;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<7;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<9;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<6;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<2;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<4;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<3;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<7;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<9;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<6;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<7;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<2;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<4;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<7;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<5;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<3;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<4;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<4;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
              for(i=1;i<6;i++)
              {
                    P1OUT =P1OUT<<1;
                    _delay_cycles(40000);
              }
              for(i=1;i<7;i++)
              {
                  P1OUT |= 0x80;
                  P1OUT = (P1OUT>>1) | 0X80;
                  _delay_cycles(40000);
              }
 
        }
}
 
Top