打印
[AVR单片机]

同一个程序在atmega16和atmega16L下面跑出来的结果怎么不一样啊???

[复制链接]
2497|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
machiel|  楼主 | 2013-3-13 19:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看书册说这两者的区别只是供电电压不一啊?怎么我同一个程序烧写进去,结果却是完全不一样呢???
是不是哪里需要设置或者什么的呀?求解答!很迷惑~自己找不到原因了。我的程序在atmega16-8pu上是可以的但是今天换了一个atmega16l-8pu下载相同的程序,板子就工作不正常了,哪位可以告诉一下这是什么情况,或者遇到过这样的情况,怎么解决的???谢谢!!!

相关帖子

沙发
qin552011373| | 2013-3-13 21:14 | 只看该作者
你的什么样的程序?贴出来看看

使用特权

评论回复
板凳
machiel|  楼主 | 2013-3-14 10:25 | 只看该作者
qin552011373 发表于 2013-3-13 21:14
你的什么样的程序?贴出来看看
#include <avr/io.h>
#define F_CPU        7372800UL
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include <util/crc16.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
typedef unsigned char u8;
typedef unsigned int u32;
#define BAUDRATE            9600UL
#define POLY                0X1021
/*****************************************/
#define RX_BUF_SIZE            6                // receive data size
#define TX_BUF_SIZE                5                // send buf
#define START       0X83   //"S"
#define END                    0X69 //"E"
#define W_IO            0X87  //"W"
#define R_IO            0X82  //"R"
#define RESET                0X00        //"reset"
#define FAIL            0X70  //"F"
#define E_CMD                0X67   //"C"

#define PA                        0X41 //A
#define PB                        0X42 //B
#define PC                        0X43 //C
#define PD                        0x44 //D

/**********************************************/
#define SET(X,Y)        (X)|=(1<<(Y))
#define CLI(X,Y)        (X)&=~(1<<(Y))
#define enable_interrupt()        sei()
#define disable_interrupt()        cli()

#define delay_us(US)        _delay_us(US)//delay time can't exceed 768us
#define delay_ms(MS)    _delay_ms(MS)//max delay time 262ms
#define delay_cycle()        asm("nop")



static void sendbyte( u8 dat);
static void send( u8 *ptr,u8 len);
static void reset_mcu(void);
static void set_port(u8 port,u8 bit,u8 value);
static void read_port(u8 port,u8 bit);

/*mcu receive data from PC buffer*/

static volatile u8 rx_buf[RX_BUF_SIZE];
static volatile u8 rx_flag=0;
static volatile u8 rx_num=0;

/*mcu transmit data to PC buffer*/

static volatile u8 tx_buf[TX_BUF_SIZE];
static volatile u8 tx_w_index=0;
static volatile u8 tx_r_index=0;
static volatile u8 tx_num=0;

static volatile u8 dir_value=0xff;
static volatile u8 port_value=0x00;
const static volatile u8 error_p[]={FAIL,FAIL,FAIL};
const static volatile u8 error_c[]={E_CMD,E_CMD,E_CMD};
const static volatile u8 reset[]={RESET,RESET,RESET};


void usart_init(void)
{
        UCSRB=0X00;
        UCSRA&=~(1<<U2X);// no double baud rate
   
    UCSRB&=~(1<<UCSZ2);// 0 1 1 8 bit data
    UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    UCSRC&=~(1<<UMSEL);// asynchronous mode
    UCSRC&=~(1<<USBS);// 1 stop bit
    UCSRC&=~(1<<UPM1);//no parity check
        UCSRC&=~(1<<UPM0);
    UCSRC&=~(1<<UCPOL);//no clock polarity

        UBRRL=(u8)((F_CPU/16/BAUDRATE)-1);
    UBRRH=(u8)(((F_CPU/16/BAUDRATE)-1)>>8); //set baud rate

          UCSRB|=(1<<TXCIE)|(1<<RXCIE)|(1<<TXEN)|(1<<RXEN);
        DDRD|=(1<<DDD1);//TXD
        DDRD&=~(1<<DDD0);//RXD

}

