[C12] Thông báo buổi học 30-11

messier

Ban Chủ Nhiệm
Tình hình sau 3 buổi học code liên tiếp không có gì vui nên bữa tới lớp C12 sẽ đổi sang học vẽ mạch. Cụ thể là sẽ dùng phần mềm Eagle Cad để thiết kế một mạch nguồn linear đơn giản. Các bạn tải thêm các thư viện sau để sử dụng: Sparkfun.lbr, adafruit.lbrPIF.lbr
Hướng dẫn sử dụng Eagle Cad các bạn có thể xem trước trên trang Sparkfun.
Ngoài ra các bạn download datasheet của các IC nguồn sau để xem trước (chân cẳng, hoạt động)
- LM317
- LM7805

Về module Analog các bạn không tìm ra link thì có thể download dưới đây:
Link down module: ChickyAnalog
BOM list: BOM
Source code đo nhiệt độ buổi học trước:
Code:
/******************************************************************************
*
* www.payitforward.edu.vn
*
******************************************************************************/
 
/******************************************************************************
*
* C7 TRAINING
*
******************************************************************************/
 
/******************************************************************************
*
*  Module        : TEMPERATURE SENSOR
*  Description    : This file describes API functions that support for
*                    temperature sensor on MSP430G2553
*
*  Tool          : CCS 5.1
*  Chip          : MSP430G2553
*  History        : 04-11-2012
*  Version        : 1
*
*  Author        :
*  Notes          : To apply these functions, you must include the header file lcd.h and
*                  source file lcd.c to your project.
*
*
******************************************************************************/
 
/****************************************************************************
* IMPORT
******************************************************************************/
#include <msp430g2553.h>
 
 
/****************************************************************************
* DECLARATIONS
******************************************************************************/
unsigned char temp;
 
/*****************************************************************************
*                        SUBROUTINES
******************************************************************************/
 
//*****************************************************************************
// Initialization for ADC10 module
//*****************************************************************************
void ADC10_Init(void)
{
    ADC10CTL0 = SREF_1 + ADC10SHT_3 + ADC10ON + ADC10IE + REFON;
    /*
    * Vr+ = Vref+
    * ADC sample and hold time = 64 ADC clocks: When using the temperature
      sensor, the sample period must be greater than 30 µs
    * Turn on ADC10
    * Enable ADC10 Interrupt
    * Turn on reference generator
    */
    ADC10CTL1 = INCH_10 + ADC10DIV_1 + ADC10SSEL_3 ;
    /*
    * Select Input chanel: Temperature Sensor
    * ADC10DF = 0: The 10-bit conversion results are right justified
    * ADC10 Clock divider: 4
    * ADC10 clock source select: SMCLK
    */
}
 
/*****************************************************************************
*                        MAIN PROGRAM
******************************************************************************/
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;    //Stop Watchdog Timer
    ADC10_Init();                //Initialize ADC10
//    P2SEL = 0;                    //Turn off external crystal
//    P2SEL2 = 0;
 
    while (1)
    {
        ADC10CTL0 |= ENC + ADC10SC;            //Enable ADC10, Start sample - conversion
        _bis_SR_register(LPM0_bits + GIE);    //Enter LPM0, wait for sample-conversion finish
        _delay_cycles(50000);
 
    }
}
 
/*****************************************************************************
*                        INTERRUPT PROGRAM
******************************************************************************/
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_Interrupt(void)
{
    temp=((ADC10MEM - 673) * 423) / 1024;    //Calculate temperature
    /*
    * VTEMP=0.00355(TEMPC)+0.986
    * Vref = 1.5V
    */
    _bic_SR_register_on_exit(LPM0_bits);    //Exit LPM0
}
/*****************************************************************************
*                        END
******************************************************************************/
Source code PWM led dimming:
Code:
#include <msp430.h>
 
void setup_timer(){
    TA0CCR0 = 10000;        // T = 10ms
                            // Duty cycles = 10%
                            // => CCR1/CCR0 = 10%
    TA0CCR1 = 10;
    TA0CCTL1 = OUTMOD_7;        // Outmode 7: Reset/set
    TA0CTL = TASSEL_2 + MC_1;    // SMCLK, Up mode
}
 
