Trabalho com ADC 12bits paralelo

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Trabalho com ADC 12bits paralelo

Mensagempor Flaviofrc » 19 Mai 2007 11:18

Olá,

Estou trabalhando num circuito com um PIC16F877 para ler um ADC de 12bits com saída paralela, os 8 bits menos significativos estão conectados ao PortB e os 4 bits MSB estão conectados ao PortA.

Minha duvida é, com eu faço a aquisição desses dados e junto tudo para ter um valor inteiro de 12bits?
Eu sei como fazer a leitura dos ports em separado mas não sei como se junta MSB e o LSB.

Estou programando em C CCS para facilitar minha vida.....

Desde já agradeço a ajuda.
Flavio
Flaviofrc
Byte
 
Mensagens: 111
Registrado em: 16 Out 2006 17:32
Localização: São Paulo

Mensagempor Maia » 19 Mai 2007 12:53

É só multiplicar a parte alta por 256 e somar à parte baixa. O resultado tem que ir pra uma variável que suporte os 16 bits.( não sei se no CCS é int).

int RESULTADO;
char MSB, LSB;

RESULTADO = (MSB * 256) + LSB;

Abraços,
Maia
Avatar do usuário
Maia
Byte
 
Mensagens: 348
Registrado em: 15 Out 2006 16:25
Localização: Rio de Janeiro

Mensagempor takapy » 19 Mai 2007 13:31

Faz um deslocamento no MSB de oito bits à esquerda (MSB<<8 ) e faz uma lógica OR com o LSB.

int LSB;
long int DADO,MSB;
DADO=((MSB<<8 )|LSB);

Espero que funcione...
takapy
Bit
 
Mensagens: 25
Registrado em: 23 Nov 2006 17:31
Localização: Manaus_AM

Mensagempor TEC_AUTOMAÇÃO » 19 Mai 2007 17:23

Vamos mudar iso ? e se de colocarmos um ad i2c ou spi e economizarmos 10 pinos ?
TEC_AUTOMAÇÃO
Bit
 
Mensagens: 38
Registrado em: 21 Out 2006 11:24

Mensagempor Red Neck Guy » 19 Mai 2007 21:14

Olha, sem querer ser chato, mas essas dúvidas são referentes a linguagem C e não a microcontroladores pic...
Outrora, como além de chato gosto de ficar ostentando que eu sei um pouco mais do que a média que acessa o fórum, responderei aqui e logo em seguida ficarei me achando o cara:

Assim ó:
-Supondo que tu quer juntar duas variaveis de 8 bits numa de 16...
(Embora só os 12 bits sejam significativos...O compilador não tem tipo de 12 bits....)
...
unsigned char cont1,cont2;
unsigned int total;

cont1 = getPortA(); //abstração de algo que Lê um port genérico
cont2 = getPortB() && 0xFF;
total = cont1<<8 | cont2;


Olha:
Agora pra pegar algo que vem seriado é só ir shiftando conforme vai lendo...


Cara, eu sou muito metido, tá loco! :oops:
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor takapy » 19 Mai 2007 22:01

cont2 = getPortB() && 0xFF; Me corrijam se eu tiver errado:

getPotB() && 0xFF = getPortB(), ou seja, essa máscara não tá fazendo nada, uma vez que essa palavra é de 8 bits e o resultado é a própria variável sem alteração.

unsigned int total; a variável total precisa ser de 16 bits (pois não tem 12 bits), logo, teria que ser:
unsigned long int total;

T + ver.
takapy
Bit
 
Mensagens: 25
Registrado em: 23 Nov 2006 17:31
Localização: Manaus_AM

Mensagempor Flaviofrc » 20 Mai 2007 01:18

Olá pessoal,

Já entendi como se faz... Obrigado a todos...

E prá você Aquino, sem falsa modestia e sem puxar o saco de ninguem....

EU SÓ POSTO MINHAS DUVIDAS AQUI PORQUE SEI TEM FERAS NO ASSUNTO COMO VOCÊ.... E isso é para todos....

Lá se vai o ego do Aquino hehehe
:D :D :D :D :D :D :D :D
Flavio
Flaviofrc
Byte
 
Mensagens: 111
Registrado em: 16 Out 2006 17:32
Localização: São Paulo

Mensagempor KrafT » 20 Mai 2007 16:09

Bah, o Aquino é meu, ninguem tasca!!! Hehehehe...

Eu mapearia os dois caras numa struct do tipo:


union {
unsigned int _converte;
struct {
byte Alta :8;
byte Baixa :8;
} ADSTR;
} AD_UNION;

#define Var16 AD_UNION._converte
#define Var8Lo AD_UNION.ADSTR.Baixa
#define Var8Hi AD_UNION.ADSTR.Alta


Assim basta jogar os valores em Var8Hi e Var8Lo e ler em Var16.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor fabim » 21 Mai 2007 08:21

Kraft. igualim eu fazio.. Em pascal tem um comando pareceido. :)


fabim
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Flaviofrc » 21 Mai 2007 08:46

Olá Kraft,

Interessante esse sistema, não tinha pensado em usar uma struct, acho que preciso estudar mais sobre C :D

Abraço
Flavio
Flaviofrc
Byte
 
Mensagens: 111
Registrado em: 16 Out 2006 17:32
Localização: São Paulo

Mensagempor scheleder » 25 Abr 2009 10:55

Maia escreveu:É só multiplicar a parte alta por 256 e somar à parte baixa. O resultado tem que ir pra uma variável que suporte os 16 bits.( não sei se no CCS é int).

int RESULTADO;
char MSB, LSB;

RESULTADO = (MSB * 256) + LSB;


Como faria isso em Assembly?
Qual variável suporta 16 bits?
[]'s
João Scheleder Neto
scheleder
Nibble
 
Mensagens: 50
Registrado em: 23 Jan 2007 15:57
Localização: Colombo/PR

Mensagempor Vonnilmam » 25 Abr 2009 12:10

Cara, não seria mais facil vc utilizar o ADC do proprio pic?

É claro estou entendendo que o que vc precisa de precisão poderia ser engolido pelo ADC do pic, Ok...antes que alguém contradiga!

Outra coisa como eu sou o mais inexperiente deste forum, nem comentarei o que o aquino disse! Mas vale lembrar que aquí é forum sobre microcontroladores, quer seja duvidas sobre hardware ou SOFTWARE, não importa a limguagem e sim o intuito de ajudar os amigos,

É que eu penso quando eu imagino o que deva ser um FORUM....

Sei lá,

Ao caro scheleder eu aconselho vc dar uma olhada no livro do fabio ou no livro conectando o pic, lá tem uma forma de vc fazer o que deseja em assembler...
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial


Voltar para PIC

Quem está online

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

x