6274|29

135

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

又遇到问题了,关于PIC24FJ64GA004时钟震荡的问题 [复制链接]

 
PIC24FJ64GA004单片机时钟选择的改如何设置呢?我目前编写了个程序。用软件仿真SIM进行仿真延时函数        delay1s();延时的时间是160多ms.但是在proteus仿真软件上仿真的效果却是延时了3秒左右。LED亮3秒熄灭3秒左右循环。不知道哪里出了问题。老铁们帮忙看看。谢谢了。
附上程序和仿真图。

微信图片_20180901191351.png (47.5 KB, 下载次数: 0)

微信图片_20180901191351.png

微信图片_20180901191359.png (48.99 KB, 下载次数: 0)

微信图片_20180901191359.png

最新回复

现在一般会用xc8、xc16了吧  详情 回复 发表于 2018-9-6 22:08
点赞 关注(1)
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
现在的XC16中不是有延时函数了吗?只要设置好时钟就可以用

点评

我用的是c30编译器。我这里是什么出现问题了  详情 回复 发表于 2018-9-1 20:19
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
dcexpert 发表于 2018-9-1 20:01
现在的XC16中不是有延时函数了吗?只要设置好时钟就可以用

我用的是c30编译器。我这里是什么出现问题了
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

4
 
还有你这个定义我有点看不太懂哦

#define MACRO_CONCAT2_EXPAND(a, b)  a ## b
#define MACRO_CONCAT2(a, b)         MACRO_CONCAT2_EXPAND(a, b)
#define MACRO_CONCAT3_EXPAND(a, b, c) a ## b ## c
#define MACRO_CONCAT3(a, b, c)      MACRO_CONCAT3_EXPAND(a, b, c)

#define MACRO_ARG21(a, b)           a
#define MACRO_ARG22(a, b)           b

#define PIN_DIR(pin, DIR)            MACRO_CONCAT3(_TRIS, MACRO_ARG21(pin), MACRO_ARG22(pin)) = DIR
#define PIN_OUT(pin, OUT)            MACRO_CONCAT3(_LAT, MACRO_ARG21(pin), MACRO_ARG22(pin)) = OUT
#define PIN_IN(pin)                  MACRO_CONCAT3(_R, MACRO_ARG21(pin), MACRO_ARG22(pin))

点评

这个是宏的一种特殊用法,就是将两个内容合成一个,在使用一系列有规律的寄存器时非常有用,在很多程序里面也很常见的。 特别是希望程序自动适应不同型号的MCU时,使用这个方法自动配置对应的寄存器。 C30中也  详情 回复 发表于 2018-9-1 20:37
 
 
 

回复

1万

帖子

25

TA的资源

版主

5
 
werjufour 发表于 2018-9-1 20:20
还有你这个定义我有点看不太懂哦

#define MACRO_CONCAT2_EXPAND(a, b)  a ## b
#define MACRO_CONCAT2( ...

这个是宏的一种特殊用法,就是将两个内容合成一个,在使用一系列有规律的寄存器时非常有用,在很多程序里面也很常见的。

特别是希望程序自动适应不同型号的MCU时,使用这个方法自动配置对应的寄存器,对程序移植很有帮助。

C30中也有延时函数的,好像是__delay_ms(),要包含一个头文件才行。好久不用PIC单片机,有点记不清了。C30可以换成XC16,支持的功能更多。

点评

这种宏定义用法能适用很多MCU吗,我看不懂都是些什么意思  详情 回复 发表于 2018-9-1 21:42
你这种宏定义第一次看见,所以看了都蒙圈了,一点都不知道啥意思。 我刚才哪个程序用c30怎么有解决的办法么  详情 回复 发表于 2018-9-1 20:41
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

6
 
dcexpert 发表于 2018-9-1 20:37
这个是宏的一种特殊用法,就是将两个内容合成一个,在使用一系列有规律的寄存器时非常有用,在很多程序里 ...

你这种宏定义第一次看见,所以看了都蒙圈了,一点都不知道啥意思。
我刚才哪个程序用c30怎么有解决的办法么

点评

