第二个代码,你就一直的初始化端口和输出同样的值,所以也是废的。
第三个代码其实就是第二个代码的Refactory而已。
如果你要写个流水灯程序的话,你改成这样就可以了:#include<iom162v.h>
#include <macros.h>
void main()
{
char flag=0;
DDRA=0XFF;
DDRC=0XFF;
while(1)
{
if (flag)
{
PORTA=0X00;
PORTC=0XFF;
}
else
{
PORTA=0XFF;
PORTC=0X00;
}
flag = 1-flag;
}
}
另外,板子不用给我,你自己留着吧。 建议进行以下设置:
1.关闭WDT,禁止BOD,内RC振荡器作为时钟源,取消加密,复位延时设置最大;
2.另外熔丝位M161C设置是否正确也很关键,试着把这位改成0。这位是M161兼容模式位,当芯片在不同模式时,有些功能可能不能用,比如M161模式下 UART2就不能用。 #include<iom162v.h>
#include <macros.h>
void main(void)
{
DDRA=0XFF;
DDRC=0XFF;
PORTA=0X00;
PORTC=0XFF;
while(1);
}
你这样用万用表看一下A C 口的输出电平,能有问题我就不说什么了。 taocongrong 发表于 2012-10-29 17:04 static/image/common/back.gif
还是一样的,给你说下现象吧!
#include
#include
囧。。。。。你自己程序写的就是PA口低电平,B C口高电平啊= =。。。。 sco518 发表于 2012-10-29 17:06 static/image/common/back.gif
囧。。。。。你自己程序写的就是PA口低电平,B C口高电平啊= =。。。。 ...
是啊?{:shocked:} 你就看一下你编译器编译以后 窗口里有没有这样的警告吧!
还是没有看明白!
设置里改一下芯片型号。 。 恕我直言,这种问题显然是你对ICCAVR这个软件不了解造成的。静下心来好好检查检查,都能搞清楚的。
我觉得是你iccavr编译没有改芯片型号造成的。 。。。。。。。。。。。所有函数名后的括号里,不要留空!
void main(void) void init(void)!!!!
我都跟你说过了。 那就按警告的内容去改啊。。。 taocongrong 发表于 2012-10-29 21:07 static/image/common/back.gif
我后来又买了几块atmega8515的芯片 贴上去之后,情况还是那样的 不知道为什么,调用void init(void); ...
我这里有mega8515的片子,稍等我用STK500搭个测试环境。然后写个最简单的端口赋值程序。
在我这里实验无误后,把HEX发给你,你烧录进去试试看吧 taocongrong 发表于 2012-10-29 21:08 static/image/common/back.gif
警告的内容再编译一下又正常了,这是怎么回事呀??
你在哪里 如果在深圳 我就把我的电路板邮寄给你 ,你 ...
那还是算了吧。。。我在杭州呢。。。
基本是程序的问题。你再仔细看看吧。 代码如下;#define F_CPU 8000000UL
#include "avr/io.h"
#include "util/delay.h"
void port_init(void)
{
DDRA = 0xFF;
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0xFF;
}
int main(void)
{
port_init();
while(1)
{
_delay_ms(100);
PORTA = ~(PORTA);
PORTB++;
}
}实测PORTA上为5.129Hz的稳定方波。
PORTB0上为5.129Hz,剩余依次减半。
PORTC全为10+mV。
PORTD全为4.82V
供电电压实测4.82V。
内部8M RC振荡器,熔丝如下图
未编辑锁定位
HEX在.:\AVRGCC1\Debug文件夹下 taocongrong 发表于 2012-10-29 17:04 static/image/common/back.gif
还是一样的,给你说下现象吧!
#include
#include
我来解答一下吧{:smile:}
释疑程序一
#include <iom162v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void init(void)//这个函数有个小问题,见释疑程序二
{
DDRA=0XFF;
DDRB=0XFF;
DDRC=0XFF;
}
void main() {
//下面3行与init()函数相同,可以删除
DDRA=0XFF;
DDRB=0XFF;
DDRC=0XFF;
//整个程序里没有 init()函数 !
while(1) {
/**************************************************
你这里设置PORTA=0x00;即PA口为低电平,PA口自然是低电平了;
你可以改为下面3行,即PA,PB和PC均为低电平试试看!
PORTA=0x00;
PORTB=0x00;
PORTC=0x00;
**************************************************/
PORTC=0Xff;
PORTA=0X00;
PORTB=0XFF;
}
}
上面这个函数出现了PORTA是低电平,而PORTC 和PORTB是高电平 ,奇怪吧 ,我单片机买了两家了 都是这样的
释疑程序二:
#include <iom162v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
void init(void)
{
/********************************************************
AVR单片机配置I/O口应该将
【方向控制寄存器DDRx和数据寄存器PORTx同时设置】,可改为:
DDRA=0XFF;
PORTA=0xff;
DDRB=0XFF;
PORTB=0xff;
DDRC=0XFF;
PORTC=0xff;//3个端口均为高电平
***********************下面3行无用矣***********************/
DDRA=0XFF;
DDRB=0XFF;
DDRC=0XFF;
}
void main()
{
init();//在进入【死循环】之前init()函数已经被调用了,你怎么说没有呢?!
while(1)
{ //这里就是I/O口输出状态了,谁【=0x00】,谁就是【低电平】
PORTA=0X00;
PORTB=0XFF;
PORTC=0X00; //我修改了~~~~~
}
}
这个代码出现PORTB为低电平,PORTC位低电平,相当于无法调用init()这个函数!
//上面的程序你可以重新编译下,I/O口应该是【PA口和PC口为低电平;PB口为高电平】就对了!
另外,再发个小测试程序给你吧.如果还有不会的或不懂得可+QQ【266AA51F】,你懂得~~~~~要注明是坛里的哦~~~~~一般不加人滴
#include <iom162v.h>
#include <macros.h>
#define uint unsigned int
void Delay_ms(uint xms)//延时函数
{
int i,j;
for(i=0;i<xms;i++)
{
for(j=0;j<1140;j++) ;
}
}
void port_init (void)//端口初始化函数
{
DDRA=0XFF;
PORTA=0xff;
DDRB=0XFF;
PORTB=0xff;
DDRC=0XFF;
PORTC=0xff;
}
void main (void)//主函数
{
port_init();//不解释~~~~~你懂得 文方~~~~~
while(1)//哈哈,木技术含量的跑马灯~~~~~从PA0~PA7---->PB0~PB0---->PC0~PC7反复循环~~~~~
{
PORTA=0xFE;
Delay_ms(500);
PORTA=0xFD;
Delay_ms(500);
PORTA=0xFB;
Delay_ms(500);
PORTA=0xF7;
Delay_ms(500);
PORTA=0xEF;
Delay_ms(500);
PORTA=0xDF;
Delay_ms(500);
PORTA=0xBF;
Delay_ms(500);
PORTA=0x7F;
Delay_ms(500);
PORTB=0xFE;
Delay_ms(500);
PORTB=0xFD;
Delay_ms(500);
PORTB=0xFB;
Delay_ms(500);
PORTB=0xF7;
Delay_ms(500);
PORTB=0xEF;
Delay_ms(500);
PORTB=0xDF;
Delay_ms(500);
PORTB=0xBF;
Delay_ms(500);
PORTB=0x7F;
Delay_ms(500);
PORTC=0xFE;
Delay_ms(500);
PORTC=0xFD;
Delay_ms(500);
PORTC=0xFB;
Delay_ms(500);
PORTC=0xF7;
Delay_ms(500);
PORTC=0xEF;
Delay_ms(500);
PORTC=0xDF;
Delay_ms(500);
PORTC=0xBF;
Delay_ms(500);
PORTC=0x7F;
Delay_ms(500);
}
}
=你的板子,哈哈~~~~~ ICCAVR编译时出现的警告你不管它而又再编译一下,警告就会不出现,但你关了ICCAVR重新打开程序再编译就会有出现,就是这样的,没事 楼主,你把程序给别人帮你编译好后发给你测试一下不就行了~还有啊,不一定是不能调用init,可能是调用的时候单片机已经硬件异常死掉了,怀疑是你的编译器设置有问题。就和在ARM一样,如果栈空间太小,也会出现这种。你给出程序,让某个有硬件的网友用自己的电脑编译测试,如果没有问题,把hex文件发出来,你来烧写看看,如果没有问题,说明还是你的编译器问题~
页:
[1]