社区导航

 
查看: 435|回复: 29

[求助] 又遇到问题了,关于PIC24FJ64GA004时钟震荡的问题

  [复制链接]

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-9-1 19:25:08 | 显示全部楼层 |阅读模式
PIC24FJ64GA004单片机时钟选择的改如何设置呢?我目前编写了个程序。用软件仿真SIM进行仿真延时函数        delay1s();延时的时间是160多ms.但是在proteus仿真软件上仿真的效果却是延时了3秒左右。LED亮3秒熄灭3秒左右循环。不知道哪里出了问题。老铁们帮忙看看。谢谢了。
附上程序和仿真图。
此帖出自PIC单片机论坛
微信图片_20180901191359.png
微信图片_20180901191351.png


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-9-1 20:01:50 | 显示全部楼层
现在的XC16中不是有延时函数了吗?只要设置好时钟就可以用

点评

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


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-1 20:19:42 | 显示全部楼层
dcexpert 发表于 2018-9-1 20:01
现在的XC16中不是有延时函数了吗?只要设置好时钟就可以用

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


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-1 20:20:11 | 显示全部楼层
还有你这个定义我有点看不太懂哦

#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


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-9-1 20:37:48 | 显示全部楼层
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


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

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

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

点评

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


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-1 20:42:02 | 显示全部楼层
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


回复

使用道具 举报

495

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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

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

点评

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


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-9-2 14:54:29 | 显示全部楼层
迈尔风随 发表于 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


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-9-2 15:02:34 | 显示全部楼层
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


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-9-2 15:07:24 | 显示全部楼层
本帖最后由 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


回复

使用道具 举报

495

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-9-2 16:53:33 | 显示全部楼层
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
刻苦学习,共同进步


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-2 22:29:42 | 显示全部楼层
dcexpert 发表于 2018-9-2 15:07
哪里不同了?

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

#ifndef _XTAL_FREQ
...

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

点评

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


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-2 22:31:39 | 显示全部楼层
迈尔风随 发表于 2018-9-2 16:53
还是看不明白,我去找《AVR单片机应用专题精讲》看一下

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

点评

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


回复

使用道具 举报

495

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-9-3 00:25:33 | 显示全部楼层
werjufour 发表于 2018-9-2 14:31
如果找到了,发给我看下。我实在是看不太懂

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

点评

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


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

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

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

点评

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


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-3 18:27:45 | 显示全部楼层
迈尔风随 发表于 2018-9-3 00:25
我网上找了一下,没有电子档可以看,这是一本也版的书,只能买书来看才行

层主不是作者么?


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-3 18:34:33 | 显示全部楼层
dcexpert 发表于 2018-9-3 12:26
时钟当然要设置为实际频率,这样才能准确计算时间。

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

点评

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


回复

使用道具 举报

7039

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2018-9-3 21:57:12 | 显示全部楼层
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


回复

使用道具 举报

148

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-9-5 21:30:08 | 显示全部楼层
dcexpert 发表于 2018-9-3 21:57
参数就是延时时间啊,__delay_ms(50)就50ms。当然因为是使用代码延时而不是通过定时器,所以精度不是非常 ...

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


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-9-19 20:49 , Processed in 0.512895 second(s), 17 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表