snail0204 发表于 2009-6-25 11:01:17

关于中断方式发送的问题

看了TXC位的定义我想到,如果允许发送,允许产生发送结束中断,全局中断使能,此时程序会不会不停的进入发送中断服务程序?http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_455926.jpg
(原文件名:QQ截图未命名.jpg)

snail0204 发表于 2009-6-25 11:33:08

/**//*发送单个字符*/
void put_c(char c)
...{
    while (tx_counter == TX_BUFFER_SIZE);   //发送数据队列中还有数据没有发送完,等待
    cli();
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))    //若发送数据队列有数据或者数据寄存器UDR非空时执行(因为队列先进先出的原因,所以,c要放进非空的发送数据队列里面)
       ...{
         tx_buffer=c;
         if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
         ++tx_counter;
       }
    else
         UDR=c;
    sei();
}
//发送中断

ISR(USART_TXC_vect)
{
    if (tx_counter)
    {
         --tx_counter;
         UDR=tx_buffer;
         if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
    };
}
这段程序我觉得会使得程序总是在进入接收中断的服务子程序,因为一出中断TXC就置1了,就又进入中断。。不解,是不是我什么地方理解错了

snoopyzz 发表于 2009-6-25 11:39:15

so easy,
空闲中断中,在检测到发送缓冲区的东东都发送后,禁止空闲中断
发送函数中打开空闲中断....
========================
下面是我写的
//------                发送寄存器空闲中断                ------//
#pragma interrupt_handler        USART_DataSendIdle:iv_USART_UDRE

void USART_DataSendIdle()
{// 当发送空闲时,将缓冲区数据依次发送
       
        if( Comm.Write.IsOpen )
        {
                UDR = Comm.Write.Buffer;
        }
        if( Comm.Write.EndPos==Comm.Write.CurPos )
        {// 禁止发送空闲中断
                Comm.Write.IsOpen = false;
                Interrupt_UDR_Disabled();
                return;
        }
}

ar3000a 发表于 2012-12-5 02:31:41

if (tx_counter)干啥用的? 晕死了。
页: [1]
查看完整版本: 关于中断方式发送的问题