Página 1 de 1
Rotacionar 24 bits para conversor ADS1234 bug do ccs?

Enviado:
10 Ago 2008 19:32
por die6o
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
Re: Rotacionar 24 bits bug do ccs?

Enviado:
11 Ago 2008 07:23
por andre_luis
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));
+++

Enviado:
11 Ago 2008 09:16
por amboni
que conversor de 24 bits vc esta usando??
Re: Rotacionar 24 bits bug do ccs?

Enviado:
11 Ago 2008 09:26
por die6o
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?
Re: Rotacionar 24 bits bug do ccs?

Enviado:
11 Ago 2008 09:31
por die6o
Desculpa galera o conversor que estou usando é o ADS1234 da texas

Enviado:
11 Ago 2008 10:36
por ze
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

Enviado:
11 Ago 2008 14:02
por die6o
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]

Enviado:
11 Ago 2008 16:19
por ze
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!

Enviado:
12 Ago 2008 08:45
por andre_luis
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 ?
+++

Enviado:
12 Ago 2008 11:28
por die6o
Andre_teprom o tempo minimo da largura do pulso tem que ter 100ns sendo que estou usando delay de 1us

Enviado:
12 Ago 2008 21:48
por andre_luis
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.
+++