在msp430上重置计时器

时间:2016-03-22 09:21:55

标签: c timer reset msp430

使用CCS,嵌入式编程,MSP430F63736A

在我的应用中,我使用定时器A来切换LED(开/关)不同的时间。

例如: LED开启 - 0.5秒 Led是OFF-3秒

当达到寄存器TA1CCR0中的值时,我需要复位定时器。这些时间(0.5 s和3 s)位于寄存器TA1CCR0中。问题是,如果我将寄存器TA1CCR0的值从0.5秒更改为3秒,它将从0.5秒计算到3秒。我需要一个完整的3秒,所以我需要一个重置计时器。

这是我切换LED的中断程序

    if (P4OUT == 0x00)
    {

        P4OUT ^= BIT6; // LED ON
        TA1CCR0 = (sekunda*t1);  //t1- 3 s.... pc 2s
    }

    else
    {

        P4OUT = 0x00;
        TA1CCR0 = (sekunda*t2);
    }
}

2 个答案:

答案 0 :(得分:0)

您使用的是哪种计数器模式?您需要通过写入package com.stepnetwork.iot.apsclient.application; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; /** * Created by sam on 3/22/16. */ public class DtuClient extends Thread { private static final String HOST = "192.168.54.36"; private static final int PORT = 30080; private EventLoopGroup workerGroup; private String dtuCode; public DtuClient(String dtuCode, EventLoopGroup workerGroup) { this.dtuCode = dtuCode; this.workerGroup = workerGroup; } public void run() { Bootstrap bootstrap = new Bootstrap(); // (1) try { bootstrap.group(workerGroup); // (2) bootstrap.channel(NioSocketChannel.class); // (3) bootstrap.option(ChannelOption.SO_KEEPALIVE, true); // (4) bootstrap.handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new MyClientHandler()); } }); ChannelFuture feature = bootstrap.connect(HOST, PORT).sync(); feature.addListener((future) -> { System.out.println(dtuCode + " connected to server"); Channel channel = feature.channel(); ByteBuf buffer = Unpooled.buffer(256); buffer.writeBytes(dtuCode.getBytes()); channel.writeAndFlush(buffer); }); feature.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("completed"); } } 寄存器来设置模式。模式是:

TA1CTL

&#34;连续&#34;模式通常是最常用的模式。它会计时直到定时器寄存器溢出,然后从零重新开始计数。如果启用了它,连续添加到CCR,而不是将其设置为间隔值:

#define MC_0                (0x0000)  /* Timer A mode control: 0 - Stop */
#define MC_1                (0x0010)  /* Timer A mode control: 1 - Up to CCR0 */
#define MC_2                (0x0020)  /* Timer A mode control: 2 - Continuous up */
#define MC_3                (0x0030)  /* Timer A mode control: 3 - Up/Down */

你也可以使用&#34; up&#34;模式。在这种情况下,计时器计数器应在达到CCR后自动重置为零。如果您在ISR中修改CCR,然后显然不会发生此重置,则可以通过减去最短周期的值来修改定时器计数器寄存器(TA1CCR0 += (sekunda*t1); TAR)。不要只是将定时器寄存器设置为零,因为它通常不是一个好的编码实践:它会在ISR调用偶尔被延迟的情况下打开定时误差累积的大门(例如,因为某些其他中断执行多个滴答)

答案 1 :(得分:0)

在你的ISR中为TA1CCR0添加一个偏移而不是重置它:

假设您希望在第一次中断后延迟1秒,并且让他们说生成1秒延迟,计时器必须计数到50000.所以您需要在ISR中做的是TA1CCR0 + = 50000。

在你的情况下:

if (P4OUT == 0x00)
{

    P4OUT ^= BIT6; // LED ON
    TA1CCR0    +=    (sekunda*t1);  //t1- 3 s.... pc 2s
}

else
{

    P4OUT = 0x00;
    TA1CCR0    +=    (sekunda*t2);
}

}

有关完整示例,请参阅