static void reset_mcu(void)
{
        WDTCR|=1<<WDTOE|1<<WDE;// disable watchdog;
        WDTCR&=~(1<<WDE);

        WDTCR=0X40;//17.1ms RESET
}

SIGNAL(USART_TXC_vect)
{
//        disable_interrupt();
        if(tx_num>0)
        {
                --tx_num;
                UDR=tx_buf[tx_r_index];
                ++tx_r_index;
                if(tx_r_index==TX_BUF_SIZE)
                        tx_r_index=0;
        }
//        enable_interrupt();
}

static void sendbyte( u8 dat)
{
        while(tx_num==TX_BUF_SIZE);//
        disable_interrupt();
        if(tx_num!=0||!(UCSRA&(1<<UDRE)))//buffer is not empty!
        {
                tx_buf[tx_w_index]=dat;
                ++tx_w_index;
                if(tx_w_index==TX_BUF_SIZE)
                        tx_w_index=0;
                ++tx_num;
        }
        else
        {
                UDR=dat;
        //        while(!(UCSRA&(1<<TXC)));//
        //        UCSRA|=(1<<TXC);
        }
        enable_interrupt();
}

static void send( u8 *ptr,u8 len)
{       
        u8 i=0;
        for(i=0;i<len;i++)
        {
                sendbyte(*(ptr+i));
        }
}

SIGNAL(USART_RXC_vect)
{

        u8 dat=0,status=0;
//        disable_interrupt();//////
        status=UCSRA;
        dat=UDR;
        if(!rx_flag)
        {
                if(!(status&(1<<FE|1<<DOR|1<<PE)))
                {
                        rx_buf[rx_num]=dat;
                        ++rx_num;
                        if(rx_num==RX_BUF_SIZE)
                        {
                                rx_num=0;
                                rx_flag=1;
                        }
                }
        }
//        enable_interrupt();////
}

void set_port(u8 port,u8 bit,u8 value)
{
        switch(port)
        {
                case PA:
                        if(bit<8)
                        {
                                DDRA|=(1<<bit);
                                if(value==0x01)
                                        PORTA|=(1<<bit);
                                else if(value==0x00)
                                        PORTA&=~(1<<bit);
                                delay_ms(1);
                                dir_value=DDRA;
                                port_value=PORTA;
                        }
                        break;
                case PB:
                        if(bit<8)
                        {
                                DDRB|=(1<<bit);
                                if(value==0x01)
                                        PORTB|=(1<<bit);
                                else if(value==0x00)
                                        PORTB&=~(1<<bit);
                                delay_ms(1);
                                dir_value=DDRB;
                                port_value=PORTB;
                        }
                        break;
                   case PC:
                        if(bit<8)
                        {
                                DDRC|=(1<<bit);
                                if(value==0x01)
                                        PORTC|=(1<<bit);
                                else if(value==0x00)
                                        PORTC&=~(1<<bit);
                                delay_ms(1);
                                dir_value=DDRC;
                                port_value=PORTC;
                        }
                        break;
                case PD:
                        if(bit>1&&bit<8)
                        {
                                DDRD|=(1<<bit);
                                if(value==0x01)
                                        PORTD|=(1<<bit);
                                else if(value==0x00)
                                        PORTD&=~(1<<bit);
                                delay_ms(1);
                                dir_value=DDRD;
                                port_value=PORTD;
                        }
                        break;
        default:
                        break;
        }
}

void read_port(u8 port,u8 bit)
{
        switch(port)
        {
                case PA:
                        if(bit<8)
                        {
                                DDRA&=~(1<<bit);
                                PORTA|=(1<<bit);
                                delay_ms(1);//output change into input delay
                                dir_value=DDRA;
                                port_value=PINA;
                        }
                        break;
                case PB:
                        if(bit<8)
                        {
                                DDRB&=~(1<<bit);
                                PORTB|=(1<<bit);
                                delay_ms(1);//output change into input delay
                                dir_value=DDRB;
                                port_value=PINB;
                        }
                        break;
                   case PC:
                        if(bit<8)
                        {
                                DDRC&=~(1<<bit);
                                PORTC|=(1<<bit);
                                delay_ms(1);//output change into input delay
                                dir_value=DDRC;
                                port_value=PINC;
                        }
                        break;
                case PD:
                        if(bit>1&&bit<8)
                        {
                                DDRD&=~(1<<bit);
                                PORTD|=(1<<bit);
                                delay_ms(1);//output change into input delay
                                dir_value=DDRD;
                                port_value=PIND;
                        }
                        break;
        default:
                        break;
        }
}

