реклама на сайте
подробности

 
 
> Работа с IrDA
d7d1cd
сообщение Dec 15 2013, 13:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем. Возникла у меня задача написать самозагрузчик флешь памяти по инфракрасному порту. Микроконтроллер MSP430F249, однако сам передатчик IrDA подключен к выводам 19 (TX) и 15 (RX), то есть ни к одному из модулей USCI доступа нет.
Подскажите, возможно ли организовать обмен, не используя прерывания и таймер? Планируется написать программу самозагрузки, которая будет выполняться из RAM.

Сообщение отредактировал d7d1cd - Dec 15 2013, 13:23
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
d7d1cd
сообщение Dec 21 2013, 16:28
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Спасибо за подсказки. Буду пока изучать таймер. Но тема не закрыта. Как говорится, to be continued...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 26 2013, 14:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(d7d1cd @ Dec 21 2013, 19:28) *
Но тема не закрыта.

У кого как. В связи с появлением люминесцентных ламп, излучающих в ИК диапазоне я тему закрыл.
Выкладываю исходник "как есть".
Там какие-то мои макросы управления портами, спросите если будет интересно.
Да, одна неприятная особенность этого всего - необходимость работы вложенных прерываний, поэтому прочитайте про новые лампы еще раз и хорошенько подумайте..


Код
#define MaxBoudrate    115200

#define Boudrate    38400

#define    IrdaPeriod    (XT2CLK/Boudrate)        //32
#define    MinIrdaPeriod    (XT2CLK/MaxBoudrate)        //32

#define IrdaPulse    (MinIrdaPeriod*3/16)                //6


unsigned int irda_rx_mask=1;
unsigned int irda_tx_mask=1;
unsigned int irda_rx_data;
unsigned int irda_tx_data;

#define LastRxMask 0x200
#define LastTxMask 0x400

char irda_rx_byte;
char irda_rx_flag;


void SendByteViaIrda(char B)
{ OffFunction(IrdaRxInterrupt);
    irda_tx_data =    (((unsigned int)B)<<2)|0xFC01;
    TACTL = TASSEL_2 + TACLR + MC_0;        // Timer A counts SMCLK clocks continuos Stop
    TACCR2= IrdaPeriod-IrdaPulse-1;            // TA2 active    
    irda_tx_mask=1;
    TACCTL1 = 0;                                                // disable interrupt for receiving
    TACCTL0 = CCIE+CCIFG;                                // enable interrupt for transmittion
    TACCTL2 = OUTMOD_3;
    TACTL    |= MC_1;                                            // timer start to "UP" mode

    for (;;)
    {    if (irda_tx_mask>LastTxMask)    
        {    TACCTL0=0;
            InitIrdaReceiveMode();
            return;
        }
    }
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_modul0(void)
{    if (irda_tx_mask<=LastTxMask)
            irda_tx_mask=irda_tx_mask<<1;    
    else TACCTL0=0;                                            // no more interrupts
    
    if (irda_tx_data & irda_tx_mask)        OffFunction(CCTL2);
    else                    OnFunction(CCTL2);
}

void TimerAConfiguration(void)
{    __bic_SR_register OSCOFF;        
    TACTL = TASSEL_2 + TACLR + MC_0;    //    Timer A counts SMCLK clocks
    TACCTL0 = 0;                                            //    module 0 configuration, enable interrupt later
    TACCR0    = IrdaPeriod;                            //    period of timer overflow
    TACTL    |= MC_1;                                        //    timer start to "UP" mode
}



void InitIrdaReceiveMode(void)
{    P2IFG=0;
    P2IES=0x80;
    P2IE=0x80;
    TACCR0=IrdaPeriod-1;            // period
    TACCR1=IrdaPeriod/2;            // change mask
    TACCR2=IrdaPeriod+2;            // never happens
    irda_rx_data=0xffff;
    irda_rx_mask=0x0001;
    TACTL = TASSEL_2 + TACLR + MC_0;
    TACCTL1=CCIE;
    irda_rx_byte=0;
    P2IFG=0;
    P2IE=0x80;
}


#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA_modul2(void)
{        irda_rx_mask=irda_rx_mask<<1;
        if (irda_rx_mask==LastRxMask)
            {    irda_rx_byte=(char)(irda_rx_data>>1);
                TACTL = TASSEL_2 + TACLR + MC_0;
                irda_rx_data=0xffff;
                irda_rx_mask=0x0001;
                irda_rx_flag=1;
            }        
        TACCTL1 &= ~(unsigned int)CCIFG;    
}


#pragma vector=PORT2_VECTOR
__interrupt void IrdaRxPulse(void)
{ irda_rx_data&=~irda_rx_mask;
    TACTL|=    MC_1;    
    P2IFG=0;
}


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 14:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016