Thông báo

Collapse
No announcement yet.

Điều khiển dùng Remote TV với MSP430

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Điều khiển dùng Remote TV với MSP430

    Hi,
    Lâu rồi không tham gia diễn đàn, nay trở lại góp vui với bà con MSP430 chương trình nháp điều khiển từ xa dùng Remote của TV, DVD, vv... của Sony, Samsung, GL, Panasonic, vv... trừ mấy loại của Trung Quốc. Đây là chương trình nháp, muốn ứng dụng thì phải code bổ sung vào, mục đích là để cho các bác vọc MSP430 với KIT MSP430 LaunchPad. Trong ví dụ này, các bác học cách sử dụng ADC (single conversion), sử dụng Timer, các ngắt và chế độ tiết kiệm năng lượng.
    Mô tả sơ hoạt động của chương trình như sau (nhìn ảnh dưới nhé):
    Để điều khiển được trước tiên phải dạy cho mạch các lệnh điều khiển. Vì bộ nhớ có hạn nên mạch chỉ thực hiện được 6 lệnh điều khiển. Việc dạy lệnh điều khiển cho mạch được thực hiện bằng cách vặn biến trở về bên trái đến khi màn hình hiển thị chữ SET. Tiếp theo vặn biến trở bên phải để chọn lệnh (từ 0 đến 5). Và bấm nút trên remote 4 lần để mạch ghi nhớ lệnh. Khi lệnh được ghi nhớ thì đèn báo sẽ sáng lên giúp người dùng nhận biết và chuyển qua dạy cho lệnh mới. Vặn biến trở bên phải qua mã lệnh mới và thực hiện dạy lệnh mới cho mạch. Sau khi dạy xong lệnh cho mạch thì vặn biến trở bên phải qua chế độ hoạt động, màn hình sẽ hiển thị chữ RUN. Lúc này bạn bấm lệnh nào thì màn hình sẽ hiển thị lệnh đó và thực hiện lệnh đó (trong phạm vi ví dụ chỉ thực hiện việc Bật đèn). Nếu bấm sai lệnh thì sẽ thực hiện Tắt đèn.
    Có thể mở rộng thêm các tính năng khác như hẹn giờ, đồng hồ vv...
    Một vài ảnh:

    KIT MSP430 LaunchPad

    Mạch test

    Chế độ dạy lệnh

    Chế độ hoạt động

    Các biến trở dùng để dạy và điều khiển

    Và cuối cùng là code
    Code:
    #include <msp430g2231.h>
    
    
    #define _S	11
    #define _E	12
    #define _T	13
    #define _R	14
    #define _U	15
    #define	_N	16
    
    
    #define SETTING	0
    #define RUNNING	1
    
    
    const unsigned char LedCode[17] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF, 0x92, 0x86, 0x87, 0xCE, 0xE3, 0xAB};	//codes of led7 from 0 to 9
    const unsigned char LedID[4] = {0x01, 0x02, 0x04, 0x08};		// active led7
    const unsigned int AdcChanel[2] = {INCH_1, INCH_2};
    
    
    volatile unsigned char Number, Dot, Blink;
    volatile unsigned char LedBuffer[4] = {0, 0, 0, 1};	// test data
    volatile unsigned char Scene;
    
    
    volatile unsigned char Buffer[24];
    volatile unsigned long Command[6];
    volatile unsigned long IrCode;
    volatile unsigned char BitCounter, StartBit;
    
    
    void update(void);
    /*
     * main.c
     */
    int main(void) {
        WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog timer
        P1SEL = BIT1 + BIT2;
        P1DIR = 0xF1;
        P1REN = 0x00;
        ADC10CTL0 = ADC10SHT_0 + SREF_0 + ADC10ON;	// + ADC10IE; // ADC10ON, interrupt enabled
    	ADC10CTL1 = ADC10SSEL_0 + AdcChanel[0];         // input A1
    	ADC10AE0 |= BIT1 + BIT2;
    	ADC10CTL0 |= ENC + ADC10SC;
    
    
        TACTL |= TASSEL_1 + MC_1;// + TAIE;		// Timer A source from ACLK, up mode, Timer A interrupt enable
        CCR0 = 655;						// period approximately 20ms
        CCR1 = 131;
        CCTL1 = CCIE;
    
    
        P1IE = BIT3;	// enable interrupt P1.3
        P1IES = BIT3;	// H2L trigger interrupt
        StartBit = 1;	// indicate start of frame
        P1OUT &= ~BIT0;
        _bis_SR_register(LPM3_bits + GIE);
    }
    // interrup port 1.3
    #pragma vector = PORT1_VECTOR
    void __interrupt port1_isr(void)
    {
    	if(StartBit)
    	{
    		TAR = 0;		// reset Timer A counter
    		CCTL0 = CCIE;	// enable CC0 interrupt
    		BitCounter = 0;	// reset BitCounter
    		StartBit = 0;	// clear start of frame status
    	}
    	else if(BitCounter < 23)
    	{
    		Buffer[BitCounter] = TAR;	// get Timer A counter
    		TAR = 0;					// reset Timer A counter
    		BitCounter++;
    	}
    	P1IFG &= ~BIT3;		// clear interrupt flag
    }
    // interrupt capture/compare 0
    #pragma vector = TIMERA0_VECTOR
    void __interrupt cc0_isr(void)
    {
    	unsigned char min, max, average, i;
    	static unsigned char count;
    	static unsigned long temp;
    
    
    	CCTL0 &= ~CCIE;		// disable CC0 interrupt
    	StartBit = 1;		// set start of frame
    	if(BitCounter < 5) return;	// ignore if interference
    	// decode
    	min = 0xFF;
    	max = 0x00;
    	for(i = 1; i < BitCounter; i++)
    	{
    		if(Buffer[i] < min) min = Buffer[i];
    		if(Buffer[i] > max) max = Buffer[i];
    	}
    	average = (max + min) / 2;
    	IrCode = 0;
    	for(i = 1; i < BitCounter; i++)
    	{
    		IrCode <<= 1;
    		if(Buffer[i] > average) IrCode++;
    	}
    	if(Scene == SETTING)
    	{
    		if(IrCode != temp)
    		{
    			temp = IrCode;
    			count = 0;
    			P1OUT &= ~BIT0;
    		}
    		else if(++count >= 3)
    		{
    			Command[LedBuffer[0]] = IrCode;
    			count = 0;
    			P1OUT |= BIT0;
    		}
    	}
    	else if(Scene == RUNNING)
    	{
    		for(i = 0; i < 6; i++)
    		{
    			if(IrCode == Command[i])
    			{
    				LedBuffer[0] = i;
    				P1OUT |= BIT0;
    				break;
    			}
    			else P1OUT &= ~BIT0;
    		}
    	}
    }
    #pragma vector = TIMERA1_VECTOR
    void __interrupt taif_isr(void)
    {
    	static volatile unsigned char i = 0, count, blink_counter, last_id = BIT0;
    	unsigned char k;
    	unsigned char temp;
    
    
    	if(TAIV & TAIV_TACCR1)
    	{
    		CCR1 += 100;
    		if(CCR1 > 655) CCR1 = 100;
    		// scan led7
    		if(i >= 3)	// set led7 id
    			i = 0;
    		else
    			i++;
    
    
    		if(++blink_counter >= 50)
    		{
    			blink_counter = 0;
    
    
    			if(Blink < 4) last_id ^= BIT0;
    			else last_id = 0;
    		}
    
    
    		temp = LedID[i] << 4;
    		for(k = 0; k < 4; k++)
    		{
    			//if(last_id && ((k + Blink) == 3)) P1OUT |= BIT5;
    			if(last_id && ((Blink + k) == 3)) P1OUT |= BIT5;
    			else
    			{
    				if(temp & BIT7) P1OUT &= ~BIT5;		// Apply Led ID data
    				else P1OUT |= BIT5;
    			}
    
    
    			P1OUT |= BIT6;					// Clock Shift pulse
    			temp <<= 1;
    			P1OUT &= ~BIT6;
    		}
    
    
    		temp = LedCode[LedBuffer[i]];
    		//if(i == 2) temp &= ~BIT7;	// display dot sign at led 2
    		for(k = 0; k < 8; k++)
    		{
    			if(temp & BIT7) P1OUT |= BIT5;
    			else P1OUT &= ~BIT5;
    
    
    			P1OUT |= BIT6;
    			temp <<= 1;
    			P1OUT &= ~BIT6;
    		}
    		P1OUT |= BIT7;
    		_NOP();
    		P1OUT &= ~BIT7;
    		if(++count >= 40)
    		{
    			count = 0;
    			update();
    		}
    	}
    }
    void update(void)
    {
    	unsigned long adc_value;
    	unsigned char now;
    	static unsigned char channel, last = 0xFF;//, last_blink;
    
    
    	if(ADC10CTL0 & ADC10BUSY)
    	{
    		return;
    	}
    	adc_value = ADC10MEM;
    
    
    	ADC10CTL0 &= ~ENC;		// Disable conversion
    
    
    	if(channel == 0)
    	{
    		Scene = (unsigned char)(adc_value * 2 / 1023);
    		if(Scene == SETTING)
    		{
    			LedBuffer[3] = _S;
    			LedBuffer[2] = _E;
    			LedBuffer[1] = _T;
    			Blink = 0;
    		}
    		else if(Scene == RUNNING)
    		{
    			LedBuffer[3] = _R;
    			LedBuffer[2] = _U;
    			LedBuffer[1] = _N;
    			Blink = 0xFF;
    		}
    		channel = 1;
    	}
    	else
    	{
    		//LedBuffer[0] = (unsigned char)(adc_value * 6 / 1023);
    		now = (unsigned char)(adc_value * 6 / 1023);
    		if(last ^ 0xFF)			// Ignore the first value
    		{
    			if(now < last)
    			{
    				if((LedBuffer[0] + now) <= last) LedBuffer[0] = 0;
    				else LedBuffer[0] = LedBuffer[0] + now - last;
    			}
    			else if(now > last)
    			{
    				LedBuffer[0] = LedBuffer[0] + now - last;
    				if(LedBuffer[0] > 5) LedBuffer[0] = 5;
    			}
    		}
    		last = now;
    		channel = 0;
    		if(Scene == RUNNING)
    		{
    			// do command of LedBuffer[0] value
    		}
    	}
    	ADC10CTL1 = AdcChanel[channel];
    	ADC10CTL0 |= ENC + ADC10SC;				// Enable, start conversion
    }
    Đường đến những ngày vinh quang không còn xa
    Con đường chúng ta... chúng ta đã chọn.

  • #2
    Phải nói bác cực chịu khó. Giờ bảo e cắm cái board chắc e chịu. Ko đủ kiên trì như xưa nữa @@.


    Add: 97 Quán Nam - Lê Chân - Hải Phòng.
    Tel: 031 518648 Phone: 0904 283 505

    Comment


    • #3
      Nguyên văn bởi hoangdai Xem bài viết
      Phải nói bác cực chịu khó. Giờ bảo e cắm cái board chắc e chịu. Ko đủ kiên trì như xưa nữa @@.
      Cắm cái breadboard này cũng nhanh mà, có điều cái này mua ở chợ trời HN đểu quá, chỗ cắm linh kiện thì rất khó còn 2 đường cắm nguồn thì lại lỏng lẽo. Mà test chương trình thì dùng cái này nó tiện mà, dùng mô phỏng proteus thì không trực quan bằng.
      Đường đến những ngày vinh quang không còn xa
      Con đường chúng ta... chúng ta đã chọn.

      Comment


      • #4
        Nhân tiện, có bác nào biết mấy cái Remote của đồ Trung Quốc nó phát mã theo kiểu gì không?
        Đường đến những ngày vinh quang không còn xa
        Con đường chúng ta... chúng ta đã chọn.

        Comment


        • #5
          Sao bác ko cho nó học ấy có phải nhàn ko?


          Add: 97 Quán Nam - Lê Chân - Hải Phòng.
          Tel: 031 518648 Phone: 0904 283 505

          Comment


          • #6
            Nguyên văn bởi hoangdai Xem bài viết
            Sao bác ko cho nó học ấy có phải nhàn ko?
            Học Remote khác thì được mà học đồ Trung Quốc không được. Tìm trên mạng thì thấy người ta bảo nó dùng giao thức của NEC nhưng mà làm hoài cả ngày vẫn chưa xử được.
            Đường đến những ngày vinh quang không còn xa
            Con đường chúng ta... chúng ta đã chọn.

            Comment


            • #7
              Nguyên văn bởi Hard Xem bài viết
              Học Remote khác thì được mà học đồ Trung Quốc không được. Tìm trên mạng thì thấy người ta bảo nó dùng giao thức của NEC nhưng mà làm hoài cả ngày vẫn chưa xử được.
              Thử dùng vốn tiếng Anh của mình đi bác , google >NEC Protocol> rất nhiều, tôi chọn đại cái này vì có vẻ dễ nhìn:

              SB-Projects: IR Remote Control, NEC Protocol

              Mà NEC là của Nhật, sao TQ lại dùng.

              Tv kì cựu như bác thì nên vào chơi, trao đổi thường xuyên hơn chứ không cần kiệm lời quá, ai chẳng lo cuộc sống riêng, đủ thứ chuyện...nhưng mỗi lúc mỗi việc.
              Last edited by avr; 28-09-2013, 00:26.

              Comment


              • #8
                Hi,
                Lọ mọ cả ngày chẳng làm được gì lại thêm hỏng chương trình, vào đây lấy lại cái hôm trước vừa up rồi chỉnh lại cho gọn thì nó lại chơi được luôn cả Remote Tàu rồi.
                Post lại chương trình test
                Code:
                #include <msp430g2231.h>
                
                
                
                
                #define _S	11
                #define _E	12
                #define _T	13
                #define _R	14
                #define _U	15
                #define	_N	16
                
                
                
                
                #define SETTING	0
                #define RUNNING	1
                
                
                
                
                const unsigned char LedCode[17] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF, 0x92, 0x86, 0x87, 0xCE, 0xE3, 0xAB};	//codes of led7 from 0 to 9
                const unsigned char LedID[4] = {0x01, 0x02, 0x04, 0x08};		// active led7
                const unsigned int AdcChanel[2] = {INCH_1, INCH_2};
                
                
                
                
                volatile unsigned char Number, Blink;
                volatile unsigned char LedBuffer[4] = {0, 0, 0, 1};	// test data
                volatile unsigned char Scene;
                
                
                
                
                volatile unsigned char Buffer[24];
                volatile unsigned long Command[6];
                volatile unsigned long IrCode;
                volatile unsigned char BitCounter, StartBit;
                
                
                
                
                void update(void);
                /*
                 * main.c
                 */
                int main(void) {
                    WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog timer
                    P1SEL = BIT1 + BIT2;
                    P1DIR = 0xF1;
                    P1REN = 0x00;
                    ADC10CTL0 = ADC10SHT_0 + SREF_0 + ADC10ON;	// + ADC10IE; // ADC10ON, interrupt enabled
                	ADC10CTL1 = ADC10SSEL_0 + AdcChanel[0];         // input A1
                	ADC10AE0 |= BIT1 + BIT2;
                	ADC10CTL0 |= ENC + ADC10SC;
                
                
                    TACTL |= TASSEL_1 + MC_1;// + TAIE;		// Timer A source from ACLK, up mode, Timer A interrupt enable
                    CCR0 = 655;						// period approximately 20ms
                    CCR1 = 100;//131;
                    CCTL1 = CCIE;
                
                
                
                
                    P1IE = BIT3;	// enable interrupt P1.3
                    P1IES = BIT3;	// H2L trigger interrupt
                    StartBit = 1;	// indicate start of frame
                    P1OUT &= ~BIT0;
                    _bis_SR_register(LPM3_bits + GIE);
                }
                // interrup port 1.3
                #pragma vector = PORT1_VECTOR
                void __interrupt port1_isr(void)
                {
                	if(StartBit)
                	{
                		TAR = 0;		// reset Timer A counter
                		CCTL0 = CCIE;	// enable CC0 interrupt
                		BitCounter = 0;	// reset BitCounter
                		StartBit = 0;	// clear start of frame status
                	}
                	else if(BitCounter < 23)
                	{
                		Buffer[BitCounter] = TAR;	// get Timer A counter
                		TAR = 0;					// reset Timer A counter
                		BitCounter++;
                	}
                	P1IFG &= ~BIT3;		// clear interrupt flag
                }
                // interrupt capture/compare 0
                #pragma vector = TIMERA0_VECTOR
                void __interrupt cc0_isr(void)
                {
                	unsigned char min, max, average, i;
                	static unsigned char count;
                	static unsigned long temp;
                
                
                	CCTL0 &= ~CCIE;		// disable CC0 interrupt
                	StartBit = 1;		// set start of frame
                
                
                	if(BitCounter < 5) return;	// ignore if interference
                	// decode
                	min = 0xFF;
                	max = 0x00;
                	for(i = 1; i < BitCounter; i++)
                	{
                		if(Buffer[i] < min) min = Buffer[i];
                		if(Buffer[i] > max) max = Buffer[i];
                	}
                	average = (max + min) / 2;
                	
                	if(Buffer[0] <= max) return; // ignore if invalid frame
                
                
                	IrCode = 0;
                	for(i = 1; i < BitCounter; i++)
                	{
                		IrCode <<= 1;
                		if(Buffer[i] > average) IrCode++;
                	}
                
                
                	if(Scene == SETTING)
                	{
                		if(IrCode != temp)
                		{
                			temp = IrCode;
                			count = 0;
                			P1OUT &= ~BIT0;
                		}
                		else if(++count >= 3)
                		{
                			Command[LedBuffer[0]] = IrCode;
                			count = 0;
                			P1OUT |= BIT0;
                		}
                	}
                	else if(Scene == RUNNING)
                	{
                		for(i = 0; i < 6; i++)
                		{
                			if(IrCode == Command[i])
                			{
                				LedBuffer[0] = i;
                				P1OUT |= BIT0;
                				break;
                			}
                			else P1OUT &= ~BIT0;
                		}
                	}
                }
                #pragma vector = TIMERA1_VECTOR
                void __interrupt taif_isr(void)
                {
                	static volatile unsigned char i, count, blink_counter, last_id = BIT0;
                	unsigned char k;
                	unsigned char temp;
                
                
                
                
                	if(TAIV & TAIV_TACCR1)
                	{
                		CCR1 += 100;
                		if(CCR1 > 655) CCR1 = 100;
                
                
                		// scan led7
                		if(i >= 3)	// set led7 id
                			i = 0;
                		else
                			i++;
                
                
                
                
                		if(++blink_counter >= 50)
                		{
                			blink_counter = 0;
                
                
                			if(Blink < 4) last_id ^= BIT0;
                			else last_id = 0;
                		}
                
                
                		temp = LedID[i] << 4;
                		for(k = 0; k < 4; k++)
                		{
                			if(last_id && ((Blink + k) == 3)) P1OUT |= BIT5;	// force turn off led
                			else
                			{
                				if(temp & BIT7) P1OUT &= ~BIT5;		// Apply Led ID data
                				else P1OUT |= BIT5;
                			}
                
                
                
                
                			P1OUT |= BIT6;					// Clock Shift pulse
                			temp <<= 1;
                			P1OUT &= ~BIT6;
                		}
                		temp = LedCode[LedBuffer[i]];
                
                
                		for(k = 0; k < 8; k++)
                		{
                			if(temp & BIT7) P1OUT |= BIT5;
                			else P1OUT &= ~BIT5;
                
                
                
                
                			P1OUT |= BIT6;
                			temp <<= 1;
                			P1OUT &= ~BIT6;
                		}
                		P1OUT |= BIT7;
                		_NOP();
                		P1OUT &= ~BIT7;
                		if(++count >= 40)
                		{
                			count = 0;
                			update();
                		}
                	}
                }
                void update(void)
                {
                	unsigned long adc_value;
                	unsigned char now;
                	static unsigned char channel, last = 0xFF;//, last_blink;
                
                
                
                
                	if(ADC10CTL0 & ADC10BUSY)
                	{
                		return;
                	}
                	adc_value = ADC10MEM;
                
                
                
                
                	ADC10CTL0 &= ~ENC;		// Disable conversion
                
                
                
                
                	if(channel == 0)
                	{
                		Scene = (unsigned char)(adc_value * 2 / 1023);
                		if(Scene == SETTING)
                		{
                			LedBuffer[3] = _S;
                			LedBuffer[2] = _E;
                			LedBuffer[1] = _T;
                			Blink = 0;
                		}
                		else if(Scene == RUNNING)
                		{
                			LedBuffer[3] = _R;
                			LedBuffer[2] = _U;
                			LedBuffer[1] = _N;
                			Blink = 0xFF;
                		}
                		channel = 1;
                	}
                	else
                	{
                		//LedBuffer[0] = (unsigned char)(adc_value * 6 / 1023);
                		now = (unsigned char)(adc_value * 6 / 1023);
                		if(last ^ 0xFF)			// Ignore the first value
                		{
                			if(now != last) LedBuffer[0] = now;
                		}
                		last = now;
                		channel = 0;
                		if(Scene == RUNNING)
                		{
                			// do command of LedBuffer[0] value
                		}
                	}
                	ADC10CTL1 = AdcChanel[channel];
                	ADC10CTL0 |= ENC + ADC10SC;				// Enable, start conversion
                }
                Thân ái.
                Đường đến những ngày vinh quang không còn xa
                Con đường chúng ta... chúng ta đã chọn.

                Comment


                • #9
                  Nguyên văn bởi avr Xem bài viết
                  Thử dùng vốn tiếng Anh của mình đi bác , google >NEC Protocol> rất nhiều, tôi chọn đại cái này vì có vẻ dễ nhìn:

                  SB-Projects: IR Remote Control, NEC Protocol

                  Mà NEC là của Nhật, sao TQ lại dùng.

                  Tv kì cựu như bác thì nên vào chơi, trao đổi thường xuyên hơn chứ không cần kiệm lời quá, ai chẳng lo cuộc sống riêng, đủ thứ chuyện...nhưng mỗi lúc mỗi việc.
                  Cám ơn bác động viên,
                  Từ thời trước đến giờ mỗi khi làm gì liên quan đến IR, mình toàn tham khảo cái trang ấy. Chỉ khác trước đây làm lần đầu thì dò đúng mã từng loại của từng hãng một để điều khiển rất là bất tiện. Bây giờ chẳng cần dò giao thức gì, lệnh gì mà làm theo kiểu cho học trước rồi điều khiển sau nên dùng Remote nào cũng được.
                  Thân ái.
                  Đường đến những ngày vinh quang không còn xa
                  Con đường chúng ta... chúng ta đã chọn.

                  Comment


                  • #10
                    thì ra vậy, giống ý của Hoangdai. "Học" tức là nhớ một sample nhị phân lặp đi lặp lại trong khoảng thời gian lấy mẫu? Mấy con led7 seg dùng để hiển thị cái mã đó cho dễ xem ah?

                    Comment


                    • #11
                      Học là MCU ngu quá ko hiểu thì nên cần ghi lại hết ấy mà .


                      Add: 97 Quán Nam - Lê Chân - Hải Phòng.
                      Tel: 031 518648 Phone: 0904 283 505

                      Comment


                      • #12
                        Hi,
                        Đang triển khai thực tế trên cái quạt, dù tiết trời đã vào Đông nhưng đã mất công làm thì áp dụng nó tí cho đỡ phí.
                        Chức năng đơn giản gồm: Tắt, Bật số 1, 2, 3, Quay chuyển hướng, Hẹn giờ. Tác động theo 2 cách hoặc bằng Remote hồng ngoại hoặc bằng các chiết áp. Nhược điểm của mạch là phải có Pin 3V để duy trì bộ nhớ RAM của chíp trong trường hợp mất điện. Hôm nào ráp xong thì mình quăng vài cái hình lên cho các bác chém.
                        Thân ái.
                        Đường đến những ngày vinh quang không còn xa
                        Con đường chúng ta... chúng ta đã chọn.

                        Comment


                        • #13
                          Nguyên văn bởi Hard Xem bài viết
                          Hi,
                          Đang triển khai thực tế trên cái quạt, dù tiết trời đã vào Đông nhưng đã mất công làm thì áp dụng nó tí cho đỡ phí.
                          Chức năng đơn giản gồm: Tắt, Bật số 1, 2, 3, Quay chuyển hướng, Hẹn giờ. Tác động theo 2 cách hoặc bằng Remote hồng ngoại hoặc bằng các chiết áp. Nhược điểm của mạch là phải có Pin 3V để duy trì bộ nhớ RAM của chíp trong trường hợp mất điện. Hôm nào ráp xong thì mình quăng vài cái hình lên cho các bác chém.
                          Thân ái.
                          MSP430 à, bạn lưu gì mà cần RAM lúc mất điện

                          Comment


                          • #14
                            Cho mình hỏi bạn dùng con IC gì trên test board vậy?

                            Comment


                            • #15
                              Chip này không có eeprom để lưu, chương trình dùng nhiều lệnh rẽ nhánh quá nên bị tràn bộ nhớ không code thêm để dùng I2C được. Đành dùng tạm cục pin backup vậy, các dữ liệu cần lưu là mã phím đã cài, nếu mất nguồn thì nội dung của biến bị mất lại mất công dạy lại cho nó.
                              Chip cắm trên breadboard là 74HC595 để quét Led7 và xuất lệnh điều khiển. MSP430 là con chip 14 chân trên KIT mà đỏ ấy.
                              Phác thảo trước
                              Click image for larger version

