gaochaoning 发表于 2008-8-17 08:56:00

程序改成只有几行了,在avr studio中main()中的语句不能单步运行,去掉g()函数又可以了

我用的是cvavr编译没有出现问题,软件调试使用avr studio 4.12。使用jtagice.
#include <mega16.h>
void g (void)         
{
    unsigned char data1=0;   
    PORTB&=0x00;       //B口初始化,RS=R/W=0.      
    PORTB|=0x04;          //E=1
    PORTB=data1;          //按8位写入
    PORTB&=0xf3;         //E=0
    PORTB&=0x00;
    data1=0b00101000;      //功能设置指令代码
}               
void main(void)
{
   unsigned char data1;
   DDRB=0x00;
   data1=0x30;          //功能设置指令代码      
   data1&=0xf0;                                 
   PORTB|=0x04;          //E=1                  
   PORTB=data1;          //按8位写入                   单步走这句会跳过         
   PORTB&=0xf3;         //E=0                        同上   
   PORTB&=0x00;                                        同上
   g ( ) ;
}

knight_avr 发表于 2008-8-17 09:07:16

g 后面是不是有一个空格 或者后面的括号是中文括号

gaochaoning 发表于 2008-8-17 09:36:52

g后面的空格去掉了。g() 函数在英文状态下重新写了一遍,还是不行。谢谢你的指点。还有其他的可能吗?我一个个试试。

117433525 发表于 2008-8-17 11:18:33

在G后面加两个空指令,或做一个while循环。
你这程序G函数完成后将会失去控制。

aviator 发表于 2008-8-17 12:07:04

是否和编译的优化有关系?

gaochaoning 发表于 2008-8-17 14:22:36

试验了许多次,在加了延时语句//*********后。main()、g()中的语句都可以单步走了。其中的道理不知为何?

#include <mega16.h>
#include <delay.h>
void g(void)         
{
    unsigned char data1=0xff;   
    PORTB&=0x00;       //B口初始化,RS=R/W=0.         
    PORTB|=0x04;          //E=1
    PORTB=data1;          //按8位写入
    PORTB&=0xf3;         //E=0
    delay_us(1);         //********
    PORTB=data1;
    PORTB&=0x00;
    data1=0b00101000;      //功能设置指令代码   
}               
void main(void)
{
   unsigned char data1=0x00;
   DDRB=0xff;   
   data1=0x30;          //功能设置指令代码      
   data1&=0xf0;                                 
   PORTB|=0x04;          //E=1
   PORTB=data1;          //按8位写入            
   PORTB&=0xf3;         //E=0                  
   PORTB=data1;
   PORTB&=0x00;                              
   g();
   while(1);
}

gaochaoning 发表于 2008-8-17 16:59:20

下面这段程序为了能实现单步运行在语句中也加了许多延时语句。
我用的系统是:xp+cvavr+avr studio+软件仿真。您可以试一下,在您的机器上不加延时是否可单步运行。

/*****************************************************
Chip type         : ATmega16
Program type      : Application
Clock frequency   : 4.000000 MHz
Memory model      : Small
External SRAM size: 0
Data Stack size   : 256
*****************************************************/

#include <mega16.h>
#include<delay.h>
/*
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

// Declare your global variables here
/*******************************
*读忙标志BF和地址计数器AC
********************************/
void read_bf_and_ac()   //读bf和ac
{
    unsigned char data1=0x88,data2=0x99,data3;
    PORTB&=0x00;        //B口初始化,RS=R/W=0.
    PORTB|=0x02;        //R/W=1,RS=0.
    DDRB=0x07;          //?
    PORTB|=0x04;      //数据口为输入状态E=1.
    delay_ms(2);
    data1=PORTB;      //第1次读出的为数据的高4位.
    PORTB&=0x03;      //E=0.
    data1&=0xf0;      //取高4位
    data2=data1;      //保存数据
    PORTB|=0xf4;      //E=1
    delay_ms(2);
    data1=PORTB;      //第2次读出的为数据的低4位
    PORTB&=0x03 ;      //E=0
    data1&=0xf0;         //取数
    data1>>=4;         //高4位移至低4位
    data3=data1|data2;//合成数据
}
   
/*******************************
*写指令函数
*指令代码放在data1中
********************************/
void write_command(unsigned char data1)         
{
    unsigned char data2;      
    PORTB&=0x00;       //B口初始化,RS=R/W=0.
    while(PINB.7);       //等待忙标志BF为0,0表示空闲
    delay_ms(1);
    data2=data1;
    data2&=0xf0;         //保留高4位
    delay_ms(1);
    PORTB|=0x04;         //RS=R/W=0, E=1
    PORTB=data2;         //第1次写出指令代码的高4位
    delay_ms(1);
    PORTB&=0xf3;         //E=0
    PORTB&=0x07;         //数据线复位
    delay_ms(1);
    data2=data1;
    data2<<=4;         //data2中低4位移至高4位
    delay_ms(1);
    PORTB|=0x04;         //E=1
    delay_ms(2);
    PORTB=data2;         //第2次写出指令代码的低4位
    delay_ms(1);
    PORTB&=0xf3;         //E=0
    PORTB&=0x00;            
}

