如何为具有48 and晶体和MCC18编译器的PIC18f87J50编写延迟宏。延迟应该在我们身上。例如,我可以写: Delay_us(201)并真正得到201us延迟。
我现在所拥有的是:
#define Delay_us(n) (Delay10TCYx(((n) * (uint16_t) 12 + 9) / 10))
在我的示波器里似乎不太对劲!:/
致以亲切的问候!
圣诞快乐!
发布于 2009-12-27 00:45:19
PIC将时钟除以4,因此对于48 The,每个操作码在0.0833us或12个周期内运行。我使用了MPLAB,输入了不同的us值,并在模拟器中签入,这样就得到了我所期望的周期数。调整函数的最好方法是查看组件或使用模拟器。
你可以像下面这样做,但是你必须为你的编译器调整函数调用。
#define OVERHEAD (2)
void Delay_us(uint8_t us)
{
if ( us <= OVERHEAD ) return; // prevent underflow
us -= OVERHEAD ; // overhead of function call in us.
Nop(); // 1 extra overhead to make function overhead an even us.
Nop(); // 1 add or remove Nop's as necessary.
Nop(); // 1
//Nop(); // 1
//Nop(); // 1
//Nop(); // 1
//Nop(); // 1
//Nop(); // 1
//Nop(); // 1
//Nop(); // 1
//Nop(); // 1
//Nop(); // 1
do // loop needs to be 12 cycles so each cycle is 1us.
{
Nop(); // 1
Nop(); // 1
Nop(); // 1
Nop(); // 1
Nop(); // 1
Nop(); // 1
Nop(); // 1
Nop(); // 1
ClrWdt(); // 1
} while(--us); // 3
}
发布于 2009-12-28 19:17:29
不准确的部分原因可能是计算传递给Delay10TCYx的值的表达式的计算结果。由于此表达式包含除法,因此控制器计算该值可能需要相当长的时间。
发布于 2009-12-25 19:09:40
MCC手册解释了创建延迟循环所涉及的非常简单的数学运算。您可以只实现自己的循环,而不是依赖于库延迟函数。
https://stackoverflow.com/questions/1960960
复制相似问题