void handle_cmd()
{

        if(rx_flag)
        {
                if((rx_buf[0]==START)&&(rx_buf[RX_BUF_SIZE-1]==END))
                {
                        switch(rx_buf[1])
                        {       
                                case R_IO:
                                        read_port(rx_buf[2],rx_buf[3]);
                                        if((rx_buf[2]==PA||rx_buf[2]==PB||
                                        rx_buf[2]==PC||rx_buf[2]==PD)&&rx_buf[3]<8)
                                        {
                                                sendbyte(START);
                                                sendbyte(R_IO);
                                                sendbyte(dir_value);
                                                sendbyte(port_value);
                                                sendbyte(END);
                                        }
                                        break;
                                case W_IO:
                                        set_port(rx_buf[2],rx_buf[3],rx_buf[4]);
                                        if((rx_buf[2]==PA||rx_buf[2]==PB||
                                        rx_buf[2]==PC||rx_buf[2]==PD)&&rx_buf[3]<8)
                                        {
                                                sendbyte(START);
                                                sendbyte(W_IO);
                                                sendbyte(dir_value);
                                                sendbyte(port_value);
                                                sendbyte(END);
                                        }
                                        break;
                                case RESET:
                                        sendbyte(START);
                                        send((u8*)reset,3);
                                        sendbyte(END);
                                        reset_mcu();
                                        delay_ms(50);
                                        break;
                                default:
                                        sendbyte(START);
                                        send((u8 *)error_c,3);
                                        sendbyte(END);
                                        break;                                       
                        }
                }
                else
                {
                        sendbyte(START);
                        send((u8 *)error_p,3);
                        sendbyte(END);
                }
        rx_flag=0;
        }       
}

void disable_jtag(void)
{
        MCUCSR|=(1<<JTD);
        MCUCSR|=(1<<JTD);
}

void init_wdt(void)
{
        WDTCR|=1<<WDTOE|1<<WDE;// disable watchdog;
        WDTCR&=~(1<<WDE);
       
        WDTCR|=1<<WDE|1<<WDP2|1<<WDP1|1<<WDP0;//enable watchdog;2.1S       
}

void init_io(void)
{
       
        DDRA=0XFF;
        DDRB=0XFF;
        DDRC=0XFF;
        DDRD=0XFF;
        DDRD|=(1<<DDD1);//TXD
        DDRD&=~(1<<DDD0);//RXD
        PORTA=0X00;
        PORTB=0X00;
        PORTC=0X00;
        PORTD=0X03;
}
int main(void)
{
        disable_interrupt();
        disable_jtag();
        init_io();
        usart_init();
        init_wdt();
        enable_interrupt();
        while(1)
        {
                wdt_reset();
                handle_cmd();       
        }
        return 0;
}



这个是代码,设置的时候选的是不优化!

使用特权

评论回复
地板
airwill| | 2013-3-14 19:53 | 只看该作者
一行注释都没有, 牛人的作品啊.
建议楼主, 掌握一些调试技巧, 自己搞定吧.

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 确实如此
5
qin552011373| | 2013-3-14 23:44 | 只看该作者
看不出来哪里的问题

使用特权

评论回复
6
machiel|  楼主 | 2013-3-15 08:27 | 只看该作者
airwill 发表于 2013-3-14 19:53
一行注释都没有, 牛人的作品啊.
建议楼主, 掌握一些调试技巧, 自己搞定吧.

额,注释全部被我删了,呵呵,我还是在线仿真一下看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:正在努力进化的小菜....

14

主题

252

帖子

1

粉丝