打印

处女贴 诚信请教

[复制链接]
5406|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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窗口还是有问题  观察不了变量

1.png (18.38 KB )

1.png

使用特权

评论回复
5
ac3225020|  楼主 | 2013-3-24 16:20 | 只看该作者
上面图里hk写错了 改成m还是一样无法观察

使用特权

评论回复
6
yewuyi| | 2013-3-25 09:28 | 只看该作者
1、在delay函数前后各加一个空操作指令,然后在这两个空指令上设置断点,然后看从第一个断点执行到第二个断点的时间是否符合即可。
2、基本常识:使用C语言编写代码时,在进入main()函数时都会先执行一个隐藏的初始化RAM等代码,这个是编译器自动添加到你的应用代码中的,你当前的方式,必然将这个隐藏代码的执行时间带入了STOPWATCH了

使用特权

评论回复
7
yklstudent| | 2013-3-25 12:58 | 只看该作者
我试了下可以的啊 PICC18--9.80版本
要不楼主再去官网下个最新的
或者直接用X8也是一样的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ac3225020 + 1 赞一个!
8
ac3225020|  楼主 | 2013-3-27 09:02 | 只看该作者
我去下了最新版本 确实可以  谢谢楼上两位 十分感谢

使用特权

评论回复
9
兰天白云| | 2013-3-28 09:26 | 只看该作者
按6楼的操作就可以了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