为什么我实际的效果跟我软件上面的延时不一样呢?  详情 回复 发表于 2018-9-1 20:42
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

7
 
werjufour 发表于 2018-9-1 20:41
你这种宏定义第一次看见,所以看了都蒙圈了,一点都不知道啥意思。
我刚才哪个程序用c30怎么有解决的办 ...

为什么我实际的效果跟我软件上面的延时不一样呢?

点评

哪里不同了? 如果只是延时,先在程序中定义_XTAL_FREQ,它代表系统时钟频率 #ifndef _XTAL_FREQ #define _XTAL_FREQ 4000000L #endif 然后用 __delay_ms() 或者 __delay_us() 就可以进行延时了。  详情 回复 发表于 2018-9-2 15:07
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

8
 
dcexpert 发表于 2018-9-1 12:37
这个是宏的一种特殊用法,就是将两个内容合成一个,在使用一系列有规律的寄存器时非常有用,在很多程序里 ...

这种宏定义用法能适用很多MCU吗,我看不懂都是些什么意思

点评

大部分C编译器都支持的。  详情 回复 发表于 2018-9-2 14:54
 
个人签名刻苦学习,共同进步
 
 

回复

1万

帖子

25

TA的资源

版主

9
 
迈尔风随 发表于 2018-9-1 21:42
这种宏定义用法能适用很多MCU吗,我看不懂都是些什么意思

大部分C编译器都支持的。

点评

比如说: #define IO_OUTPUT 0 #define IO_INPUT 1 #define PIN_DIR(pin, DIR) MACRO_CONCAT3(_TRIS, MACRO_ARG21(pin), MACRO_ARG22(pin)) = DIR 在程序中,定义了LED的引脚: #defin  详情 回复 发表于 2018-9-2 15:02
 
 
 

回复

1万

帖子

25

TA的资源

版主

10
 
dcexpert 发表于 2018-9-2 14:54
大部分C编译器都支持的。

比如说:

#define IO_OUTPUT   0
#define IO_INPUT    1

#define PIN_DIR(pin, DIR)            MACRO_CONCAT3(_TRIS, MACRO_ARG21(pin), MACRO_ARG22(pin)) = DIR

在程序中,定义了LED的引脚:

#define LED1        A, 1


初始化时设置:
PIN_DIR(LED1, IO_OUTPUT)

它的实际结果就是
_TRISA1 = 1

这样的用法看起来很复杂,但是好处是可以让程序有较好的移植性和可读性,在不同的C编译器和不同单片机上更方便的移植代码。

更详细的解释可以参考我在《AVR单片机应用专题精讲》一书中的说明和举例。

点评

还是看不明白,我去找《AVR单片机应用专题精讲》看一下  详情 回复 发表于 2018-9-2 16:53
 
 
 

回复

1万

帖子

25

TA的资源

版主

11
 
本帖最后由 dcexpert 于 2018-9-2 15:09 编辑
werjufour 发表于 2018-9-1 20:42
为什么我实际的效果跟我软件上面的延时不一样呢?

哪里不同了?

如果只是延时,先在程序中定义_XTAL_FREQ,它代表系统时钟频率

#ifndef _XTAL_FREQ
#define _XTAL_FREQ       4000000L
#endif

然后用 __delay_ms() 或者 __delay_us() 就可以进行延时了。注意前面是两个下划线,不要写错了。
如果延时效果不同,说明时钟设置或者默认配置字不对,请参考手册设置。为了保证效果,可以将配置字写在程序中,而不是通过编程器设置(不同的PIC单片机配置字是不同的)。如:

#pragma config FOSC = INTOSC    // Oscillator Selection bits (INTOSC oscillator: CLKIN function disabled)


点评

首先要谢谢你。就是我在MPLAB SIM软件仿真里跑表显示的是300MS左右,但是在Proteus仿真里面却要延时3s左右。 自带的延时函数延时__delay_ms() 这个函数我不知道延时了多长时间。比如说要延时50ms 我系统时钟频率和  详情 回复 发表于 2018-9-2 22:29
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

12
 
dcexpert 发表于 2018-9-2 07:02
比如说:

