Arduino 软件定时器应用

本文介绍Arduino UNO的定时器使用,包括timer0、timer1和timer2的特性,以及如何通过软件实现精确定时。同时,深入探讨了FIFO结构在Arduino中的应用,包括初始化、数据读写及状态检查等操作。

Arduino UNO 有timer0、timer1、timer2三个定时器。delay(),millis()是用timer0实现的。timer0和timer2都是8位,timer1是16位。由于millis()函数会禁止中断,所以不能在ISR中使用。精确定时可以使用delayMicroseconds(),或者如下方法:

#define ddtick __asm__("nop\n\t");
#define dd4tick __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");
//the Macro dd4tick will delay 0.25us exactly on 16MHz Arduino
#define delayOneUs() {dd4tick;dd4tick;dd4tick;dd4tick;}

 

/*
 * fifo.h
 * 
*/
struct FIFO8 {
  unsigned char *buf;
  int p, q, size, free, flags;
};

/*
 * fifo.c
 *
*/
#define FLAGS_OVERRUN    0x0001

void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)
{
  fifo->size = size;
  fifo->buf = buf;
  fifo->free = size;
  fifo->flags = 0;
  fifo->p = 0;
  fifo->q = 0;
  return;
}

int fifo8_put(struct FIFO8 *fifo, unsigned char data)
{
  if (fifo->free == 0) {
    fifo->flags |= FLAGS_OVERRUN;
    return -1;
  }
  fifo->buf[fifo->p] = data;
  fifo->p++;
  if (fifo->p == fifo->size) {
    fifo->p = 0;
  }
  fifo->free--;
  return 0;
}

int fifo8_get(struct FIFO8 *fifo)
{
  int data;
  if (fifo->free == fifo->size) {
    return -1;
  }
  data = fifo->buf[fifo->q];
  fifo->q++;
  if (fifo->q == fifo->size) {
    fifo->q = 0;
  }
  fifo->free++;
  return data;
}

int fifo8_status(struct FIFO8 *fifo)
{
  return fifo->size - fifo->free;
}

/*
 * timer.h
 * 
*/
int timer1_counter,i;
struct TIMERCTL {
  unsigned int count;
  unsigned int timeout;
  struct FIFO8 *fifo;
  unsigned char data;
};
struct TIMERCTL timerctl;
struct FIFO8 timerfifo;
char timerbuf[8];
int intLock=0;

/*
 * timer.c
 * 
*/

/*uint8_t oldSREG = SREG;  //狀態寄存器(包括是否允許 Interrupt),也可以使用这个寄存器解决嵌套调用问题 */
void enterCritical(void){
  noInterrupts();
  return intLock++;
}
void exitCritical(void){
  if(--intLock<1){
    interrupts();
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值