A/D i2c MCP3021 exemplo

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

A/D i2c MCP3021 exemplo

Mensagempor Doglao » 24 Out 2007 14:35

Ola!
Alguem ja usou este tipo de conversor? poderia me mostrar um exemplo de como usar-lo em ccs c para comunicar a 100khz?
abcs.
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor ze » 24 Out 2007 15:36

eu não.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Doglao » 24 Out 2007 17:09

boa! agora ja sei quem nao vai me ajudar nessa!!!
abcs
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Doglao » 24 Out 2007 21:45

Ola! entao na tentativa de construir a comunicacao com o MCP3021 um conversor A/D i2c da microchip criei este codigo de acordo com o que estou vendo no datasheet do componente. ainda nao testei pois o hardware ainda vai ser construido para provas se alguem com alguma experiencia neste componente ou mesmo que possa me dizer se esta coerente com o datasheet poderia dizer se vai funcionar ou necesita de algums ajustes que deixei de colocar?
o endereco do datasheet segue abaixo.
http://ww1.microchip.com/downloads/en/D ... 21805a.pdf

Código: Selecionar todos
struct DoisBytes
{
   int iLsb;
   int iMsb;
};
union Junta_dados
{
   int16 Total_ad;
   struct DoisBytes Msb_Lsb;
}Valor_ad;
int lsb;//varialvel do byte baixo do mcp3021
int msb;//varialvel do byte alto do mcp3021

//*AUTHOR Douglas Ricardo Dos Santos Pereira
//*PURPOSE Ler A/D mcp3021
//*DATE_CREATED 24/10/2007
//*CHANGES
void Read_ad(){
   disable_interrupts(GLOBAL);
   i2c_start();
   i2c_write(0b11011001); //endereco default e comando leitura
   msb = i2c_read(1); //comando de ler o msb
   lsb = i2c_read(0); //comando de ler o lsb
   i2c_stop();//finaliza leitura
   delay_us(50);
   Valor_ad.Msb_Lsb.iLsb=lsb;
   Valor_ad.Msb_Lsb.iMsb=msb;
   Valor_ad.Total_ad = Valor_ad.Total_ad>>2; // ajusto os bits
   enable_interrupts(GLOBAL);
}


muito obrigado
abcs
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Doglao » 26 Out 2007 11:24

e entao...?
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor phophollety » 26 Out 2007 11:35

lellis escreveu:eu não.


Desculpe, mas aqui não é o boteco.

Doglão, deu uma olhada nessas ANs no site da uChip


Ap Note Title Size Download Code/Docs
AN1028 Recommended Usage of Microchip I2C? Serial EEPROM Devices 237KB AN1028
AN1100 Using the C30 Compiler to Interface Serial EEPROMs with dsPIC33F 416KB AN1100 Using the C30 Compiler to Interface Serial EEPROMs with dsPIC33F
AN245 Interfacing The MCP23016 I/O Expander With The PIC16F877A 369KB AN245 AN245 Source Code
AN515 Communicating with IIC Bus Using PIC16C5X 93KB AN515 AN515 Source Code
AN536 Basic Serial EEPROM Operation 159KB AN536
AN541 Using PIC16C5x as a Smart IIC Peripheral 182KB AN541 AN541 Source Code
AN554 Software Implementation of I²C Bus Master 465KB AN554 AN554 Source Code
AN572 Questions and Answers Concerning Serial EEPROMs 64KB AN572
AN578 Use of the SSP Module in the IIC Multi-Master Environment 185KB AN578
AN610 Using the 24LC21 Dual Mode Serial EEPROM 81KB AN610
AN667 Smart Battery Charger with SMBus Interface 483KB AN667 AN667 Source Code
AN674 Solving Second Sourcing Issues with the 24LC00 Device in a SOT-23 Package 62KB AN674
AN690 I²C™ Memory Autodetect 94KB AN690
AN709 System Level Design Considerations When Using I2C Serial EEPROM Devices 92KB AN709
AN734 Using the PICmicro SSP for Slave I2C Communication 134KB AN734 AN734 Source Code
AN735 Using the PICmicro MSSP Module for I2C Communications 221KB AN735 AN735 Source Code
AN736 An I2C Network Protocol for Environmental Monitoring 467KB AN736 AN736 Source Code
AN974 Interfacing I2CTM Serial EEPROMs to PICmicro® Microcontrollers 347KB AN974 Interfacing I2C? Serial EEPROMs to PICmicro® Microcontrollers
AN976 Using the MSSP Module to Interface I2C? Serial EEPROMs with PIC16 Devices 334KB AN976 AN976 Source Code
AN979 Interfacing I2C? Serial EEPROMs to PIC18 Devices 345KB AN979 Interfacing I2C? Serial EEPROMs to PIC18 Devices
AN982 Interfacing I2C Serial EEPROMs to PIC10 and PIC12 Devices 444KB AN982 AN982 Source Code
AN989 Using the MSSP Module to Interface I2C? Serial EEPROMs with PIC18 Devices 335KB AN989 AN989 Source Code
AN991 Using the C18 Compiler and the MSSP to Interface I2C? EEPROMs with PIC18 Devices 336KB AN991 AN991 Source Code
AN997 Using the C18 Compiler to Interface I2C? Serial EEPROMs with PIC18 Devices 358KB AN997 AN997 Source Code
TB052 Multi-Zone Temperature Monitoring with the TCN75 Thermal Sensor 54KB TB052 TB052 Source Code
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Mensagempor Doglao » 26 Out 2007 12:28

