taocongrong 发表于 2012-10-29 16:30:07

taocongrong 发表于 2012-10-29 16:30:55

sco518 发表于 2012-10-29 16:52:42

你用的是什么编译器?应该是iccavr吧?   。   void init(void) . 这个括号里的void 不能省的。   你现在的程序应该会提示警告吧?

sco518 发表于 2012-10-29 16:53:53

这种小程序,没必要把 PORT_INIT()分出个函数来。直接写在主程序里不就得了。。。

taocongrong 发表于 2012-10-29 16:53:54

taocongrong 发表于 2012-10-29 16:55:57

taocongrong 发表于 2012-10-29 16:57:36

aleyn 发表于 2012-10-29 16:57:45

第一个代码,你初始化端口了之后,就一直死循环,所以是废的。
第二个代码,你就一直的初始化端口和输出同样的值,所以也是废的。
第三个代码其实就是第二个代码的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;
}
}
另外,板子不用给我,你自己留着吧。

taocongrong 发表于 2012-10-29 16:59:19

zpxa001 发表于 2012-10-29 17:00:35

建议进行以下设置:

1.关闭WDT,禁止BOD,内RC振荡器作为时钟源,取消加密,复位延时设置最大;

2.另外熔丝位M161C设置是否正确也很关键,试着把这位改成0。这位是M161兼容模式位,当芯片在不同模式时,有些功能可能不能用,比如M161模式下 UART2就不能用。

taocongrong 发表于 2012-10-29 17:04:07

sco518 发表于 2012-10-29 17:05:25

#include<iom162v.h>
#include <macros.h>
void main(void)
{
   DDRA=0XFF;
   DDRC=0XFF;
   PORTA=0X00;
   PORTC=0XFF;
   while(1);
}

你这样用万用表看一下A C 口的输出电平,能有问题我就不说什么了。

sco518 发表于 2012-10-29 17:06:51

taocongrong 发表于 2012-10-29 17:04 static/image/common/back.gif
还是一样的,给你说下现象吧!
#include
#include


囧。。。。。你自己程序写的就是PA口低电平,B C口高电平啊= =。。。。

zpxa001 发表于 2012-10-29 17:09:46

sco518 发表于 2012-10-29 17:06 static/image/common/back.gif
囧。。。。。你自己程序写的就是PA口低电平,B C口高电平啊= =。。。。 ...

是啊?{:shocked:}

sco518 发表于 2012-10-29 17:12:35

你就看一下你编译器编译以后    窗口里有没有这样的警告吧!

liangws201 发表于 2012-10-29 17:13:23

还是没有看明白!

sco518 发表于 2012-10-29 17:17:19


设置里改一下芯片型号。   。 恕我直言,这种问题显然是你对ICCAVR这个软件不了解造成的。静下心来好好检查检查,都能搞清楚的。

taocongrong 发表于 2012-10-29 17:17:35

guilty2468 发表于 2012-10-29 17:54:07

我觉得是你iccavr编译没有改芯片型号造成的。

taocongrong 发表于 2012-10-29 17:55:39

sco518 发表于 2012-10-29 18:54:47

。。。。。。。。。。。所有函数名后的括号里,不要留空!

void main(void)          void init(void)!!!!   

我都跟你说过了。

taocongrong 发表于 2012-10-29 20:56:59

sco518 发表于 2012-10-29 20:58:16

那就按警告的内容去改啊。。。

taocongrong 发表于 2012-10-29 21:07:05

taocongrong 发表于 2012-10-29 21:08:49

jimmy_xt 发表于 2012-10-29 21:40:12

taocongrong 发表于 2012-10-29 21:07 static/image/common/back.gif
我后来又买了几块atmega8515的芯片 贴上去之后,情况还是那样的 不知道为什么,调用void init(void); ...

我这里有mega8515的片子,稍等我用STK500搭个测试环境。然后写个最简单的端口赋值程序。
在我这里实验无误后,把HEX发给你,你烧录进去试试看吧

sco518 发表于 2012-10-29 21:51:58

taocongrong 发表于 2012-10-29 21:08 static/image/common/back.gif
警告的内容再编译一下又正常了,这是怎么回事呀??
你在哪里 如果在深圳 我就把我的电路板邮寄给你 ,你 ...

那还是算了吧。。。我在杭州呢。。。

基本是程序的问题。你再仔细看看吧。

jimmy_xt 发表于 2012-10-29 22:07:40

代码如下;#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文件夹下

xinhoujue 发表于 2012-10-30 17:27:29

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);
   }       
}

=你的板子,哈哈~~~~~

taocongrong 发表于 2012-10-30 19:36:13

双飞燕泡茶 发表于 2013-2-26 20:03:42

ICCAVR编译时出现的警告你不管它而又再编译一下,警告就会不出现,但你关了ICCAVR重新打开程序再编译就会有出现,就是这样的,没事

nongxiaoming 发表于 2013-2-26 20:33:22

楼主,你把程序给别人帮你编译好后发给你测试一下不就行了~还有啊,不一定是不能调用init,可能是调用的时候单片机已经硬件异常死掉了,怀疑是你的编译器设置有问题。就和在ARM一样,如果栈空间太小,也会出现这种。你给出程序,让某个有硬件的网友用自己的电脑编译测试,如果没有问题,把hex文件发出来,你来烧写看看,如果没有问题,说明还是你的编译器问题~
页: [1]
查看完整版本: atmega162 出现问题(悬赏电路板含芯片焊接好的)