[AVR单片机] 同一个程序在atmega16和atmega16L下面跑出来的结果怎么不一样啊???

[复制链接]
3335|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
你的什么样的程序?贴出来看看
  1. #include <avr/io.h>
  2. #define F_CPU        7372800UL
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5. #include <string.h>
  6. #include <util/crc16.h>
  7. #include <avr/pgmspace.h>
  8. #include <avr/wdt.h>
  9. typedef unsigned char u8;
  10. typedef unsigned int u32;
  11. #define BAUDRATE            9600UL
  12. #define POLY                0X1021
  13. /*****************************************/
  14. #define RX_BUF_SIZE            6                // receive data size
  15. #define TX_BUF_SIZE                5                // send buf
  16. #define START       0X83   //"S"
  17. #define END                    0X69 //"E"
  18. #define W_IO            0X87  //"W"
  19. #define R_IO            0X82  //"R"
  20. #define RESET                0X00        //"reset"
  21. #define FAIL            0X70  //"F"
  22. #define E_CMD                0X67   //"C"

  23. #define PA                        0X41 //A
  24. #define PB                        0X42 //B
  25. #define PC                        0X43 //C
  26. #define PD                        0x44 //D

  27. /**********************************************/
  28. #define SET(X,Y)        (X)|=(1<<(Y))
  29. #define CLI(X,Y)        (X)&=~(1<<(Y))
  30. #define enable_interrupt()        sei()
  31. #define disable_interrupt()        cli()

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



  35. static void sendbyte( u8 dat);
  36. static void send( u8 *ptr,u8 len);
  37. static void reset_mcu(void);
  38. static void set_port(u8 port,u8 bit,u8 value);
  39. static void read_port(u8 port,u8 bit);

  40. /*mcu receive data from PC buffer*/

  41. static volatile u8 rx_buf[RX_BUF_SIZE];
  42. static volatile u8 rx_flag=0;
  43. static volatile u8 rx_num=0;

  44. /*mcu transmit data to PC buffer*/

  45. static volatile u8 tx_buf[TX_BUF_SIZE];
  46. static volatile u8 tx_w_index=0;
  47. static volatile u8 tx_r_index=0;
  48. static volatile u8 tx_num=0;

  49. static volatile u8 dir_value=0xff;
  50. static volatile u8 port_value=0x00;
  51. const static volatile u8 error_p[]={FAIL,FAIL,FAIL};
  52. const static volatile u8 error_c[]={E_CMD,E_CMD,E_CMD};
  53. const static volatile u8 reset[]={RESET,RESET,RESET};


  54. void usart_init(void)
  55. {
  56.         UCSRB=0X00;
  57.         UCSRA&=~(1<<U2X);// no double baud rate
  58.    
  59.     UCSRB&=~(1<<UCSZ2);// 0 1 1 8 bit data
  60.     UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
  61.     UCSRC&=~(1<<UMSEL);// asynchronous mode
  62.     UCSRC&=~(1<<USBS);// 1 stop bit
  63.     UCSRC&=~(1<<UPM1);//no parity check
  64.         UCSRC&=~(1<<UPM0);
  65.     UCSRC&=~(1<<UCPOL);//no clock polarity

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

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

  71. }

  72. static void reset_mcu(void)
  73. {
  74.         WDTCR|=1<<WDTOE|1<<WDE;// disable watchdog;
  75.         WDTCR&=~(1<<WDE);

  76.         WDTCR=0X40;//17.1ms RESET
  77. }

  78. SIGNAL(USART_TXC_vect)
  79. {
  80. //        disable_interrupt();
  81.         if(tx_num>0)
  82.         {
  83.                 --tx_num;
  84.                 UDR=tx_buf[tx_r_index];
  85.                 ++tx_r_index;
  86.                 if(tx_r_index==TX_BUF_SIZE)
  87.                         tx_r_index=0;
  88.         }
  89. //        enable_interrupt();
  90. }

  91. static void sendbyte( u8 dat)
  92. {
  93.         while(tx_num==TX_BUF_SIZE);//
  94.         disable_interrupt();
  95.         if(tx_num!=0||!(UCSRA&(1<<UDRE)))//buffer is not empty!
  96.         {
  97.                 tx_buf[tx_w_index]=dat;
  98.                 ++tx_w_index;
  99.                 if(tx_w_index==TX_BUF_SIZE)
  100.                         tx_w_index=0;
  101.                 ++tx_num;
  102.         }
  103.         else
  104.         {
  105.                 UDR=dat;
  106.         //        while(!(UCSRA&(1<<TXC)));//
  107.         //        UCSRA|=(1<<TXC);
  108.         }
  109.         enable_interrupt();
  110. }

  111. static void send( u8 *ptr,u8 len)
  112. {       
  113.         u8 i=0;
  114.         for(i=0;i<len;i++)
  115.         {
  116.                 sendbyte(*(ptr+i));
  117.         }
  118. }

  119. SIGNAL(USART_RXC_vect)
  120. {

  121.         u8 dat=0,status=0;
  122. //        disable_interrupt();//////
  123.         status=UCSRA;
  124.         dat=UDR;
  125.         if(!rx_flag)
  126.         {
  127.                 if(!(status&(1<<FE|1<<DOR|1<<PE)))
  128.                 {
  129.                         rx_buf[rx_num]=dat;
  130.                         ++rx_num;
  131.                         if(rx_num==RX_BUF_SIZE)
  132.                         {
  133.                                 rx_num=0;
  134.                                 rx_flag=1;
  135.                         }
  136.                 }
  137.         }
  138. //        enable_interrupt();////
  139. }

  140. void set_port(u8 port,u8 bit,u8 value)
  141. {
  142.         switch(port)
  143.         {
  144.                 case PA:
  145.                         if(bit<8)
  146.                         {
  147.                                 DDRA|=(1<<bit);
  148.                                 if(value==0x01)
  149.                                         PORTA|=(1<<bit);
  150.                                 else if(value==0x00)
  151.                                         PORTA&=~(1<<bit);
  152.                                 delay_ms(1);
  153.                                 dir_value=DDRA;
  154.                                 port_value=PORTA;
  155.                         }
  156.                         break;
  157.                 case PB:
  158.                         if(bit<8)
  159.                         {
  160.                                 DDRB|=(1<<bit);
  161.                                 if(value==0x01)
  162.                                         PORTB|=(1<<bit);
  163.                                 else if(value==0x00)
  164.                                         PORTB&=~(1<<bit);
  165.                                 delay_ms(1);
  166.                                 dir_value=DDRB;
  167.                                 port_value=PORTB;
  168.                         }
  169.                         break;
  170.                    case PC:
  171.                         if(bit<8)
  172.                         {
  173.                                 DDRC|=(1<<bit);
  174.                                 if(value==0x01)
  175.                                         PORTC|=(1<<bit);
  176.                                 else if(value==0x00)
  177.                                         PORTC&=~(1<<bit);
  178.                                 delay_ms(1);
  179.                                 dir_value=DDRC;
  180.                                 port_value=PORTC;
  181.                         }
  182.                         break;
  183.                 case PD:
  184.                         if(bit>1&&bit<8)
  185.                         {
  186.                                 DDRD|=(1<<bit);
  187.                                 if(value==0x01)
  188.                                         PORTD|=(1<<bit);
  189.                                 else if(value==0x00)
  190.                                         PORTD&=~(1<<bit);
  191.                                 delay_ms(1);
  192.                                 dir_value=DDRD;
  193.                                 port_value=PORTD;
  194.                         }
  195.                         break;
  196.         default:
  197.                         break;
  198.         }
  199. }

  200. void read_port(u8 port,u8 bit)
  201. {
  202.         switch(port)
  203.         {
  204.                 case PA:
  205.                         if(bit<8)
  206.                         {
  207.                                 DDRA&=~(1<<bit);
  208.                                 PORTA|=(1<<bit);
  209.                                 delay_ms(1);//output change into input delay
  210.                                 dir_value=DDRA;
  211.                                 port_value=PINA;
  212.                         }
  213.                         break;
  214.                 case PB:
  215.                         if(bit<8)
  216.                         {
  217.                                 DDRB&=~(1<<bit);
  218.                                 PORTB|=(1<<bit);
  219.                                 delay_ms(1);//output change into input delay
  220.                                 dir_value=DDRB;
  221.                                 port_value=PINB;
  222.                         }
  223.                         break;
  224.                    case PC:
  225.                         if(bit<8)
  226.                         {
  227.                                 DDRC&=~(1<<bit);
  228.                                 PORTC|=(1<<bit);
  229.                                 delay_ms(1);//output change into input delay
  230.                                 dir_value=DDRC;
  231.                                 port_value=PINC;
  232.                         }
  233.                         break;
  234.                 case PD:
  235.                         if(bit>1&&bit<8)
  236.                         {
  237.                                 DDRD&=~(1<<bit);
  238.                                 PORTD|=(1<<bit);
  239.                                 delay_ms(1);//output change into input delay
  240.                                 dir_value=DDRD;
  241.                                 port_value=PIND;
  242.                         }
  243.                         break;
  244.         default:
  245.                         break;
  246.         }
  247. }

  248. void handle_cmd()
  249. {

  250.         if(rx_flag)
  251.         {
  252.                 if((rx_buf[0]==START)&&(rx_buf[RX_BUF_SIZE-1]==END))
  253.                 {
  254.                         switch(rx_buf[1])
  255.                         {       
  256.                                 case R_IO:
  257.                                         read_port(rx_buf[2],rx_buf[3]);
  258.                                         if((rx_buf[2]==PA||rx_buf[2]==PB||
  259.                                         rx_buf[2]==PC||rx_buf[2]==PD)&&rx_buf[3]<8)
  260.                                         {
  261.                                                 sendbyte(START);
  262.                                                 sendbyte(R_IO);
  263.                                                 sendbyte(dir_value);
  264.                                                 sendbyte(port_value);
  265.                                                 sendbyte(END);
  266.                                         }
  267.                                         break;
  268.                                 case W_IO:
  269.                                         set_port(rx_buf[2],rx_buf[3],rx_buf[4]);
  270.                                         if((rx_buf[2]==PA||rx_buf[2]==PB||
  271.                                         rx_buf[2]==PC||rx_buf[2]==PD)&&rx_buf[3]<8)
  272.                                         {
  273.                                                 sendbyte(START);
  274.                                                 sendbyte(W_IO);
  275.                                                 sendbyte(dir_value);
  276.                                                 sendbyte(port_value);
  277.                                                 sendbyte(END);
  278.                                         }
  279.                                         break;
  280.                                 case RESET:
  281.                                         sendbyte(START);
  282.                                         send((u8*)reset,3);
  283.                                         sendbyte(END);
  284.                                         reset_mcu();
  285.                                         delay_ms(50);
  286.                                         break;
  287.                                 default:
  288.                                         sendbyte(START);
  289.                                         send((u8 *)error_c,3);
  290.                                         sendbyte(END);
  291.                                         break;                                       
  292.                         }
  293.                 }
  294.                 else
  295.                 {
  296.                         sendbyte(START);
  297.                         send((u8 *)error_p,3);
  298.                         sendbyte(END);
  299.                 }
  300.         rx_flag=0;
  301.         }       
  302. }

  303. void disable_jtag(void)
  304. {
  305.         MCUCSR|=(1<<JTD);
  306.         MCUCSR|=(1<<JTD);
  307. }

  308. void init_wdt(void)
  309. {
  310.         WDTCR|=1<<WDTOE|1<<WDE;// disable watchdog;
  311.         WDTCR&=~(1<<WDE);
  312.        
  313.         WDTCR|=1<<WDE|1<<WDP2|1<<WDP1|1<<WDP0;//enable watchdog;2.1S       
  314. }

  315. void init_io(void)
  316. {
  317.        
  318.         DDRA=0XFF;
  319.         DDRB=0XFF;
  320.         DDRC=0XFF;
  321.         DDRD=0XFF;
  322.         DDRD|=(1<<DDD1);//TXD
  323.         DDRD&=~(1<<DDD0);//RXD
  324.         PORTA=0X00;
  325.         PORTB=0X00;
  326.         PORTC=0X00;
  327.         PORTD=0X03;
  328. }
  329. int main(void)
  330. {
  331.         disable_interrupt();
  332.         disable_jtag();
  333.         init_io();
  334.         usart_init();
  335.         init_wdt();
  336.         enable_interrupt();
  337.         while(1)
  338.         {
  339.                 wdt_reset();
  340.                 handle_cmd();       
  341.         }
  342.         return 0;
  343. }



这个是代码,设置的时候选的是不优化!
airwill 发表于 2013-3-14 19:53 | 显示全部楼层
一行注释都没有, 牛人的作品啊.
建议楼主, 掌握一些调试技巧, 自己搞定吧.

评分

参与人数 1威望 +6 收起 理由
qin552011373 + 6 确实如此

查看全部评分

qin552011373 发表于 2013-3-14 23:44 | 显示全部楼层
看不出来哪里的问题
 楼主| machiel 发表于 2013-3-15 08:27 | 显示全部楼层
airwill 发表于 2013-3-14 19:53
一行注释都没有, 牛人的作品啊.
建议楼主, 掌握一些调试技巧, 自己搞定吧.

额,注释全部被我删了,呵呵,我还是在线仿真一下看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

14

主题

251

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部