Name:	testboard.png
Views:	1
Size:	49.7 KB
ID:	1386457
                              Thân ái.
                              Last edited by Hard; 01-10-2013, 20:28.
                              Đường đến những ngày vinh quang không còn xa
                              Con đường chúng ta... chúng ta đã chọn.

                              Comment

                              Về tác giả

                              Collapse

                              Hard Nothing to say Tìm hiểu thêm về Hard

                              Bài viết mới nhất

                              Collapse

                              • nhathung1101
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi nhathung1101
                                Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

                                Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

                                Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
                                hôm nay, 22:18
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                                Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                                hôm nay, 14:51
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                                Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                                hôm nay, 14:39
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                                Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                                hôm nay, 14:28
                              • bqviet
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi bqviet
                                Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                                Hôm qua, 20:26
                              • mèomướp
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi mèomướp
                                Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                                Hôm qua, 12:32
                              • vi van pham
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi vi van pham
                                Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                                Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                                20-02-2025, 21:31
                              • bqviet
                                Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                                bởi bqviet
                                Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                                20-02-2025, 17:22
                              • dinhthuong80
                                Trả lời cho Tiếng Anh cho người Việt
                                bởi dinhthuong80
                                Tiếng Anh, Đình Thường phải nói là rất tệ, khiến việc giao tiếp đời thường thôi cũng khó chứ nói gì về kĩ thuật.

                                Nhân tiện, nhờ các bạn, các bác xem giúp thư ĐT viết thế này liệu có thể gửi tới địa chỉ nhận hay chăng,...
                                20-02-2025, 11:52
                              • vi van pham
                                Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                                bởi vi van pham
                                Uống rượu 1 mình, thấy trang này nhớ lại cách đây vài chục năm hàn thiếc với inox cực kỳ khó, phải dùng acid Hcl tác dụng lên kẻm Zn để có Zncl2 làm thuốc trợ hàn, lúc đó làm gì có acid Hcl và thuốc trợ hàn?

                                Cái khó bó cái...
                                19-02-2025, 23:05
                              Đang tải...
                              X