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();

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

被折叠的 条评论
为什么被折叠?



