//****************************************************************************** // Coder on MSP430 for RC toy remote control (RX2/TX2 set). IR version // *replacing TX2 chip (in IR transmitter) with MSP430F20xx // // +3V ----------------- _|_ +3V // | | XIN|- X -- \ / // ----|RST | 32kHz (for cal.) --- LED (IR) // | XOUT|- X -- ___ | // ------------|P1.0 | -----|___|----- // SW1| ---------|P1.1 | |D R1 10 to 470 Ohms // \ | ------|P1.2 P1.4|_ _ _ _G|/ // | \ | ---|P1.3 | |\. T1 2N7000 (2N7002) // --- | \ | | | |S // --- | \ MSP430F20xx --- // --- |SW4 // --- SK_Lab 2019 // Thanks to Texas Instruments, Inc // Built with CCS Version: 7.4.0.x. Flash/FRAM = 946 bytes. RAM = 51 bytes. //****************************************************************************** #include char command=0; void try_to_choose (char a); void try_to_send (char b); int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer DCOCTL = 0x6C; // ~ 303kHz BCSCTL1 = 0x83; // ~ 303kHz BCSCTL2 |= DIVS_3; //SMCLK = MCLK/8 = 38 kHz P1OUT &= ~BIT4; // Set P1.4 output to 'Lo' (IR 'OFF') P1DIR |= BIT4; // Set P1.4 to output direction P1REN |= 0x0F; // P1.0,1,2,3 pullup resistors P1IE |= 0x0F; // P1.0,1,2,3 interrupt enabled P1IES |= 0x0F; // P1.0,1,2,3 interrupt on Hi/lo edge P1IFG &= ~0x0F; // P1.0,1,2,3 IFG cleared __bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/interrupt } //Next will happen if level at any of P1.0,1,2,3 has fallen level (button pressed) #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) { //Will stuck in this loop if you hold buttons pressed. while ((P1IN & 0x0F) != 0x0F) //Is any button stay pressed? { command = ((P1IN & 0x0F) ^ 0x0F); //Read buttons & convert to 0...15 try_to_choose (command); //Conversion & send } P1IFG &= ~0xF0; // P1.4 IFG cleared } //Choose the command (num. of pulses to transmit) vs button pressed; void try_to_choose (char a) { switch( a ) { case 0x01: try_to_send (58); break; //0001 - 58 case 0x02: try_to_send (40); break; //0010 - 40 case 0x03: try_to_send (52); break; //0011 - 52 case 0x04: try_to_send (10); break; //0100 - 10 case 0x05: try_to_send (28); break; //0101 - 28 case 0x08: try_to_send (64); break; //1000 - 64 case 0x0A: try_to_send (46); break; //1010 - 46 case 0x0C: try_to_send (34); break; //1100 - 34 } } //Generates 4 pulses as "start" and amount of DATA pulses, as in variable 'b'. void try_to_send (char b) { char counter_st_pls = 4; //Will be 4 "Start" pulses while (counter_st_pls) //loop, 4 times { __delay_cycles(455); P1SEL |= 0x10; //After "Space" time (1.5mS/3.3uS=455) 38kHz ON __delay_cycles(152); P1SEL &= ~0x10; //Await "Pulse" time (0.5mS/3.3uS=152) 38kHz OFF counter_st_pls--; } while (b) //Will be 'b' "DATA" pulses w/"Spaces" { __delay_cycles(152); P1SEL |= 0x10; //The same, "Space", 0.5mS __delay_cycles(152); P1SEL &= ~0x10; //The same, "Pulse", 0.5mS b--; } P1SEL &= ~0x10; //Turns off 38kHz (SMCLK=MCLK/8) on P1.4 and leaves pin in Lo } /* P.S. For a 38kHz carrier, we use SMCLK that can be sent to P1.4 directly. /******************************************************************************/