B001-Atmega16-看门狗WDT-(ques=1)

Atmega16看门狗WDT测试及误差分析
本文详细介绍了Atmega16微控制器的看门狗定时器(WDT)测试过程,包括使用PA0进行复位时间测试、增加.noinit特性验证复位、误差分析以及完整代码分享。测试结果显示看门狗能正常复位MCU,但实际复位时间略短于预期,可能是由于温度和示波器误差导致。
部署运行你感兴趣的模型镜像

今天测试了下看门狗。

可以使用wdt.h中的wdt_enable(value)wdt_disable(),也可以使用自己定义的WDT_enable(uint8_t count)WDT_disable(void)

复位看门狗用wdt.h中的wdt_reset()


----------------------------------------------------------------------------------------------------------------------------------

使用PA0测试复位时间:

1、上电时PA0输出0.5s的高电平(示波器)

2、接着PA0拉低,同时启用看门狗(2s后复位)

3、如果看门狗复位,那么复位后会再次将PA0会被拉高,而且复位前PA0的低电平持续时间应该是2s(5V电源下)

测试代码:

#include <avr/io.h>
#include "watch_dog.h"
#include "_noinit.h"
#include "system.h"
#include "config.h"
int main(void)
{
    // PA0为输出口
    DDRA  = (IO_OUTPUT << DDA0);

    // PA0拉高
    PORTA = (1 << PA0);
    // 维持0.5秒
    delay_ms(500);

    // PA0拉低
    PORTA &= ~(1 << PA0);
    // 使能看门狗 @ 2s
    wdt_enable(WDTO_2S);
//  WDT_enable(WDTO_2S);
    // 
    // 1. 看门狗在2秒后复位,所以PA0的低电平会维持2秒
    // 2. 而后芯片复位,PA0会被拉高
    // 3. 跳转到1
    // 
    // 记录复位次数
    _noinit_using();

    while(1)
    { }
    return 0;
}

增加使用.noinit特性测试复位:

上面的_noinit_using()使用了.noinit特性,通过观察PORTB上的8位LED的状态(二进制计数器)得知复位次数。

测试代码:

uint8_t v_noinit __attribute__ ((section(".noinit")));
void _noinit_using(void)
{
    v_noinit++;
    // 8位LED,低推
    DDRB  = 0xFF;
    PORTB = 0xFF;
    PORTB = v_noinit;
}
_noinit_using具体原理参考这里:

http://blog.youkuaiyun.com/manon_des_source/article/details/51536802

测试结果:

1、示波器可以看到PA0输出的是0.5的高电平H1.86秒的低电平L

      同时PORTB上的8位LED组成的二进制计数器在0.5秒的高电平出现时就会加1。

2、0.5秒高电平是启动看门狗之前的时间,1.86秒是看门狗定时器溢出时间,溢出后复位MCU

     于是又重新出现0.5秒的高电平。

      这说明看门狗工作正常,确实实现了复位MCU

3、当然每次下载程序或看门狗复位后,PORTB上的8位LED组成的二进制计数器也会加1


----------------------------------------------------------------------------------------------------------------------------------

结果误差分析:

1、复位时间只有1.86s,而不是2秒。

测试电源电压是5V,所以应该是温度和示波器造成的误差。

特地查看了下Atmega16Datasheet,发现在室温30度下,WDT的频率大概是1020Hz(下图)。

频率是1.02倍,对应的时间应该是 2s / (1020 / 1000) = 1.96s

剩下的误差,也许是示波器的问题吧。


另外、芯片使用的是8MHz的时钟,这需要手动校准,看看复位时间是否更接近2s

|<----待测试-question-001

或者使用内部自动校准的1MHz时钟测试。

 


----------------------------------------------------------------------------------------------------------------------------------

完整代码:

http://download.youkuaiyun.com/detail/manon_des_source/9557733

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

在浙政钉消息推送过程中,遇到错误码 `OPF-B001-05-16-0002` 通常表示推送请求中缺少必要的参数或参数格式不正确。根据类似错误码的结构和处理逻辑,该错误码的含义可以理解为:**推送请求中指定的某个必需参数缺失或无效**,例如 `userId`、`msgKey` 或 `msgParam` 等关键字段未正确提供[^2]。 ### 可能原因 1. **消息参数缺失**:推送消息时未提供某些必需字段,例如接收用户标识 `userId`、消息类型 `msgKey` 或消息内容 `msgParam`。 2. **参数格式错误**:提供的参数格式不符合接口规范,例如 `userId` 应为字符串类型但传入了数字,或者 `msgParam` 的 JSON 结构不正确。 3. **API 密钥或权限配置错误**:虽然错误码 `OPF-B001-05-16-0002` 不直接指向 `apiKey`,但若推送接口依赖认证信息,也可能因认证失败导致后续参数校验失败。 ### 解决方案 1. **检查请求参数完整性** 确保推送请求中包含所有必需的字段,包括但不限于: - `userId`(接收消息的用户 ID) - `msgKey`(消息模板标识) - `msgParam`(消息内容参数,通常为 JSON 格式) 2. **验证参数格式正确性** 根据浙政钉开放平台的接口文档,逐一验证参数的格式是否符合要求。例如,`msgParam` 的结构应与消息模板定义的字段一致,确保字段名称和类型正确。 3. **调试推送请求** 使用 Postman 或 curl 工具手动构造推送请求,确认请求头(Header)和请求体(Body)是否正确。特别注意 `Content-Type` 应为 `application/json`,且 `Authorization` 头(如有)应正确设置。 4. **查看日志与错误信息** 在浙政钉后台管理平台查看详细的推送日志,获取更具体的错误描述,有助于定位问题根源。 ### 示例推送请求 以下是一个使用 `curl` 推送消息的示例请求,供参考: ```bash curl -X POST https://openplatform.dg-work.cn/api/message/send \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <your-access-token>" \ -d '{ "userId": "user123", "msgKey": "dingtalk.message.template.key", "msgParam": "{\"title\": \"通知\", \"content\": \"这是一条测试消息\"}" }' ``` ### 注意事项 - 在构造 `msgParam` 时,需确保其为合法的 JSON 字符串,并进行正确的转义处理。 - 若使用第三方平台(如宜搭)调用浙政钉接口,需确保平台配置的推送参数与浙政钉接口规范一致。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值