thanks!
Agora sim!!! vou debuiar estes datasheets valeu Phopho tinha mesmo que seguir outros applications notes de outros dispositivos eu que pensava que estava sempre atento pra estas coisas. hehehe vai papudo
ah! o I/O expander mcp23016 eu uso de traz pra frente e de restreisveiz olha o video ai mas comenta por favor ele ta joinha eu coloquei no iutubis
http://www.youtube.com/watch?v=mFM_-Zk7Vv8
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Doglao » 31 Out 2007 17:11

fiz apenas uma pequena modificacao que me indicaram no ccs forum foi o sentido do dado qeu envio de endereco eu inverti a secuencia na hora de escrever assim:
i2c_write(0b10011011);
como ja tenho o hardware aqui fiz provas mas nao funfa, Alguma ideia?
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor regiscruz » 01 Nov 2007 03:05

Na boa Doglao, vc ja havia feito outros programas usando o CCS ou essa é a primeira vez que vc usa esse software?
Digo isso porque existem uma série de configurações e sequências que precisam ser obedecidas e eu estou desconfiado que seu problema esteja neste ponto.
Da uma olhada no livro Pic tecnicas avançadas do Fabio Pereira que nele tem uns exemplos de i2c bem simples e com umas dicas bem legais, vc pode testar este código do livro pra dar uma clareada nas idéias, é uma pena que eu não esteja com ele aqui agora senão eu te falava até a pagina.
Eu ja perdi um bom tempo apanhando e brigando com o hardware sendo que o problema era só sintaxe do programa.
É só uma sugestão.
Existem três leis que governam o mundo...
A Lei da gravidade, a Lei do mais forte e a lei de Murphy.
Avatar do usuário
regiscruz
Byte
 
Mensagens: 154
Registrado em: 21 Out 2006 10:22
Localização: Uberaba - MG

Mensagempor andre_luis » 01 Nov 2007 09:57

Doglao,

Me parece que o tamanho dos dados desse CI não é inteiramente compatível com a maioria dos CI´s I2C de 8 bit´s.

Se voce pretender ligar outros dispositivos nesse mesmo barramento, desaconselho; use um outro pino de clock para os demais.( já tive um problema parecido )

+++
"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 Doglao » 01 Nov 2007 14:22

Entao...!
Eu uso ccs em meus projetos sim. sem problemas, e tambem acesso dispositivos i2c uns expansores mcp23016 numa boa, mas este dispositivo nunca havia usado e eh smd vou tirar ele e colocar outro novo pra ver que acontece, mas voces revisando o codigo na sequencia para este dispositivo de start ate stop sera que faltou temporizacao ou alguma outra coisa? fiz esta secuencia de acordo com o datasheet deste cara.
abcs.
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Doglao » 01 Nov 2007 14:54

