破烂王 发表于 2014-8-10 20:22:40

求助:avr PWM调速,中断导致lcd1602无法显示

用atmega8timer1 做pwm输出,timer0做光栅计数,timer2作定时器,lcd1602用来显示测量速度。当使用timer1时,可能是中断的原因,导致lcd1602显示程序无法执行了,将lcd1602显示程序写进中断是不是是时间太长了。有什么好的方法?

digitaltek 发表于 2014-8-10 20:37:44

在写lcd的时候最好不要中断掉,先可以在操作lcd的时候关掉中断看一下,是否正常了

破烂王 发表于 2014-8-10 20:45:14

digitaltek 发表于 2014-8-10 20:37
在写lcd的时候最好不要中断掉,先可以在操作lcd的时候关掉中断看一下,是否正常了 ...

关掉timer1 显示正常

digitaltek 发表于 2014-8-10 21:50:11

显示程序无法执行,那可能是中断太频繁了吧

破烂王 发表于 2014-8-10 22:04:39

本帖最后由 破烂王 于 2014-8-10 22:08 编辑

digitaltek 发表于 2014-8-10 21:50
显示程序无法执行,那可能是中断太频繁了吧

是这样,怎么才能对显示程序隔一断时间显示一次,写到中断里?timer1 是做为PWM工作模式,是这个定时器引起显示数据端口数据得不到时更新

digitaltek 发表于 2014-8-10 22:07:26

一般显示程序执行的时间都比较长,写到中断的话估计会影响PWM的调整。照理pwm是硬件的,不应该非常频繁的进中断,不知道你的pwm频率达到多少

破烂王 发表于 2014-8-10 22:10:38

digitaltek 发表于 2014-8-10 22:07
一般显示程序执行的时间都比较长,写到中断的话估计会影响PWM的调整。照理pwm是硬件的,不应该非常频繁的进 ...

20Khz
void Timer1_init()
{
        //TCCR1B=0x00;                                                                                //停止定时器
        //TIMSK|=(1<<OCIE1A)|(1<<OCIE1B);                                               
        TIMSK=0x59;
        TCCR1A=0xE0; //8 Mode, OC1A and OC1B Ouput,OC1A=~OC1B
        TCCR1B=0x12;//8分频
        ICR1=0x0019;//20kHz
        OCR1A=0x000B;
        OCR1B=0x000B;
}

digitaltek 发表于 2014-8-10 22:33:55

按你的代码算了一下,每次中断之间能执行25×8 = 200条指令,可能比较少,降低PWM频率试试是否有改善

wujin715 发表于 2014-8-10 23:38:49

可以设定进入多少次中断以后 刷新一下1602 在刷新1602 的时候把中断暂时关闭

yt920419 发表于 2014-8-10 23:45:45

wujin715 发表于 2014-8-10 23:38
可以设定进入多少次中断以后 刷新一下1602 在刷新1602 的时候把中断暂时关闭 ...

{:lol:} 楼上得可行 我就是对PWM计次 显示的

破烂王 发表于 2014-8-12 20:55:22

本帖最后由 破烂王 于 2014-8-12 21:04 编辑

wujin715 发表于 2014-8-10 23:38
可以设定进入多少次中断以后 刷新一下1602 在刷新1602 的时候把中断暂时关闭 ...

运行timer1就不行,屏蔽就好,原来lcd1602_init 在几个定时器的下面,挪到现在的位置就好了,今天修改timer0和timer2 又不行了,不知为什么lcd1602 初始化受timer1的影响?

wujin715 发表于 2014-8-12 21:15:33

如果没有IO口复用 应该不会 方法“可以设定进入多少次中断以后 刷新一下1602 在刷新1602 的时候把中断暂时关闭”你试过了吗?

破烂王 发表于 2014-8-12 21:21:12

wujin715 发表于 2014-8-12 21:15
如果没有IO口复用 应该不会 方法“可以设定进入多少次中断以后 刷新一下1602 在刷新1602 的时候把中断暂时 ...

timer1在pwm模式不受sei()控制,只受TCCR1B=0x00; 控制,我在timer1 初始化中使这语句有效,现在只能间歇性显示,也就是pwm停止显示,启动不显示
页: [1]
查看完整版本: 求助:avr PWM调速,中断导致lcd1602无法显示