jtiaao 发表于 2009-8-20 19:39:52

mega128的AD始终没有反应??mega16就行?

我的mega128的熔丝位全是合理设置的,也没有设置与103兼容,程序是自动生成的,但为什么我的AD不运行啊?更奇怪的是我把#include <mega128.h>改成#include <mega16.>在mega16上就可以运行,可以进行AD转化!?


/****************************************************

Chip type         : ATmega128L
Program type      : Application
Clock frequency   : 4.000000 MHz
Memory model      : Small
External SRAM size: 0
Data Stack size   : 1024
*****************************************************/

#include <mega128.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

#include <delay.h>


unsigned char buff_line_ad;
unsigned int adc_data,volage,time,adc_data_v;
// Timer 0 比较匹配中断服务,2ms定时
interruptvoid timer0_comp_isr(void)
{
   if(time++>200)
   {time=0;
    PORTB.1=~PORTB.1;//可以闪烁
    }
}
// ADC interrupt service routine
interrupt void adc_isr(void)
{

// Read the AD conversion result
adc_data=ADCW;
PORTB.2=~PORTB.2; //不可以闪烁

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

PORTA=0x00;
DDRA=0x01;

PORTB=0x00;
DDRB=0x06;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

PORTE=0x00;
DDRE=0x00;

PORTF=0x00;
DDRF=0x00;

PORTG=0x01;
DDRG=0xff;


ACSR=0x80;
SFIOR&=0x1F;
SFIOR|=0x60;

// ADC initialization
// ADC Clock frequency: 62.500 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=0x47;
ADCSRA=0xAD;
// T/C0 初始化
TCCR0=0x0B;                // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
TCNT0=0x00;
OCR0=0x7C;                // OCR0 = 0x7C(124),(124+1)/62.5=2ms
TIMSK=0x02;                // 允许T/C0比较匹配中断
// LCD module initialization
lcd_init(16);
volage=1000;       //我都赋初值为1000,上电也理应为1000啊,结果却是“v=0000mv"???????
adc_data_v=110;
// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here
    adc_data_v=(unsigned long)adc_data*5140/1024;    //换算成电压值
    if(adc_data_v!=volage)
    {
    volage=adc_data_v;
    buff_line_ad='v';
    buff_line_ad='=';
    buff_line_ad=volage/1000+48;
    buff_line_ad=(volage/100)%10+48;
    buff_line_ad=(volage/10)%10+48;
    buff_line_ad=volage%10+48;
    buff_line_ad='m';
    buff_line_ad='v';
    buff_line_ad='\0';
    lcd_clear();
    lcd_puts(buff_line_ad);
    }
      };
}

下面是熔丝位设置
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_472968.GIF
熔丝位 (原文件名:熔丝位.GIF)

jtiaao 发表于 2009-8-21 18:16:11

终于找到原因了,原来MEGA16和128内部的有些寄存器不一样!还是要相信datasheet

siyuanzhixing 发表于 2009-8-21 19:35:03

我也遇到了同样的问题,ad程序在16上能用128上不能用,能不能透露下怎么搞定的。一直关注你的问题呢。我的qq:905592231

machao 发表于 2009-8-22 09:59:12

最原始的资料就是datasheet,使用那个片子,一定要看它的datasheet。不同型号的AVR,内部寄存器的定义以及某些功能是不同的。

就是照搬代码,也不要偷“看datasheet”的这个懒。

jtiaao 发表于 2009-8-22 10:20:42

最近强迫自己看了一些datasheet,感觉还是很有用,之前听同学说只要照搬程序,改下头文件就可以在128里面用,遇到问题就怀疑刚拿到的板子,费了很多时间,不过后来才发现,是ADCSRA这个寄存器有变化。

machao 发表于 2009-8-22 10:32:33

"只要照搬程序,改下头文件"

永远都不会成为好的工程师

jtiaao 发表于 2009-8-22 18:13:44

马老师说的是,我用128没有仔细阅读datasheet,以为和16一样,就直接套用以前编写的程序,没想到会浪费那么多时间,最后还是得花时间看datasheet,以后要踏实一点!

feifeimao 发表于 2009-9-1 10:56:55

大家好啊    我的adc采样路数比较多 我就外接了两片4067模拟开关可是不知道使用avr来编程怎么来控制
图不好切进来我的4067的通道地址是A0A1 A2A3来控制的

而我的74373在cpld产生A0A1 A2A3    不过我的存储器也有A0A1 A2A3
页: [1]
查看完整版本: mega128的AD始终没有反应??mega16就行?