处女贴 诚信请教

[复制链接]
5921|8
 楼主| ac3225020 发表于 2013-3-24 11:42 | 显示全部楼层 |阅读模式
本帖最后由 ac3225020 于 2013-3-24 11:43 编辑

小弟刚刚接触PIC单片机  之前学习PIC16F时 pic.h 头文件里自带了延时程序__delay_ms延时函数  现在用PICC18时 只在sample里找到了相关的delay函数 添加进去以后频率设成4MHZ 用stopwatch观察发现延时非常不准

试了一下 一般的话实际延时时间是程序上的2.4倍   我想请教用C语言怎么编写一个精确度还可以的延时函数(不用定时器)
另外一个问题就是我用watch窗口怎么显示局部变量的值 全局变量可以显示我用的是MPLAB 8.66 和 PICC 8.35PL3  
小弟初学  多多包涵

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yklstudent 发表于 2013-3-24 14:02 | 显示全部楼层
本帖最后由 yklstudent 于 2013-3-24 14:22 编辑

hitech picc9.80的sample文件夹下 哪里有delay函数?
我只看到include文件夹下有delays.h头文件

#ifndef __DELAYS_H
#define __DELAYS_H

#if defined(__18CXX) || defined(_PLIB)

/* C18 cycle-count delay routines. */

/* Delay of exactly 1 Tcy */
#define Delay1TCY() _delay(1)

/* Delay of exactly 10 Tcy */
#define Delay10TCY() _delay(10)

/* Delay10TCYx
* Delay multiples of 10 Tcy
* Passing 0 (zero) results in a delay of 2560 cycles.
*/
void Delay10TCYx(unsigned char);

/* Delay100TCYx
* Delay multiples of 100 Tcy
* Passing 0 (zero) results in a delay of 25,600 cycles.
*/
void Delay100TCYx(unsigned char);

/* Delay1KTCYx
* Delay multiples of 1000 Tcy
* Passing 0 (zero) results in a delay of 256,000 cycles.
*/
void Delay1KTCYx(unsigned char);

/* Delay10KTCYx
* Delay multiples of 10,000 Tcy
* Passing 0 (zero) results in a delay of 2,560,000 cycles.
*/
void Delay10KTCYx(unsigned char);

#endif

#endif
这些就是内容 不知道楼主使用其它的版本
还有PICC18头文件也有延时函数
当要先宏定义#define _XTAL_FREQ
才可以调用有关的延时函数
#ifdef _OMNI_CODE_
/****************************************************************/
/* Built-in delay routine                                        */
/****************************************************************/
#pragma inline(_delay)
extern void _delay(unsigned long);
#pragma inline(_delaywdt)
extern void _delaywdt(unsigned long);
#pragma inline(_delay3)
extern void _delay3(unsigned char);
// NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#define __delaywdt_us(x) _delaywdt((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delaywdt_ms(x) _delaywdt((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

 楼主| ac3225020 发表于 2013-3-24 15:11 | 显示全部楼层
我是说在PICC里有延时函数  但是在PICC18里没有找到类似的  不知道你下面的那个是在哪个头文件里面找到的  我在pic18.h 和pic18fxx2.h 中都没有找到  而且我试了一下 定义 _XTAL_FREQ
后使用__delay_ms()函数是无法编译的   当然这在PICC中是可行的  
 楼主| ac3225020 发表于 2013-3-24 16:11 | 显示全部楼层
本帖最后由 ac3225020 于 2013-3-24 16:19 编辑

我新下了一个PICC18  9.65版本 确实新添加了delay函数 而且测试了非常准  但是现在watch窗口还是有问题  观察不了变量

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| ac3225020 发表于 2013-3-24 16:20 | 显示全部楼层
上面图里hk写错了 改成m还是一样无法观察
yewuyi 发表于 2013-3-25 09:28 | 显示全部楼层
1、在delay函数前后各加一个空操作指令,然后在这两个空指令上设置断点,然后看从第一个断点执行到第二个断点的时间是否符合即可。
2、基本常识:使用C语言编写代码时,在进入main()函数时都会先执行一个隐藏的初始化RAM等代码,这个是编译器自动添加到你的应用代码中的,你当前的方式,必然将这个隐藏代码的执行时间带入了STOPWATCH了
yklstudent 发表于 2013-3-25 12:58 | 显示全部楼层
我试了下可以的啊 PICC18--9.80版本
要不楼主再去官网下个最新的
或者直接用X8也是一样的

评分

参与人数 1威望 +1 收起 理由
ac3225020 + 1 赞一个!

查看全部评分

 楼主| ac3225020 发表于 2013-3-27 09:02 | 显示全部楼层
我去下了最新版本 确实可以  谢谢楼上两位 十分感谢
兰天白云 发表于 2013-3-28 09:26 | 显示全部楼层
按6楼的操作就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部