BUG no MAKE32?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

BUG no MAKE32?

Mensagempor ronnei » 05 Ago 2008 09:45

Ola Amigos do forum, estou desenvolvendo um projeto com PIC 16f628 e o compilador MPLAB 7.6 utilizando o CCS 4.013, vi um exemplo aqui no forum de como "quebrar" uma variavel de 32 bits em 4 variaveis de 8 bits utilizando o MAKE8 e depois juntar com o MAKE32, bati cabeca 1 dia todo fazendo testes e o valor depois de juntar estava errado, debugando pelo MBPLAB o valor ficava correto, quando passava para o PIC e imprimia na porta serial ele mostrava outro valor apos juntar as 4 variaveis, depois de muito me extressar, percebi que isso acontecia quando o valor enviado para ser quebrado nao utilizava os 32 bits, exemplo, eu mandei o valor 12000, quando percebi isso enviei o numero 4294967295 que seria o maximo que um 32 poderia suportar, ai a funcao passou a funcionar, troquei a variavel para um int16 e usei o make16 e funcionou com o numero 12000, alguem ja passou por isso? Isso é normal? OU seja, eu terei que verificar se o numero é 16 ou 32 e utilizar funcoes diferentes, ou eu que estou fazendo algo errado?

Obrigado pela atenção. Segue abaixo o codigo de teste

Código: Selecionar todos

 unsigned int temp1,temp2,temp3,temp4;
 int32 year;

       year=12000;
   temp4=make8(year,0);
    temp3=make8(year,1);
        temp2=make8(year,2);
        temp1=make8(year,3);

    year=0;
   year= make32 (temp1,temp2,temp3,temp4);
    printf("%Lu\r\n",year);
ronnei
Bit
 
Mensagens: 17
Registrado em: 04 Ago 2008 10:01

Mensagempor ze » 05 Ago 2008 10:27

oi, ouvi dizer que dá pra fazer faacim faacim (sotaque mineiro) com "union". Alguma alma caridosa poderá lhe (nos) ensinar.....
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ronnei » 05 Ago 2008 10:43

Certo Lellis, mas eu ja fiz, utilizando o Mak16, a duvida em questao é se isso é um BUG da funcao make32 ou eu que nao entendi direito a funcao dela? rsrsrs. Pois mesmo sendo um numero menor que 32 bits ele foi armazenado em uma var de 32, portanto a funcao deveria funcionar. Correto?

Obrigado pela atenção
ronnei
Bit
 
Mensagens: 17
Registrado em: 04 Ago 2008 10:01

Mensagempor joao » 05 Ago 2008 17:41

Ola Ronnei,

Olha, Nunca usei o MAKEX, mas acho que isso pode ser problema de "little end" e "big end"

Isso varia de produto para produto, mas a idéia principal é que em ambos, se vc cria um int32, como:
int32 a;

Como é 32 bits, temos então 4 bytes:
Byte3 Byte2 Byte1 Byte0

Mas no little end, o valor menos significativo vai estar na posicao mais baixa da memoria
Byte0
Byte1
Byte2
Byte3

E intel usa assim.

Mas os big ends armazenam de outra maneira: o valor mais significativo é armazenado no começo dos bytes.
Byte3
Byte2
Byte1
Byte0

Notou a diferença?
O que pode estar acontecendo que vc está tentando montar de maneira errada com o make32.
tente fazer isso:
Código: Selecionar todos
year= make32 (temp4,temp3,temp2,temp1);


Quem sabe só isso já resolva o seu problema!
quanto a mais explicações sobre o assunto, nada melhor do que nosso querido wikipedia:
http://pt.wikipedia.org/wiki/Extremidade_(ordena%C3%A7%C3%A3o)

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor B-EAGLE » 05 Ago 2008 18:10

olá ronnei, como o lellis falou, dá pra utilizar o UNION, funciona da seguinte forma:

typedef union u{
float ft;
unsigned char c[4];
}un;


quando você criar uma variável do tipo UN, ela poderá ser acessada como float, ou como um array de 4 char's.

exemplo:

un var;

var.ft > acesso por float nessa variável
var.c[0-3] > acesso aos bytes individiais do float ou do array de 4 chars..


o union serve para colocar dois ou mais tipos de dados no mesmo endereço de memória a grosso modo...


abraço!
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Mensagempor ronnei » 06 Ago 2008 08:54

Ola B-eagle e Joao, agradeco as dicas, mas quanto a mandar errado nao é porque eu tentei inverter as variaveis na hora de montar e deu a mesma coisa, e no compilador com o DEBUG funciona, de qualquer forma eu resolvi usando um make16 ja que os valores nao iriam ultrapassar 8192 (estou endereçando memoria de uma eeprom de 64bytes), mas o topico vale caso alguem tenha tentado fazer a mesma coisa e ternha problemas, se vc puderem testar em algum PIC de vcs postem o resultado aqui. Obrigado pela atenção de todos.
Exclaim Tecnologia - Soluções em Aplicativos Comerciais e Programação para Automação
ronnei
Bit
 
Mensagens: 17
Registrado em: 04 Ago 2008 10:01


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x