打印
[PIC®/AVR®/dsPIC®产品]

avr atmega128,调用不了编写的延时程序

[复制链接]
1238|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2025-2-17 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己编写了一个延时子程序,在主程序中调用时运行不了,但是直接将延时程序中的延时语句拿到主程序可以用。而且在调用自己编写的延时子程序时,编译时必须选为M103模式,并用128模式下载,这样才可以运行自己编写的延时子程序,很是不解,求大神解惑

使用特权

评论回复
沙发
huahuagg| | 2025-2-21 18:16 | 只看该作者
// 失效的子程序调用
void delay_ms(uint16_t ms) {
    while(ms--) _delay_ms(1); // 编译器可能优化循环结构
}

// 有效的直接调用
_delay_ms(500); // 直接调用AVR Libc内置延时

使用特权

评论回复
板凳
huahuagg| | 2025-2-21 18:16 | 只看该作者
#include <avr/io.h>
#include <util/delay_basic.h>

__attribute__((noinline, optimize("O0")))
void safe_delay_ms(uint16_t ms) {
    for(volatile uint16_t i=0; i<ms; i++) {
        _delay_loop_2(3000); // 精确校准值(F_CPU=16MHz时)
    }
}

使用特权

评论回复
地板
花间一壶酒sd| | 2025-2-23 00:12 | 只看该作者
使用 volatile 关键字防止延时子程序被优化。

使用特权

评论回复
5
小明的同学| | 2025-2-23 10:18 | 只看该作者
是不少放在了主程序后面了,另外没有在前面声明函数?你放到主函数前试试,或者将声明放在程序前面去。

使用特权

评论回复
6
yuliangren| | 2025-3-6 16:25 | 只看该作者
ATmega128 有两种编译模式:M103 模式 和 ATmega103 兼容模式。这两种模式会影响芯片的寄存器和内存映射

使用特权

评论回复
7
hhdhy| | 2025-3-6 17:33 | 只看该作者
M103 模式,ATmega128 以 ATmega103 兼容模式运行,部分寄存器和功能受限。正常模式,ATmega128 以全功能模式运行,支持所有寄存器和功能

使用特权

评论回复
8
gra22ce| | 2025-3-6 18:20 | 只看该作者
确保在编译时选择 ATmega128 的正常模式,而不是 M103 模式。在编译器(如 AVR Studio 或 Atmel Studio)中正确设置芯片型号为 ATmega128,并禁用 M103 兼容模式。

使用特权

评论回复
9
eleg34ance| | 2025-3-6 19:33 | 只看该作者
延时子程序的实现可能存在问题,例如:使用了不正确的寄存器或变量。延时循环未优化,导致编译器优化后失效。延时子程序未正确处理中断或全局变量。

使用特权

评论回复
10
twinkhahale| | 2025-3-6 22:50 | 只看该作者
一般建议使用 _delay_ms() 或 _delay_us() 函数(需包含 <util/delay.h>),这些函数是 AVR Libc 提供的标准延时函数。如果必须自己编写延时子程序,确保使用 volatile 关键字防止编译器优化

使用特权

评论回复
11
hight1light| | 2025-3-7 09:10 | 只看该作者
ATmega128 的熔丝位配置可能影响程序运行。例如:时钟源配置错误:如果时钟源配置不正确,延时子程序的时间计算会出错。

使用特权

评论回复
12
suiziq| | 2025-3-7 10:19 | 只看该作者
如果启用了 M103 兼容模式,芯片会以 ATmega103 的模式运行,导致部分功能不可用

使用特权

评论回复
13
tiakon| | 2025-3-7 11:27 | 只看该作者
检查并正确配置熔丝位:保时钟源配置正确(如使用外部晶振或内部 RC 振荡器)。禁用 M103 兼容模式(清除 M103C 熔丝位)。使用编程工具(如 AVRDUDE 或 Atmel Studio)读取和修改熔丝位

使用特权

评论回复
14
nuan11nuan| | 2025-3-7 13:15 | 只看该作者
如果延时子程序中使用了局部变量或递归调用,可能导致堆栈溢出,尤其是在资源有限的嵌入式系统中。减少局部变量的使用,尽量使用全局变量或静态变量。确保堆栈空间足够,避免递归调用

使用特权

评论回复
15
星星点点didi| | 2025-3-7 18:00 | 只看该作者
编译器可能会优化掉未使用的代码,导致延时子程序失效。使用 volatile 关键字声明延时循环中的变量,防止编译器优化。在编译器设置中禁用优化(如 -O0),或调整优化级别。

使用特权

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

本版积分规则

2103

主题

7943

帖子

11

粉丝