void setup_port(){
    // OUT1 -> P1.6 (xem datasheet)
    P1SEL |= BIT6;
    P1SEL2 &= ~BIT6;
    P1DIR |= BIT6;
}
 
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer
    setup_port();
    setup_timer();
    _bis_SR_register(LPM0_bits);    // Cho MCU vao che do Low power mode 0
    return 0;
}
Source code PWM điều khiển LED RGB
Code:
// R -> P1.2, G -> P2.1, B -> p2.4
#include <msp430.h>
#include <stdint.h>
char r,g,b;
void Wheel(uint16_t WheelPos, char *r, char *g, char *b)
{
    switch(WheelPos / 128)
    {
    case 0:
        *r = 127 - WheelPos % 128; // red down
        *g = WheelPos % 128;      // green up
        *b = 0;                    // blue off
        break;
    case 1:
        *g = 127 - WheelPos % 128; // green down
        *b = WheelPos % 128;      // blue up
        *r = 0;                    // red off
        break;
    case 2:
        *b = 127 - WheelPos % 128; // blue down
        *r = WheelPos % 128;      // red up
        *g = 0;                    // green off
        break;
    }
}
 
void setup_timer(){
    TA0CCTL1 = OUTMOD_7;
    TA0CCR0 = 127;
    TA0CTL = TASSEL_2 + MC_1;
 
    TA1CCTL1 = OUTMOD_7;
    TA1CCTL2 = OUTMOD_7;
    TA1CCR0 = 127;
    TA1CTL = TASSEL_2 + MC_1;
}
 
 
void setup_port(){
    P1SEL |= BIT2;
    P1SEL2 &= ~BIT2;
    P1DIR |= BIT2;
 
    P2SEL |= BIT1 + BIT4;
    P2SEL2 &= ~(BIT1 + BIT4);
    P2DIR |= BIT1 + BIT4;
}
/*
* main.c
*/
int main(void) {
    uint16_t i;
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
    setup_port();
    TA0CCR1 = 0;
    TA1CCR1 = 127;
    TA1CCR2 = 127;
    setup_timer();
    while(1){
        for(i = 0; i < 384; i++){
            Wheel(i, &r, &g, &b);
            TA0CCR1 = r;
            TA1CCR1 = g;
            TA1CCR2 = b;
            __delay_cycles(20000);
        }
    }
    return 0;
}
Source code sử dụng capture để đo thời gian nhấn phím.
Code:
#include <msp430.h>
// Nut nhan -> P1.2 (timer 0 CCI1A)
void setup_timer(){
    // Capture canh xuong, CCIA, cho phep ngat
    TA0CCTL1 = CM_2 + CCIS_0 + CAP + CCIE;
    TA0CTL = TASSEL_2 + MC_2 + ID_3;// SMCLK/8, Continuos mode
}
 
void setup_port(){
    // CCI1A -> P1.2 (datasheet)
    P1SEL |= BIT2;
    P1SEL2 &= ~BIT2;
    P1DIR &= ~BIT2;
    // Chon tro keo len
    P1REN |= BIT2;
    P1OUT |= BIT2;
}
/*
* main.c
*/
int main(void) {
    volatile int ccr1_store, delta_count;
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
    setup_port();
    while(1){
        setup_timer();
        _bis_SR_register(GIE+LPM0_bits);
        // Luu thoi diem capture o canh xuong
        ccr1_store = TA0CCR1;
        _bis_SR_register(GIE+LPM0_bits);
        // Thoi diem caputure canh len - thoi diem capture canh xuong
        delta_count = TA0CCR1 - ccr1_store;
    }
    return 0;
}
 
#pragma vector=TIMER0_A1_VECTOR
__interrupt void timer0_a1_isr(){
    switch(TA0IV){
    case 0x02:
        // Config capture canh len
        TA0CCTL1 = CM_1 + CCIS_0 + CAP + CCIE;
        _bic_SR_register_on_exit(LPM0_bits);
        break;
    case 0x04:
        break;
    case 0x0A:
        break;
    }
}
 

messier

Ban Chủ Nhiệm
Do bữa tới các bạn K14 bận thi buổi sáng nên có thể buổi học sẽ dời xuống 2h chiều CN. Còn giờ đó có kiếm đc phòng không thì anh sẽ update sau. :1cool_byebye:

// Sao không edit được bài thế lày :5cool_beat_plaster:
 

messier

Ban Chủ Nhiệm
Bản freeware cũng đủ xài với đa số mạch rồi em (chỉ bị giới hạn kích thước board là 8x10cm). Còn nếu em xài bản full thì chịu khó search google. Anh cũng có bản 6.4 full mà khi nào board bự quá mới dùng đến nó, bình thường vẫn xài bản freeware :6cool_boss:
 
Top