lf8013 发表于 2009-7-3 22:19:12

T/C0相位修正PWM模式死活就是不输出波形,

问这个问题,我都觉得不好意思,可是我搞了几天就是搞不定这个问题,只好请教各位朋友帮帮忙,看看,我到底是哪里错了?


/*****************************************************
Chip type         : ATtiny2313V
Clock frequency   : 4.000000 MHz
Memory model      : Tiny
External SRAM size: 0
Data Stack size   : 32
*****************************************************/

#include "mytiny2313.h"
#include <delay.h>

#define uchar      unsigned char
#define uint      unsigned int
#define   sei()      #asm("sei")
#define   cli()      #asm("cli")
#define int0_enable    GIMSK|=0X40
#define int0_disable   GIMSK&=~(0X40)

uchar dtime=0;                         //已经延时的时间
uchar ttime=0;                         //15秒的计数次数

/*函数声明*/
void port_init(void);
void init_devices(void);

//端口初始化
void port_init(void)
{      
      PORTB=0x00;   
      DDRB=0xff;

      PORTD=0x3f;
      DDRD=0x43;
      
      TCCR1A=0x00;
      TCCR1B |=((1<<WGM12)|(1<<CS12)|(1<<CS10));       // 系统时钟1024分频,比较匹配清0模式 ,当匹配中断时 TIFR.4 置位
      TCNT1H=0x00;       //
      TCNT1L=0x00;
      OCR1AH=0xe4;      //匹配值为 58594(E4E2)
      OCR1AL=0xe2;
      TCNT0=0;
      OCR0A=127;
      TCCR0A |=((1<<COM0A1)|(1<<COM0A0)|(1<<WGM00));      // 相位修正PWM模式,WGM=5,在升 序计数时发生比较匹配将置位 OC0A ;降序计数时发生比较
                                                                                                // 匹配将清零 OC0A
      TCCR0B |=((1<<WGM02)|(1<<CS01));                              // 系统时钟8分频
      
}                                                         /*不知道上面的设置有什么问题,OC0A就是不输出PWM波形,只有当OCR0A=0的时候,OC0A输出2.2v的电压
                                                             当OCR0A为别的数值的时候,OC0A的脚只是输出0V的电压,没有波形?T/C1工作正常,只是T/C0有问题?*/
/**********************************************************/      
void init_devices(void)
{
      cli();                   //禁止所有中断
      MCUCR= 0b00000010;
      int0_disable;
         
      sei();                  //开全局中断
      int0_enable;
}


/************************************************************/   
// Timer 1 overflow interrupt service routine
interrupt void delay15s()       //延时240*15s=1H
{
ttime++;                              
if(ttime==241)               //240*15s=0.5H
   {
   dtime++;                   //够1小时,dtime的值加1
   ttime=0;
   };
   
}

// Declare your global variables here
/*********************************************************************************/
void main(void)
{

OSCCAL=0x58;
port_init();
init_devices();

while (1)
{
   
};

}



非常希望老师指导一下,看了N遍attiny2313的pdf手册,代码改了N次,还是不行,笨鸟啊!!

lf8013 发表于 2009-7-4 20:13:22

是不是问题太简单了,各位老师都懒得回答啊,
我用CVAVR自动生成了代码,可是还是不行,用PROTEUS仿真也行,实际烧到板上也不行,郁闷啊,各位大侠指点指点啊,到底是怎么回事,下面是CVAVR自动生成的代码,我只是加了一个按键的代码,按一下按键,OCR0A的值+5,在OC0A(PB2)的输出端通过330的电阻接了一个LED,可是LED不亮,只有OCR0A的值为0的时候,LED亮,PB2的端口有2.2V的电压,但是没有波形,当OCR0A的值为别的数值的时候,PB2端口的电压为0,没有波形,当按着按键不放的时候,LED一闪一闪的微亮,
各位大侠帮帮忙吧,小弟初学,自己搞了很久都不行,

Chip type         : ATtiny2313V
Clock frequency   : 4.000000 MHz
Memory model      : Tiny
External SRAM size: 0
Data Stack size   : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>
                  
#define key            PIND.3
// Declare your global variables here

void main(void)
{

#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


PORTB=0x00;
DDRB=0xFF;

PORTD=0x3f;
DDRD=0x43;


TCCR0A=0xC1;
TCCR0B=0x0A;
TCNT0=0x00;
OCR0A=0x7f;
OCR0B=0x00;


TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;


USICR=0x00;


ACSR=0x80;

while (1)
      {
      if(key==0)
    {
      delay_ms(10);
      if(key==0)
      {
      OCR0A=OCR0A+5;
      };
      
    };
    delay_ms(800);

      };
}

lf8013 发表于 2009-7-4 21:33:02

麻烦马老师帮忙看看怎么回事好不好,同样的程序在M16上面运行什么事都有没有,但是在ATTINY2313上面就是不行,真的郁闷啊,不知哪里问题,下面是M16的代码
#include <mega16.h>
#include <delay.h>

#define    key   PINB.0



void main(void)
{

PORTB=0x09;
DDRB=0x08;


TCCR0=0x72;
TCNT0=0x00;
OCR0=0x00;


while (1)
      {
      if(key==0)
    {
      delay_ms(10);
      if(key==0)
      {
      OCR0=OCR0+5;
      };
      
    };
    delay_ms(500);

      };
}


下面是ATTINY2313的代码

#include <tiny2313.h>
#include <delay.h>
#define key            PIND.3               //按键输入端


// Declare your global variables here

void main(void)
{

#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


PORTB=0x00;
DDRB=0xFF;


PORTD=0x3F;
DDRD=0x40;


TCCR0A=0xC1;
TCCR0B=0x0A;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;


while (1)
      {
      if(key==0)
    {
      delay_ms(10);
      if(key==0)
      {
      OCR0A=OCR0A+5;
      };
      
    };
    delay_ms(500);
   

      };
}

真的不知哪里问题啊,怎么就是不行呢?

fcc250513166 发表于 2009-7-27 19:17:00

小弟也刚学AVR   帮不了你!    只能顶下!
   
   希望路过的老师帮下他吧   很造孽的!
页: [1]
查看完整版本: T/C0相位修正PWM模式死活就是不输出波形,