xsh2005105326 发表于 2012-4-23 23:08:17

LGT8F08A用T0产生PWM(基于IAR)

本帖最后由 xsh2005105326 于 2012-4-23 23:12 编辑

IAR版本为5.11B,代码见附件

//#include <iom164p.h>
//#include <iolgt8f0xa.h>
#include <iolgt8f0xa_full.h>
#include<intrinsics.h>
#define u8 unsigned char
#define u16 unsigned int

void port_init(void);
void delay_nms(u16 n);
void time0_init(void);

void main(void)
{
u8 i,temp;
port_init();
time0_init();

while(1)
{
    temp = 0x03;
    for(i=0;i<8;i++)
    {
      PORTA = temp;
      delay_nms(10);
      temp<<=1;
    }
}
}
/******************************************************************************
函 数 名:void port_init(void)
功    能:IO初始化
说    明:   
参    数:   
返 回 值:   
*******************************************************************************/
void port_init(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTC|=0x40;
DDRC = 0x40;//PC6 for output
}
/******************************************************************************
函 数 名:void time0_init(void)
功    能:T0初始化
说    明:   
参    数:   
返 回 值:   
*******************************************************************************/
void time0_init(void)
{
TCCR0A = 0x40;
TCCR0B = 0x02;//FPWM,F=CLK/8;
TCNT0 = 0x11;
OCR0A = 0xdd;//编程手册是OCR0
}
/******************************************************************************
函 数 名:void delay_nms(u16 n)
功    能:延时
说    明:   
参    数:   
返 回 值:   
*******************************************************************************/
void delay_nms(u16 n)
{
u16 i;
for(;n>0;n--)
{
    for(i=0;i<10;i++)
    {
      __delay_cycles(8000);
    }
}       
}
代码中OCR0A = 0xdd;//编程手册是OCR0
在头文件里面定义的是OCR0A,但是手册里面却是OCR0,不解。
同时T0相应几个寄存器的地址我也搞不明白,如下图

谁能解释下?
-------------------------------------------
------------------------------------------
我上面的代码不能改变占空比及频率(只能通过分配来改)。

shh_hqss 发表于 2012-4-23 23:11:58

mark 关注...

logicgreen 发表于 2012-4-23 23:15:43

PWM有CTC,快速PWM,相位修正PWM三个输出模式,如果是CTC模式那就只能是方波,只能调频率。

xsh2005105326 发表于 2012-4-24 08:33:45

logicgreen 发表于 2012-4-23 23:15 static/image/common/back.gif
PWM有CTC,快速PWM,相位修正PWM三个输出模式,如果是CTC模式那就只能是方波,只能调频率。 ...

嗯,谢谢回复,只是我上面红色的字体部分还是不太明白。晚上回去再试试

LGT 发表于 2012-4-24 09:45:01

本帖最后由 LGT 于 2012-4-24 09:54 编辑

1. OCR0是我们没有统一, OCR0和OCR0A是指同一个寄存器。 我们会统一为OCR0A (与164A一致)。多谢提醒。
2. 楼主所指的地址是不是指一个寄存器有两个地址? 比如OCR0 :$47($27) ?
       I/O空间是同时映射到数据存储空间的。 地址$27是OCR0在I/O空间的地址, 用IN/OUT访问时的地址
                                                            地址$47是OCR0在数据存储器空间的地址, 用LD/ST访问的地址
如果是使用C编程, 可以不用考虑这个地址区别。

xsh2005105326 发表于 2012-4-24 09:53:01

LGT 发表于 2012-4-24 09:45 static/image/common/back.gif
1. OCR0是我们没有统一, OCR0和OCR0A是指同一个寄存器。 我们会统一为OCR0。多谢提醒。
2. 楼主所指的地址 ...

{:lol:} 谢谢您的解答
页: [1]
查看完整版本: LGT8F08A用T0产生PWM(基于IAR)