首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MCC18延迟,48 MCC18,18F87J50

MCC18延迟,48 MCC18,18F87J50
EN

Stack Overflow用户
提问于 2009-12-25 18:47:27
回答 5查看 1.5K关注 0票数 1

如何为具有48 and晶体和MCC18编译器的PIC18f87J50编写延迟宏。延迟应该在我们身上。例如,我可以写: Delay_us(201)并真正得到201us延迟。

我现在所拥有的是:

代码语言:javascript
运行
复制
#define Delay_us(n) (Delay10TCYx(((n) * (uint16_t) 12 + 9) / 10))

在我的示波器里似乎不太对劲!:/

致以亲切的问候!

圣诞快乐!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-27 00:45:19

PIC将时钟除以4,因此对于48 The,每个操作码在0.0833us或12个周期内运行。我使用了MPLAB,输入了不同的us值,并在模拟器中签入,这样就得到了我所期望的周期数。调整函数的最好方法是查看组件或使用模拟器。

你可以像下面这样做,但是你必须为你的编译器调整函数调用。

代码语言:javascript
运行
复制
#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
}
票数 2
EN

Stack Overflow用户

发布于 2009-12-28 19:17:29

不准确的部分原因可能是计算传递给Delay10TCYx的值的表达式的计算结果。由于此表达式包含除法,因此控制器计算该值可能需要相当长的时间。

票数 2
EN

Stack Overflow用户

发布于 2009-12-25 19:09:40

MCC手册解释了创建延迟循环所涉及的非常简单的数学运算。您可以只实现自己的循环,而不是依赖于库延迟函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1960960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档