使用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);
}
}
答案 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);
}
}
有关完整示例,请参阅