大家好、我 正在 开发红外发射器。
目前、我正在尝试将 MSP430FR4133板与给定的 TI 库结合使用。
我有两个问题;
代码如下所示、
unsigned char send_data[8]={0xFF、0xFF、0xFF、0xFF、0x10、0xEF、0xEB、0x14};发送此数据但接收 未知数据。
请听听我的解决方案。
2.此代码需要任何库或驱动程序?
#include "msp430.h"
unsigned char IR_code;
unsigned char IR_flag;
unsigned char IR_stop;
unsigned char byte_cnt;
unsigned int bit_sel;
unsigned char *send_addr;
unsigned char send_data[8]={0xFF,0xFF,0xFF,0xFF,0x10,0xEF,0xEB,0x14}; // Unsigned data will displayed
{
// Watchdog timer works as default setting
WDTCTL = WDTPW + WDTHOLD;
Init_GPIO();
Init_Clock();
IR_stop = 1; //disable IR emitter
while(1)
{
// clear the flag and counter
IR_flag = 0;
byte_cnt = 0;
bit_sel = 0;
if(IR_stop == 0)
{
// Configure IR output pin
P1SEL0|= BIT0; // use internal IR modulator
// disable Port1 & Port2 interrupt during IR emitting
P1IE = 0;
P2IE = 0;
// IR_code = scan_key(); // scan the keypad
// Configure IR modulation: ASK
SYSCFG1 = IRDSSEL + IREN;
TA1CCTL0 = CCIE;
TA1CCTL2 = OUTMOD_7; // output mode: reset/set
TA0CCTL2 = OUTMOD_7; // output mode: reset/set
// 38kHz 1/4 duty-cycle carrier waveform length setting
TA0CCR0 = 104;
TA0CCR2 = 25;
TA1CCR0 = 640; //the initial time of TA0 should be longer than TA1
TA1CCR2 = 320;
// set timer operation mode
TA0CTL = TASSEL_2 + MC_1 + TACLR; //SMCLK, UP mode
TA1CTL = TASSEL_2 + MC_1 + TACLR; //SMCLK, UP mode
// write button number into buffer
//send_data[2] = IR_code;
//send_data[3] = ~IR_code;
send_addr = &send_data[0];
/*while (1) {
if (buttonPressed) {
buttonPressed = 0;
if (!irDataValid) {
// start IR transmission
transmitCode(send_data);
}
}*/
// stop until the end of IR code
while(IR_stop == 0);
TA0CCTL0 = 0;
TA0CCTL2 = 0;
TA0CTL = 0;
TA0CCR0 = 0;
TA0CCR2 = 0; //disable timer0
TA1CCTL0 = 0;
TA1CCTL2 = 0;
TA1CTL = 0;
TA1CCR0 = 0;
TA1CCR2 = 0; //disable timer1
P1IE |= (BIT3 + BIT4 + BIT5); //enable GPIO interrupt
P2IE |= BIT7;
}
// __bis_SR_register(LPM3_bits | GIE); //enter low power mode
IR_stop = 0; // enable IR code emitting
}
}
//********Timer1 interrupt ISR*********//
#pragma vector = TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR (void)
{
switch( TA1IV )
{
case 0:
{
if(IR_flag)
{
IR_stop=1; // stop IR modulator
TA1CCTL0 &= ~CCIE; // disable timer_A0 interrupt
}
if((byte_cnt==0)&& (bit_sel==0)) // leading pulse burst of IR code
{
TA1CCR0 = 53999; // 9ms high
TA1CCR2 = 35999; // 4.5ms low
byte_cnt++; // byte counter
bit_sel++; // bit counter
}
else if((byte_cnt>= 5)&& (bit_sel==1)) // the end of IR code
{
TA1CCR0 = 2249; //0.562ms pulse burst to show the end
TA1CCR2 = 2249;
IR_flag=1;
}
else
{
if((*send_addr & bit_sel) == 0) // data "0"
{
TA1CCR0 = 4499; // 0.562ms high 0.562ms low
TA1CCR2 = 2249;
bit_sel<<=1;
}
else // data "1"
{
TA1CCR0 = 8999; // 0.562ms high 1.687ms low
TA1CCR2 = 2249;
bit_sel<<=1;
}
if(bit_sel>=256) // start a new byte
{
send_addr++;
byte_cnt++;
bit_sel=1;
}
}
break;
}
default: break;
}
}