andre_teprom escreveu:Doglao,

Me parece que o tamanho dos dados desse CI não é inteiramente compatível com a maioria dos CI´s I2C de 8 bit´s.

Se voce pretender ligar outros dispositivos nesse mesmo barramento, desaconselho; use um outro pino de clock para os demais.( já tive um problema parecido )

+++

Ola Andre!
somente vou usar um dispositivo no barramento para este caso, estou fazendo um sensor de pressão somente necesitava fazer comunicar com ele e receber os dados dai faco a conversao para psi sem problemas.
Mas sobre o tema do tamanho dos dados no codigo ja contempla isso, se voce reparar quando leio os valores estou recebendo o msb primeiro e guardo em uma variavel de 8 bits msb e depois vem a leitura para o lsb guardando en outra variavel lsb de 8 bits, segundo o datasheet este dispositivo eh de resolucao de 10 bits e quando recebo o msb ele eh de 4bits e quando recebo o lsb ele eh de 6 bits mas ajustado a esquerda da variavel lsb, repare que fiz uma union e dentro desta union eu declaro uma variavel de 16bits e uma strutura com duas variaveis de 8 bits se voces olharem bem nesta jogada eu monto o lsb e msb em uma unica variavel de 16bits ok, dai quando passo estes valores para este variavel eu rotaciono a direita duas vezes e ajusto os dados a direita desta variavel de 16 bits.
Código: Selecionar todos
struct DoisBytes
{
   int iLsb;
   int iMsb;
};
union Junta_dados
{
   int16 Total_ad;
   struct DoisBytes Msb_Lsb;
}Valor_ad;


agora o codigo de captura de dados do a/d e seu ajuste:
Código: Selecionar todos
int16 Read_ad(){
   int16 temp_pressao;
   i2c_start();
   i2c_write(0b10011011);  //coloca endereco do escravo  e como leitura
   msb   = i2c_read(1); //comando de ler o msb
   lsb   = i2c_read(0); //comando de ler o lsb
   i2c_stop();//finaliza leitura
   delay_us(50);
   Valor_ad.Msb_Lsb.iLsb=lsb;//se le assim dddddd00 os dados a esquerda
   Valor_ad.Msb_Lsb.iMsb=msb;//se le assim 0000dddd os dados a direita
   Valor_ad.Total_ad = Valor_ad.Total_ad>>2; // agora tenho 0000dddddddddd00 depois de rotacionado-> 000000dddddddddd
   temp_pressao=Valor_ad.Total_ad; // retorno valor ajustado
   return temp_pressao;
}


e para mostrar este valor cru no display uso assim:
Código: Selecionar todos
Valor_pressao=Read_ad();
printf(lcd_putc, "%lu  ", Valor_pressao);


somente precisava saber se este codigo na parte que comunica com o dispositivo esta coerente com oque li no datasheet. O hardware esta bem revisado e devido a sua simplicidade nao creio que seja algo a mais a rever, pullups em sda e scl e nada mais de extraordinario.
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor Doglao » 01 Nov 2007 18:30

quero agradecer a todos que ajudaram, ja funciona a comunicacao com os valores esperados, necessitava um delay de 11 microsegundos que corresponde ao tempo de aquizicao (Tacq 1.12us) mais tempo de conversao(Tconv 8.96us) antes de comecar a ler o dispositivo.
o codigo modificado:

Código: Selecionar todos
i2c_start();
   i2c_write(0b10011011);  //0x9b coloca endreco do escravo  e como escrita
   delay_us(11);//no modo de unica aquisicao necessita esperar por Tacq(1.12uSec)
            // mais Tconv(8.96uSec).
   msb   = i2c_read(1); //comando de ler o msb
   lsb   = i2c_read(0); //comando de ler o lsb
   i2c_stop();//finaliza leitura

uma vez mais muito obrigado
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron

x