#define IO_OUTPUT   0
#define IO_INPUT    1

#define PIN_DIR(pin, DIR)            M ...

还是看不明白,我去找《AVR单片机应用专题精讲》看一下

点评

如果找到了,发给我看下。我实在是看不太懂  详情 回复 发表于 2018-9-2 22:31
 
个人签名刻苦学习,共同进步
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

13
 
dcexpert 发表于 2018-9-2 15:07
哪里不同了?

如果只是延时,先在程序中定义_XTAL_FREQ,它代表系统时钟频率

#ifndef _XTAL_FREQ
...

首先要谢谢你。就是我在MPLAB SIM软件仿真里跑表显示的是300MS左右,但是在Proteus仿真里面却要延时3s左右。
自带的延时函数延时__delay_ms() 这个函数我不知道延时了多长时间。比如说要延时50ms 我系统时钟频率和实际参数填多少?

点评

时钟当然要设置为实际频率,这样才能准确计算时间。  详情 回复 发表于 2018-9-3 12:26
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

14
 
迈尔风随 发表于 2018-9-2 16:53
还是看不明白,我去找《AVR单片机应用专题精讲》看一下

如果找到了,发给我看下。我实在是看不太懂

点评

我网上找了一下,没有电子档可以看,这是一本也版的书,只能买书来看才行  详情 回复 发表于 2018-9-3 00:25
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

15
 
werjufour 发表于 2018-9-2 14:31
如果找到了,发给我看下。我实在是看不太懂

我网上找了一下,没有电子档可以看,这是一本也版的书,只能买书来看才行

点评

层主不是作者么?  详情 回复 发表于 2018-9-3 18:27
 
个人签名刻苦学习,共同进步
 
 

回复

1万

帖子

25

TA的资源

版主

16
 
werjufour 发表于 2018-9-2 22:29
首先要谢谢你。就是我在MPLAB SIM软件仿真里跑表显示的是300MS左右,但是在Proteus仿真里面却要延时3s左 ...

时钟当然要设置为实际频率,这样才能准确计算时间。

点评

大侠,这两个延时函数__delay_ms() 或者 __delay_us(要怎么用呢? 我要延时50ms 与10us该怎么写呢  详情 回复 发表于 2018-9-3 18:34
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

17
 
迈尔风随 发表于 2018-9-3 00:25
我网上找了一下,没有电子档可以看,这是一本也版的书,只能买书来看才行

层主不是作者么?
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

18
 
dcexpert 发表于 2018-9-3 12:26
时钟当然要设置为实际频率,这样才能准确计算时间。

大侠,这两个延时函数__delay_ms() 或者 __delay_us(要怎么用呢?
我要延时50ms 与10us该怎么写呢

点评

参数就是延时时间啊,__delay_ms(50)就50ms。当然因为是使用代码延时而不是通过定时器,所以精度不是非常高。  详情 回复 发表于 2018-9-3 21:57
 
 
 

回复

1万

帖子

25

TA的资源

版主

19
 
werjufour 发表于 2018-9-3 18:34
大侠,这两个延时函数__delay_ms() 或者 __delay_us(要怎么用呢?
我要延时50ms 与10us该怎么写呢

参数就是延时时间啊,__delay_ms(50)就50ms。当然因为是使用代码延时而不是通过定时器,所以精度不是非常高。

点评

我使用的晶振分别是8M、16M、32M 时候。这个延时函数__delay_ms(50),延时的时间都是50ms么?  详情 回复 发表于 2018-9-5 21:30
我使用的晶振分别是8M、16M、32M 时候。这个延时函数__delay_ms(50),延时的时间都是50ms么?  详情 回复 发表于 2018-9-5 21:30
 
 
 

回复

135

帖子

1

TA的资源

一粒金砂(中级)

20
 
dcexpert 发表于 2018-9-3 21:57
参数就是延时时间啊,__delay_ms(50)就50ms。当然因为是使用代码延时而不是通过定时器,所以精度不是非常 ...

我使用的晶振分别是8M、16M、32M 时候。这个延时函数__delay_ms(50),延时的时间都是50ms么?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表