lanpad 发表于 2012-11-4 21:52:14

马老师,能否帮忙看一下这段程序里的问题?长.....

#include <iom128v.h>
#include <macros.h>
#include <limits.h>
#include "parme.h"

#define uchar unsigned char      //定义无符号字符为 uchar
#define uintunsigned int       //定义无符号整型
#define ulong unsigned long

uint cord = 53326;;//全局变量

ulong trans()
{
   ulong dtr;

   dtr = (ulong)compute(cord);//
   
   usart0_char_send(dtr>>24);/////通过单片机串口返回计算结果观察
   usart0_char_send(dtr>>16);/////通过单片机串口返回计算结果观察
   usart0_char_send(dtr>>8);/////通过单片机串口返回计算结果观察
   usart0_char_send(dtr);/////通过单片机串口返回计算结果观察
}

ulong compute(uint data)//test
{
ulong result;

result = (ulong)data*(ulong)(data+1);

return(result);

}


void main()
{
trans();

}


上面的例子的计算结果应当是:53326*53327 = 0xA97FA812
可是串口返回的结果从高位至低位是:0xFF 0xFF 0xA8 0x12
高16位全变成了 “1”

有人跟我说在C51平台下测试程序是没问题的
是不是跟硬件平台有关?

这段程序是在AVR单片机上跑的

开发环境是ICCAVR

lanpad 发表于 2012-11-4 21:57:14

单独定义了一个测试数据

ulong dr = 0xA97FA812;

usart0_char_send(dr>>24);/////通过单片机串口返回计算结果观察
   usart0_char_send(dr>>16);/////通过单片机串口返回计算结果观察
   usart0_char_send(dr>>8);/////通过单片机串口返回计算结果观察
   usart0_char_send(dr);/////通过单片机串口返回计算结果观察

输出结果是正确的

lanpad 发表于 2012-11-4 22:14:10

完整程序如下,硬件平台是ATmega128,环境是ICCAVR

#include <iom128v.h>
#include <macros.h>
#include <limits.h>

#define uchar unsigned char      //定义无符号字符为 uchar
#define uintunsigned int       //定义无符号整型
#define ulong unsigned long

uint cord = 53326;;//全局变量

ulong dr = 0xA97FA812;

//****************发送一个字符,查询方式******************************
void usart0_char_send(uchar i)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=i;
}



/******************端口初始化*******************************/
void port_init(void)
{
PORTA = (1<<PA7)|(1<<PA6)|(1<<PA5);
DDRA= 0xE0;
PORTB = 0xFF;
DDRB= 0xFF;
PORTC = 0xFF;
DDRC= 0x00;
PORTD = 0xFF;
DDRD= 0x08;//设置RXD1和TXD1
PORTE = 0xFF;   
DDRE= 0x02;//设置RXD0和TXD0
//PORTF = 0x00;
// DDRF= 0xE0;//设置ADRO和ADRI
// PORTF = (1<<PF7)|(1<<PF6)|(1<<PF5);
DDRF= 0x00;//设置ADRO和ADRI
PORTF = 0xFF;
PORTG = 0xFF;
DDRG= 0x00;
}
/******************初始器件**************************************/
void init_devices(void)
{
port_init();
usart0_init();
usart1_init();
}
/*****************串口初始化*********************************/
void usart0_init(void)
{
UCSR0B = 0x00;                     //禁止发送和接收
UCSR0A = 0x02;                     //倍速异步模式USX0=1
UCSR0C = 0x06;                     //0000 0110,8位字符,1位停止位,无校验
UBRR0L = 0x1F;                     //波特率 4800
UBRR0H = 0x01;                     //参见ATMAGE128使用手册
UCSR0B = (1 << TXEN0) | (1 << RXEN0) | (1 << RXCIE0) | (1 << TXCIE0) ; //允许发送和接收,接收和发送结束中断使能(写成UCSR0B = 0xD8也可以 ;)
}
void usart1_init(void)
{
UCSR1B = 0x00;                     //禁止发送和接收
UCSR1A = 0x02;                     //倍速异步模式USX1=1
UCSR1C = 0x06;                     //0000 0110,8位字符,1位停止位,无校验
UBRR1L = 0x17;                     //波特率 9600*6
UBRR1H = 0x00;                     //参见ATMAGE128使用手册
UCSR1B = (1 << TXEN1) | (1 << RXEN1) | (1 << RXCIE1) | (1 << TXCIE1) ;//允许发送和接收,接收和发送结束中断使能(写成UCSR1B = 0xD8也可以 ;)
}

ulong trans()
{
       ulong dtr;

   dtr = (ulong)compute(cord);//
   
   usart0_char_send(dtr>>24);
   usart0_char_send(dtr>>16);
   usart0_char_send(dtr>>8);
   usart0_char_send(dtr);
}

ulong compute(uint data)//test
{
        ulong result;
//        uchar r1,r2,r3,r4;
       
        result = (ulong)data*(ulong)(((ulong)data)+1);
       
//        r1 = result;
//        r2 = (result>>8);
//        r3 = (result>>16);
//        r4 = (result>>24);
       
        return(result);
       
}


voidmain()
{

init_devices();

        trans();

   
}


我觉得是硬件平台的原因,或是编译器的问题


页: [1]
查看完整版本: 马老师,能否帮忙看一下这段程序里的问题?长.....