/*******************************
*写数据函数
*数据放在data1中
********************************/
void write_data(unsigned char data1)         
{
    unsigned chardata2=0x99;
    PORTB&=0x00;       //B口初始化,RS=R/W=0.
    while(PINB.7);       //等待忙标志BF为0,0表示空闲
    PORTB|=0x01;         //RS=1,R/W=0
    data2=data1;
    data2&=0xf0;         //保留高4位
    PORTB|=0x04;         //RS=R/W=0, E=1
    delay_ms(2);
    PORTB=data2;         //第1次写出指令代码的高4位
    PORTB&=0xf3;         //E=0
    PORTB&=0x07;         //数据线复位
    data2=data1;
    data2<<=4;         //data2中低4位移至高4位
    PORTB|=0x04;         //E=1
    delay_ms(2);
    PORTB=data2;         //第2次写出指令代码的低4位
    PORTB&=0xf3;         //E=0
    PORTB&=0x00;            
}

/*******************************
*读数据函数
*
********************************/
void read_data( )         
{
    unsigned chardata1,data2=0x99,data3;   
    PORTB&=0x00;       //B口初始化,RS=R/W=0.
    while(PINB.7);       //等待忙标志BF为0,0表示空闲
    PORTB|=0x02;        //R/W=1,RS=0.
    DDRB=0x04;          //数据口为输入状态E=1.
    data1=PORTB;      //第1次读出的为数据的高4位.
    PORTB&=0x03;      //E=0.
    data1&=0xf0;      //取高4位
    data2=data1;      //保存数据
    PORTB|=0xf4;      //E=1
    delay_ms(2);
    data1=PORTB;      //第2次读出的为数据的低4位
    PORTB&=0x03;      //E=0
    data1&=0xf0;         //取数
    data1>>=4;         //高4位移至低4位
    data3=data1|data2;   //合成数据            
}

/*******************************
*软件初始化
*
********************************/

void g_lcd_init(void)         
{
    unsigned char data1, i;   
    PORTB&=0x00;       //B口初始化,RS=R/W=0.      
    for(i=0;i<3;i++)                                 
    {                                             
      data1=0x30;          //功能设置指令代码      
      data1&=0xf0;                                 
      PORTB|=0x04;          //E=1                  
      PORTB=data1;          //按8位写入            
      delay_ms(1);
      PORTB&=0xf3;         //E=0                     
      delay_ms(1);
      PORTB&=0x00;                                 
      delay_ms(1);                                 
    }                                             
    data1=0x20;          //功能设置指令代码
    data1&=0xf0;
    PORTB|=0x04;          //E=1
    delay_us(1);
    PORTB=data1;          //按8位写入
    delay_us(1);
    PORTB&=0xf3;         //E=0
    delay_us(1);
    PORTB&=0x00;
    data1=0b00101000;       //功能设置指令代码
   
    write_command( data1 );
    /*********************
   *0x01清屏指令代码
   **********************/
    data1=0x01;            //清屏指令代码
    write_command( data1 );
   /*********************
    *0x06输入方式指令代码
    **********************/
    data1=0x06;            //输入方式指令代码
    write_command( data1 );
    /*********************
   *0x0e显示方式指令代码
   **********************/
    data1=0x06;            //0x0e显示方式指令代码
    write_command( data1 );      
}               
   

void main(void)
{
   unsigned char data1;
      DDRB=0x0f;
      data1=0x30;         //功能设置指令代码      
      data1&=0xf0;                                 
      PORTB|=0x04;          //E=1                  
      PORTB=data1;          //按8位写入            
      PORTB&=0xf3;          //E=0               
      PORTB&=0x00;
   
   g_lcd_init( ) ;
   write_data(0x02);
   read_data( );
   read_bf_and_ac();
    while(1);
}

zuigz 发表于 2008-8-18 18:38:58

你用的单步应该是‘Step Over’而不是‘Step into’吧,‘Step Into’不加while循环应该也可以进去的,如果用‘Step Over’,调试器的动作是这样的: 找到g()的后一条语句,设置断点,然后全速运行。 但是你g()后面没有指令了,设置断点错误,所以全速运行就跑飞了。

gaochaoning 发表于 2008-8-19 14:22:53

当优化为LOW最低时,我认为用Step into应该能执行每一行的语句。现在可不是这样的。
页: [1]
查看完整版本: 程序改成只有几行了,在avr studio中main()中的语句不能单步运行,去掉g()函数又可以了