Embedded MCC18中的延迟,48Mhz,18F87J50

Embedded MCC18中的延迟,48Mhz,18F87J50,embedded,delay,pic,pic18,Embedded,Delay,Pic,Pic18,如何为带有48MHz晶体的PIC18F87J50编写延迟宏 以及MCC18的编译程序。延误应该在美国。例如,我可以写:Delay_us(201) 真的让我们耽搁了 我现在得到的是: #define Delay_us(n) (Delay10TCYx(((n) * (uint16_t) 12 + 9) / 10)) 而且在我的示波器上似乎不正确/ 亲切的问候 圣诞快乐 MCC手册解释了创建延迟环路所涉及的非常简单的数学。您可以实现自己的循环,而不是依赖库延迟函数。MCC手册解释了创建延迟循环所涉及

如何为带有48MHz晶体的PIC18F87J50编写延迟宏 以及MCC18的编译程序。延误应该在美国。例如,我可以写:Delay_us(201) 真的让我们耽搁了

我现在得到的是:

#define Delay_us(n) (Delay10TCYx(((n) * (uint16_t) 12 + 9) / 10))
而且在我的示波器上似乎不正确/

亲切的问候


圣诞快乐

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

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

我发现这使我的延迟更加准确:

void Delay_uS(byte uSec) {

   do {
       Delay1TCY();            // 1
       Delay1TCY();            // 1
       Delay1TCY();            // 1
       Delay1TCY();            // 1
       Nop();                        // 1
       Nop();                        // 1
       Nop();                        // 1
       ClrWdt();                        // 1; Clear the WDT
       } while(--uSec);        // 3
}
关于这一点还有其他想法或答复吗


感谢Dario G在。。。。另一个论坛;)

我发现这使我的延迟更加准确:

void Delay_uS(byte uSec) {

   do {
       Delay1TCY();            // 1
       Delay1TCY();            // 1
       Delay1TCY();            // 1
       Delay1TCY();            // 1
       Nop();                        // 1
       Nop();                        // 1
       Nop();                        // 1
       ClrWdt();                        // 1; Clear the WDT
       } while(--uSec);        // 3
}
关于这一点还有其他想法或答复吗


感谢Dario G在。。。。另一个论坛;)

PIC将时钟除以4,因此对于48Mhz,每个操作码以0.0833us或每us 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
}
#定义开销(2)
无效延迟时间(uint8时间)
{

如果(usPIC将时钟除以4,那么对于48Mhz,每个操作码以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
}
#定义开销(2)
无效延迟时间(uint8时间)
{

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

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

我听说这会更准确,但我的示波器只会给我其他值。我在编译时会做些什么吗?我没有在最高lvl下进行编译?

#define CONST_RANGE(min, val, max) (sizeof(char (*)[(val) >= (min) && (val) <= (max) ? +1 : -1]), (val))
#define Delay_ms(n) Delay1KTCYx(CONST_RANGE(1, (n) * 12L, 255))
#define Delay_us(n) Delay10TCYx(CONST_RANGE(1, ((n) * 12L + 6) / 10, 255))

#define CONST_RANGE(min,val,max)(sizeof(char(*)[(val)>=(min)&&(val)&&(val)我听说这会更准确,但我的示波器只会给我其他正确的值。我在编译时会有什么事做吗?我没有在最高的lvl下做

#define CONST_RANGE(min, val, max) (sizeof(char (*)[(val) >= (min) && (val) <= (max) ? +1 : -1]), (val))
#define Delay_ms(n) Delay1KTCYx(CONST_RANGE(1, (n) * 12L, 255))
#define Delay_us(n) Delay10TCYx(CONST_RANGE(1, ((n) * 12L + 6) / 10, 255))

#define CONST_RANGE(min,val,max)(sizeof(char(*)[(val)>=(min)&&(val)谢谢你的评论!依赖库不好吗?谢谢你的评论!依赖库不好吗?我发现这更准确!!:)我发现这更准确!!:)如果在此延迟期间有中断会发生什么?如果在此延迟期间有中断会发生什么?