Ir ao conteúdo

Posts recomendados

Postado

Eu estava em um outro tópico com um assunto parecido onde eu tentava fazer a comunicação entre um arduíno e um tp2322. Sem muito sucesso com o arduíno resolvi voltar para o 18f4550 pois tenho mais afinidade.

 

Bom vamos lá, antes de mais nada gostaria da opinião de vocês, vejam o gráfico que o 18f4550 está gerando(comunicação i2c), simulação feita no proteus e me digam se da forma como estão dispostos o scl e o sda está correto:

 

pt2322.png

Postado

entendi, acho que encontrei um erro no ACK, pelo que entendi ele tem que ser no 9º clock do scl e também me parece que o ACK não deve ser colocado em nível baixo e sim de alta impedância, será que tem mais alguma coisa?

Postado

Minha nossa, como este ci é complicadinho, não comunica nem a pau, por último agora, estou tentando com o hardware I2C do 18f4550 a 100khz como manda o datasheet e nem assim não funciona. peguei a mesma sequencia de comandos usada naquela lib do arduino, que supostamente é funcional e nem assim não funciona. Com um outro ci de processamento de áudio funciona perfeito, mas esse é bem encrenqueiro rsrs. 

 

A sequencia de inicialização no arduino é assim:

writeI2CChar(SYSTEM_RESET);
    writeI2CChar(INPUT_SW_ACTIVE);  // required to activate 

    // set the trim volumes to zero
    writeI2CChar(FL_VOLUME_CONTROL);      //0db   
    writeI2CChar(FR_VOLUME_CONTROL);      //0db   
    writeI2CChar(CENTER_VOLUME_CONTROL);  //0db   
    writeI2CChar(RL_VOLUME_CONTROL);      //0db   
    writeI2CChar(RR_VOLUME_CONTROL);      //0db   
    writeI2CChar(SUB_VOLUME_CONTROL);     //0db   
    
    // set the master voume
    Wire.beginTransmission(0x88 >> 1); // transmit to device 0x88, PT2322
    Wire.write(MASTER_VOLUME_1STEP | (HEX2BCD(masterVolumeValue)  &  0x0f));   
    Wire.write(MASTER_VOLUME_10STEP | ((HEX2BCD(masterVolumeValue)  &  0xf0)>>4));   
    Wire.endTransmission();       // stop transmitting

    // set default function
    writeI2CChar(FUNCTION_SELECT | function);   

A minha sequencia (CCS C) ficou assim:

#use I2C(master, scl=PIN_B1, sda=PIN_B0)

void main()
{
   i2c_start(); 
   i2c_write(0x88 >> 1); 
   i2c_write(0xff); //resetar
   i2c_stop();
  
  
   i2c_start(); 
   i2c_write(0x88 >> 1); 
   i2c_write(0xc7); //ativar entradas
   i2c_stop(); 
  
  
   i2c_start(); 
   i2c_write(0x88 >> 1); 
   i2c_write(0x10);
   i2c_write(0x20); 
   i2c_write(0x30); 
   i2c_write(0x40); 
   i2c_write(0x50); 
   i2c_write(0x60);
   i2c_stop(); 
   

   i2c_start(); 
   i2c_write(0x88 >> 1); 
   i2c_write(0b11010010); //master 1 passo
   i2c_write(0b11100100); //master 10 passos
   i2c_stop();
   

   i2c_start(); 
   i2c_write(0x88 >> 1); 
   i2c_write(0x70 | 0x04);
   i2c_stop();
   
   while(1){}

}

 

 

Postado

@ViniciusKruz ,

 

Que tal rodar o famoso programinha que pesquisa qualquer periférico que esteja ligado ao bus I2c ? 

 

Pelo menos isso esse CI tem de fazer, respondendo um Ack....  senão nem adianta ficar maluco com os comandos, talvez o CI esteja pifado, ou você não esteja gerando a temporização correta ....

 

Paulo

Postado

@aphawk  Paulo, desculpa a ignorância, mas de que programinha você está falando?

 

Na verdade estou mesmo pensando em checar as respostas ACK, estou pensando em amanhã fazer alguma coisa pra ler a resposta do periférico. Tem razão, pode estar queimado mesmo. 

 

Veja só na simulação, a resposta no I2C Debugger está perfeita:

 

 

 

 

 

i2c.png

  • Solução
Postado

@ViniciusKruz ,

 

Olhando a resposta parece que está tudo certinho....

 

Eu me refiro a um programa chamado I2C Scanner, ele pesquisa todos os endereços até obter uma resposta.

 

Como uso o Basic, vou te passar um link de um programa que funciona direitinho no Arduino :

 

http://playground.arduino.cc/Main/I2cScanner

 

Implemente ele em seu compilador, e faça o teste em seu CI. Se não tiver resposta, provavelmente o CI está defeituoso.

 

Paulo

Postado

@aphawk

Amigo deu certinho, com o i2cScanner eu consegui identificar que o problema era o cabo que eu usava no i2c, com um cabo de 1/2 metro o scanner não encontrou nenhum dos 4 CIs que testei, daí desconfiei dele e troquei por um de 20cm, a comunicação ficou perfeita. Muuuiiitooo obrigado mesmo, sua ajuda foi muito grande. Deus o abençoe.

 

Para quem quiser se comunicar com este CI(PT2322), fica aqui o programa que usei:

#include <18F4550.h>

#fuses MCLR,HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL2,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=8000000)

#use I2C(master, scl=PIN_B1, sda=PIN_B0)


void main(){

  i2c_start(); 
   i2c_write(0x88); 
   i2c_write(0xff); //resetar
   i2c_stop();

   i2c_start(); 
   i2c_write(0x88); 
   i2c_write(0xc7); //ativar entradas
   i2c_stop(); 
  
   i2c_start(); 
   i2c_write(0x88); //volumes
   i2c_write(0x10);
   i2c_write(0x20); 
   i2c_write(0x30); 
   i2c_write(0x40); 
   i2c_write(0x50); 
   i2c_write(0x60);
   i2c_stop(); 

  i2c_start(); 
   i2c_write(0x88); 
   i2c_write(0b11100100); //master -1db passo
   i2c_write(0b11010010); //master -10db passos
   i2c_stop();
  
   i2c_start(); 
   i2c_write(0x88); 
   i2c_write(0x70 | 0x04);
   i2c_stop();

  
   while(1)
   {
     
   }
   
   
}

Com o código acima, o PT2322 passa o áudio das entradas para as saídas a um volume baixo, isto é o suficiente para dar um sinal de vida, um hello world.

 

Obrigado a todos pelas dicas.

 

Vinícius Cruz.

 

Postado

@ViniciusKruz ,

 

Opa, que bom que deu certo !!!! Duas cabeças sempre pensam melhor do que uma, não é ? :lol: 

 

Infelizmente usar I2C com cabos maiores exige circuitos de interface para garantir a integridade do sinal. 

 

Legal voce ter postado o programa, assim outros poderão ser ajudados também !

 

Boa diversão, meu amigo , e toque em frente todo o projeto !

 

Se possível, quando estiver tudo funcionando, poste o projeto ok ? Ah, e não se esqueça de fechar este tópico como Concluido !

 

Paulo

Postado

@aphawk

beleza sem problemas, é uma boa ideia mesmo publicar alguma coisa a respeito deste CI porque não tem praticamente nada dele na internet, de repente depois eu publico o projeto depois.

 

Já coloquei como resolvido, eu marquei sua resposta como a melhor, acho que pra ficar resolvido isto basta né? Se a moderação quiser pode dar por encerrado.

 

Muito agradecido mesmo pela sua ajuda.

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!