3449|6

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一个AVR的片内AD从ICC移植都WINAVR [复制链接]

移植过来也无非就是改一下头文件和中断,再加个Makefile,以下是我改的,真的无处可改了,就是不行。

//ICC-AVR application builder : 2009-3-10 14:59:10
// Target : M8
// Crystal: 8.0000Mhz

#include
#include

void port_init(void)
{
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

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

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
sei(); //re-enable interrupts
//all peripherals are now initialized
}

/************************************
用    途:微秒级延时程序
Taget   :mega8
crystal :8M
介    绍:在8M的晶振上进行us级的延时
入口参数:
*************************************/
void delay_us(int time)
{
    do
    {
        time--;
    }
    while (time > 1);
}


/************************************
用    途:两位数码管显示一个数
Taget   :mega8
crystal :8M
介    绍:共阳数码管
                   1-PC1(片选)
                 2-PC0
                 -----
                 a-PB0(数据)
                 b-PB1
                 ...
                 h-PB6
                 DP-PB7
入口参数:要显示的数,十进制表示
*************************************/
const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void show_2_digit(unsigned char digi)
{
unsigned char i;
DDRD=0xff;
DDRB=0xff;
PORTD=0;//关片选
PORTB=~num[(unsigned char )(digi/10)];//显示十位
PORTD=(0x1<<1);//开十位的显示
delay_us(200);
PORTD=0;//关显示
PORTB=~num[(unsigned char )(digi%10)];//显示个位
PORTD=(0x1<<0);//开个位的显示
delay_us(200);
PORTD=0x0;//关显示
}

/************************************
用    途:adc初始化
target  :atmega8
crystal :8M
介    绍:ADC0端口输入
                   10位精度,最高为5V
入口参数:
出口参数:
*************************************/
void adc_init(void)
{
ACSR=0x80;//关掉模拟比较器的电源(禁用模拟比较器)
ADMUX=(1<                   //ADMUX=7,6参考电源选择,5左对齐选择,3-0输入端口选择
ADCSRA=(1<                                   //ADCSRA=7,adc使能,6,adc开始转换,5,连续转换模式选择
                  //4,中断标志,3,中断允许,2-0,预分频选择
SFIOR=0x00;//4,adc高速模式选择
}

/************************************
用    途:进行一次adc转换
target  :atmega8
crystal :8M
介    绍:10位精度
入口参数:
出口参数:电压值(0-50)表示0-5.0V
*************************************/
unsigned char adc_get(void)
{
unsigned int temp;

ADCSRA|=(1< while(!(ADCSR&(1< ADCSR|=(1< temp=ADC;//读数
temp=temp*51/0x03ff;//转换成0-50(表示0-5.0)
return (unsigned char)(temp);
}

int main(void)
{
port_init();
init_devices();

adc_init();
while(1)
{
  show_2_digit(adc_get());
}
}

最新回复

我以前也用proteus仿真过一次AD,但是结果也不是很好。。。 别用仿真,来真的,proteus出问题是经常的。。。  详情 回复 发表于 2010-5-21 20:45
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
现象是什么?
好像是头文件没有引用对!
IOM8V.H
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主也没说你的问题是什么啊?直接粘个程序上来让别人看吗?

调试AD时要注意参考电压是否接好了,我用AVR的AD时也出现过问题,好像都是参考电压没弄好。
还有就是我以前用ICCAVR,无论如何改程序,编译下载后现象就是不变,没办法,只能另建一个工程就OK了,也不知道为什么。。。。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
我在ICC下是没问题,也可以用proteus仿真出来,其实是很简单的一个模块,AD读电位器电压然后显示在LED上,我移植到WINAVR里也可以编译,没有错误,仿真就不行了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
上面代码只是换了个环境而已,什么都没变,在WINAVR里直接包含io.h就行了
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
现象就是LED都不亮,那段LED的显示代码用了N次,不可能出问题的。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
我以前也用proteus仿真过一次AD,但是结果也不是很好。。。
别用仿真,来真的,proteus出问题是经常的。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表