yowen_2001 发表于 2010-1-29 23:19:27

为什么M8的T1工作在快速PWM(14)模式下OCR1A不能写入16位的数据,只能写如低字节呢?

马老师您好!
我写了一个M8的PWM程序,用的T1的快速PWM模式(14模式)。TOP值ICR1=0x0493,OCR1A=0x0249。 溢出中断和比较匹配中断都开。
但是我在AVR Studio中软件仿真单步执行到OCR1A=0x0249;指令后,仿真器显示我的OCR1A寄存器数值为0x49.高位0x02没有写入。
而且开始执行程序后,比较匹配中断两次后溢出中断才中断一次。很奇怪!
另外我用的是ICC的编译器,编译的时候目标器件选的是M8,在AVR Studio仿真中我也选择了M8位目标器件。
下面是程序:
#include <iom8v.h>
#include <macros.h>

volatile unsigned char OCR1A_state=0,TOP1_state=0;

#pragma interrupt_handler        OCR1A_interrupt:iv_TIMER1_COMPA
void OCR1A_interrupt(void)
{
        NOP();
        OCR1A_state=1;
        TOP1_state=0;
        NOP();
}



#pragma interrupt_handler        TOP1_interrupt:iv_TIMER1_OVF
void TOP1_interrupt(void)
{
        NOP();
        OCR1A_state=0;
        TOP1_state=1;
        NOP();
}

void main(void)
{

CLI();

DDRB|=(1<<PB1);
TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<WGM11);//方式14
TCCR1B=(1<<WGM12)|(1<<WGM13);
TIMSK=(1<<OCIE1A)|(1<<TOIE1);
//ICR1H=0x04;
//ICR1L=0x93;
ICR1=0x0493;
//OCR1AH=0x02;
//OCR1AL=0x49;
OCR1A=0x0249;
SEI();
TCCR1B|=(1<<CS12)|(1<<CS10);//定时器开始
NOP();

while(1)
        {
                NOP();
                NOP();
                NOP();
       
        };

}
http://cache.amobbs.com/bbs_upload782111/files_25/ourdev_530641.JPG
调试图 (原文件名:11111111111.JPG)

yowen_2001 发表于 2010-1-29 23:20:37

另外,我把头文件换成M128的,不修改任何代码,就一切OK,没问题。

yowen_2001 发表于 2010-2-2 08:56:13

没人回答啊!

yijiuchaoxi 发表于 2011-11-3 17:48:21

我也遇到这个问题,我是使用的T1定时器,但是下载到板子,PWM是正确的,等待高人回答

yijiuchaoxi 发表于 2011-11-3 17:52:56

AVR STUDIO的问题
页: [1]
查看完整版本: 为什么M8的T1工作在快速PWM(14)模式下OCR1A不能写入16位的数据,只能写如低字节呢?