guxingganyue 发表于 2011-4-13 11:22:29

发现ICC6.31A的自动生成代码器生成的代码有很很大大的错啊,,,,,,调了一个早上还是这样,,,请傻

我用ICC6.31a的代码生成器生成的产生PWM波的程序,,下进去波形还行,但频率狠狠的不准啊,,

我设置输出40KHz的方波,但用示波器看到的频率只有:18.18KHz


我的设置和程序如下:

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_630407MZ4P84.png
(原文件名:1.png)

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_630408MIX4HD.png
(原文件名:2.png)

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_630409AEB3PJ.png
(原文件名:3.png)


//ICC-AVR application builder : 2011-4-13 上午 11:17:55
// Target : M48
// Crystal: 7.3728Mhz

#include <iom48v.h>
#include <macros.h>

void port_init(void)
{
PORTB = 0x00;
DDRB= 0x00;
PORTC = 0x00; //m103 output only
DDRC= 0x01;//---------------------------在PC0上输出方波
PORTD = 0x00;
DDRD= 0x00;
}

//TIMER1 initialize - prescale:1
// WGM: 4) CTC, TOP=OCRnA
// desired value: 40KHz
// actual value: 40.070KHz (0.2%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0x49;
OCR1AH = 0x00;
OCR1AL = 0xB7;
OCR1BH = 0x00;
OCR1BL = 0xB7;
ICR1H= 0x00;
ICR1L= 0xB7;
TCCR1A = 0x00;
TCCR1B = 0x09; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFF; //reload counter high value
TCNT1L = 0x49; //reload counter low value
PORTC ^=0x01;

}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();

MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EIMSK = 0x00;

TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x01; //timer 1 interrupt sources
TIMSK2 = 0x00; //timer 2 interrupt sources

PCMSK0 = 0x00; //pin change mask 0
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PCICR = 0x00; //pin change enable
PRR = 0x00; //power controller
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

//
void main(void)
{
init_devices();
//insert your functional code here...

while(1)
{

};
}

fsclub 发表于 2011-4-13 11:36:53

自己没有搞清楚之前不要对别人的东西下结论。

guxingganyue 发表于 2011-4-13 12:32:46

回复【1楼】fsclub 绿林好汉
-----------------------------------------------------------------------

哦。。。。那是为什么呢

gliet_su 发表于 2011-4-13 12:55:49

6.31确实有BUG,现在已经7.19了

hsztc 发表于 2011-4-13 13:18:07

楼主还是多看看AVR的数据库手册吧,看看什么是CTC模式,什么是PWM模式,什么时候要重装载,什么时候不需要等等。

Gorgon_Meducer 发表于 2011-4-13 13:24:40

至少要用ICC7.20吧?

guxingganyue 发表于 2011-4-13 18:22:10

回复【5楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

回复【4楼】hsztc
-----------------------------------------------------------------------

回复【3楼】gliet_su
-----------------------------------------------------------------------

问题解决了,,,原来是电源的问题

我开始用的是开关的,,最后换成线性的就没事了

hsztc 发表于 2011-4-13 22:32:17

【6楼】 guxingganyue

你确定是电源问题,如果换掉后发现正常了,那我推荐你还是换回原来的那个。

看看我4楼说的,对你有帮助的。

guxingganyue 发表于 2011-4-14 09:13:31

回复【7楼】hsztc
-----------------------------------------------------------------------

好的,,这个问题我会继续研究一下的,,,谢谢您耐心的回答
页: [1]
查看完整版本: 发现ICC6.31A的自动生成代码器生成的代码有很很大大的错啊,,,,,,调了一个早上还是这样,,,请傻