项目场景:
ATTiny4 用IO口模拟方波输出
问题描述:
ATTiny4 每隔76ms重启一次
程序代码:
#include <avr/io.h>
#include <util/delay.h>
//SCL -> PB2
#define H 1
#define L 0
#define PWM(x) x?(PORTB=PORTB|0x4):(PORTB=PORTB&0xB)
int main(void)
{
uint8_t i = 0;
/* Replace with your application code */
//IO口设定
DDRB = 0xF;
PORTB = 0xF;
_delay_ms(1);
while (1)
{
PWM(H);
_delay_us(5);
PWM(L);
_delay_us(5);
}
}
原因分析:
1、 逻辑分析仪抓PWM波形。波形每隔76ms重复一次,两段PWM波形之间有1.2mS延时。
2、1.2mS延时与代码“_delay_ms(1);” 对应。
初步判断没有喂狗
解决方案:
1、加入喂狗代码。
#include <avr/io.h>
#include <util/delay.h>
//SCL -> PB2
#define H 1
#define L 0
#define PWM(x) x?(PORTB=PORTB|0x4):(PORTB=PORTB&0xB)
int main(void)
{
uint8_t i = 0;
/* Replace with your application code */
//IO口设定
DDRB = 0xF;
PORTB = 0xF;
_delay_ms(1);
while (1)
{
PWM(H);
_delay_us(5);
PWM(L);
_delay_us(5);
//喂狗
RSTFLR=RSTFLR&0xF7; //Clear WDRF in RSTFLR
CCP=0xD8; //Write signature for change enable of protected I/O register
WDTCSR=WDTCSR&0xF7;
}
}
2、清除WTDON标志位