[PIC®/AVR®/dsPIC®产品] IO输出方波问题请教

[复制链接]
1005|11
 楼主| renyaq 发表于 2023-1-8 11:16 | 显示全部楼层 |阅读模式
各位大佬好。我采用AVR ATTINY24A单片机。做高、低电平delay的方式 用IO输出方波。但调delay值,不能改变占空比,是什么原因?同样的代码。在51中是可以的。谢谢!
代码如下:
void pwmout()
{
        unsigned char i=0;
        switch(i)
        {
                case 0:
                                                DDRB = 0x0F;
                                                PORTB = 0x01; //输出高
                                                delay(2000);
                                                i=1;
        
                case 1:
                                                DDRB = 0x0F;
                                                PORTB = 0x00; //输出高
                                                delay(1000);
                                                i=0;
                                                
                                       
        }
}

void delay(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
请大佬们,指点一下原因。谢谢!
spark周 发表于 2023-1-8 11:19 | 显示全部楼层
也许是编译器优化太狠了,建议加 volatile ,加在delay里的变量定义前。
zhanghqi 发表于 2023-1-8 11:21 | 显示全部楼层
的确是这个原因
huwr 发表于 2023-1-8 16:46 | 显示全部楼层
这个PWMOUT一下子没看懂,外部主程序一直调用这个函数?
huangchui 发表于 2023-1-8 16:48 | 显示全部楼层
不喜欢这样的风格,switch也不规范,也没见大循环。
supernan 发表于 2023-1-8 16:50 | 显示全部楼层
确实不规范,估计是大循环一直调用pwmout()。
heweibig 发表于 2023-1-8 16:52 | 显示全部楼层
不过注意pwmout()内 : unsigned char i=0; 这始终为0,能输出PWM就奇怪了。
wuhany 发表于 2023-1-8 16:55 | 显示全部楼层
按照楼主的意思,应该写成static unsigned char i=0;
lizye 发表于 2023-1-8 16:57 | 显示全部楼层
还是你眼睛亮,没有break确实能输出PWM
liliang9554 发表于 2023-1-8 17:00 | 显示全部楼层
没有break,所有后面的case 1也执行,就有pwm了
 楼主| renyaq 发表于 2023-1-8 17:04 | 显示全部楼层
的确是在大循环一直调用pwmout(), 菜鸟只能想到这个思路了。不知道怎么写才算规范,还望大佬指点。十分感谢!
 楼主| renyaq 发表于 2023-1-8 17:06 | 显示全部楼层
谢谢大佬指点。菜鸟第一次做一个量产用的程序,以前51玩过一点,AVR第一次接触。本来想用外部中断+定时器做PWM输出,无奈目前还不会。欢迎大佬教导。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

700

主题

10138

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部