Embedded MCC18中的延迟,48Mhz,18F87J50
如何为带有48MHz晶体的PIC18F87J50编写延迟宏 以及MCC18的编译程序。延误应该在美国。例如,我可以写:Delay_us(201) 真的让我们耽搁了 我现在得到的是: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手册解释了创建延迟循环所涉及
#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)谢谢你的评论!依赖库不好吗?谢谢你的评论!依赖库不好吗?我发现这更准确!!:)我发现这更准确!!:)如果在此延迟期间有中断会发生什么?如果在此延迟期间有中断会发生什么?