Rotacionar 24 bits para conversor ADS1234 bug do ccs?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Rotacionar 24 bits para conversor ADS1234 bug do ccs?

Mensagempor die6o » 10 Ago 2008 19:32

Galera estou tentando ler 24 bits de um conversor ADC com o pic 16f877a mas quando vou rotacionar a leitura trava no 16º bit continua o for até 24 mas não rotaciona mais a variavel "a"

int b;
int32 a; //declarando com long long tambem não funciona

for(b=0;b<=23;++b)
{
a=a<<1;
a=(a | input(pin_b3));
}


com a função do ccs tambem não funciona

for(b=0;b<=23;++b)
shift_left(&a,3,input(pin_b3));

alguem sabe como resolver
Editado pela última vez por die6o em 14 Ago 2008 09:40, em um total de 2 vezes.
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Re: Rotacionar 24 bits bug do ccs?

Mensagempor andre_luis » 11 Ago 2008 07:23

Qual o propósito desta rotação ? Capturar os bits mais significativos ?
Nesse caso, não deveria rotacionar para a direita ?

Código: Selecionar todos
a=a<<1;  ???? 


Dica : experimenta forçar o valor lido para 32 bits; provavelmente a leitura está realizando um casting implicito.

Código: Selecionar todos
a=(a | (int32)input(pin_b3));


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor amboni » 11 Ago 2008 09:16

que conversor de 24 bits vc esta usando??
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Re: Rotacionar 24 bits bug do ccs?

Mensagempor die6o » 11 Ago 2008 09:26

Andre_teprom estou rotacionando para poder ler o valor do conversor ADC pois o conversor manda os dados serialmente iniciando do mais significativo, assim rotacionando conseguiria ler o valor em decimal fiz a mesma logica para poder ler o conversor da microchip mcp 3201 e funcionou legal o problema é q trava no 16º bit mesmo forçando a leitura em 32bits sabe como fazer de outra forma?
Editado pela última vez por die6o em 11 Ago 2008 09:51, em um total de 1 vez.
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Re: Rotacionar 24 bits bug do ccs?

Mensagempor die6o » 11 Ago 2008 09:31

Desculpa galera o conversor que estou usando é o ADS1234 da texas
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Mensagempor ze » 11 Ago 2008 10:36

amigo, rodar os bits assim direto do pino sem sincronizar o dado num fica meio loco não? ou está faltando esta parte no seu cód?

obs: nada a ver ainda, mas pra 24 bits de resolução o layout é +- crítico.
abrçs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor die6o » 11 Ago 2008 14:02

Lelis não postei o condigo inteiro esta é a função onde leio valor do conversor esse problema tambem acontece quando simulo no proteus para no 16º bit e não rotaciona mais, alguem conseguiu ver algo de errado com a rotina? pois não ta funfando rsrsrs


Código: Selecionar todos

#define dout pin_b2
#define sclk pin_b1

int32 read_adc(void)
{
int b;
int32 valor=0;

while(input(dout)); // espera o conversor ficar pronto pra iniciar conversão

   for(b=0;b<=23;++b)
   {
   output_high(sclk);
   delay_us(1); 
   shift_left(&valor,3,input(dout));
   output_low(sclk);
   delay_us(1);
   }
   
   output_high(sclk); // gerado mais 1 pulso de clock para forçar a subida do 
   delay_us(1); // pino Dout do conversor sinalizando o termino da conversão
   output_low(sclk);
   delay_us(1);
   while(!input(dout)); //garante que a conversão já esta finalizada

return(valor); // retorna leitura do conversor
}




obs:com o shift_left(&valor,4,input(dout)); tambem não funciona[/quote]
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Mensagempor ze » 11 Ago 2008 16:19

aaaaaaaahhhhhhhhhh bão!!
complicadinho, não? veja como faria com hitech-c:

Código: Selecionar todos
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define dout RB2
#define sclk RB1

ulong read_adc(void)
{
uchar b; //b pode ser char, viu?
ulong valor=0;
while(dout); //perigo! seu prog pode ficar preso aqui em caso de falha do hw!
for(b=0;b<24;b++)
   {
   sclk=1;
   asm("nop");// um nop = 1 useg @ 4MHz;
   valor|=dout; //vai pro bit 0 do long (espero)
   sclk=0;
   asm("nop");
   valor<<=1;
   }
...  //o mesmo convertido
...  //precisa mesmo disso??
...  //2º perigo!!

return(valor); // retorna leitura do conversor
}

no fundo no fundo é a lesma lerda. (e não ajudei nada, só comparei os compiladores.rs). Mas 2 coisas: verifique se 1 useg está coerente com seu hw. Outra: crie cód em asm (éca) e verifique a meléca que o ccs (éca) faz.
Ah, e verifique se o tal de ad tem alguma config. de 16/24bits.
good luck!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor andre_luis » 12 Ago 2008 08:45

Não deve ser isso, mas....

Um delay de apenas 1us não é muito baixo não ?
Qual a taxa maxima de comunicação desse barramento ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor die6o » 12 Ago 2008 11:28

Andre_teprom o tempo minimo da largura do pulso tem que ter 100ns sendo que estou usando delay de 1us
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Mensagempor andre_luis » 12 Ago 2008 21:48

Isso dá algo em torno de 10Mbits/seg. Bastante rápido.

Se o problema ocorre também na simulação, deve ser alguma sutileza na comunicação. Revisa o manual. Pode haver alguma sutileza que passou desapercebido, do tipo algum delay necessário em algum momento.
Já me deparei com um problema na comunicação I2C de um dispositivo em que tive de adicionar delays exagerados empíricos que resolveram o problema. Posteriormente, pude achar a explicação no manual.

APENAS COMO TESTE : Aumenta esse delay de 1us para 100ms. Se funcionar, vai baixando (1/10) até achar o limite. Só um palpeite. Eu faria assim para eliminar essa possibilidade.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

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

cron

x