又遇到问题了,关于PIC24FJ64GA004时钟震荡的问题

2019-03-25 18:44发布

PIC24FJ64GA004单片机时钟选择的改如何设置呢?我目前编写了个程序。用软件仿真SIM进行仿真延时函数        delay1s();延时的时间是160多ms.但是在proteus仿真软件上仿真的效果却是延时了3秒左右。LED亮3秒熄灭3秒左右循环。不知道哪里出了问题。老铁们帮忙看看。谢谢了。
附上程序和仿真图。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
迈尔风随
1楼-- · 2019-03-26 22:10
dcexpert 发表于 2018-9-1 12:37
这个是宏的一种特殊用法,就是将两个内容合成一个,在使用一系列有规律的寄存器时非常有用,在很多程序里 ...

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

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

dcexpert
3楼-- · 2019-03-27 01:41
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单片机应用专题精讲》一书中的说明和举例。

dcexpert
4楼-- · 2019-03-27 02:46
本帖最后由 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)


迈尔风随
5楼-- · 2019-03-27 04:38
 精彩回答 2  元偷偷看……
werjufour
6楼-- · 2019-03-27 06:19
dcexpert 发表于 2018-9-2 15:07
哪里不同了?

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

#ifndef _XTAL_FREQ
...

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

一周热门 更多>