Página 1 de 2

Que que tá errado?

MensagemEnviado: 15 Nov 2010 20:31
por roquetti
Srs,
Estou usando o MikroC for PIC, estou usando o PIC18F4550 com USB, estou tentando enviar uma string para o computador, mas está indo uma letra só, alguém pode me ajudar? segue o programa



/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VERSÃO :
* DATA :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição de entradas
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#define botao1 portb.rb2
#define botao2 portb.rb3
#define botao3 portb.rb4
#define botao4 portb.rb5
#define botao5 portb.rb6
#define botao6 portb.rb7

int x,i,j;
int tensao;





/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração de variáveis *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
char userRD_buffer[64], userWR_buffer[64] ;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração de Interrupções *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void interrupt()
{
HID_InterruptProc();

}

//......................................................................
void Hid_envia_string( char *str)
{
while(*str)
{
Hid_Write(*str, 1);
str++;
}
}
//............................................................................

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Bloco principal de programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void main()
{
ADCON0=0b00000001;
ADCON1=0b00001110;
ADCON2=0b10011110;
TRISB = 0b111100;
TRISC.rc4=1;
TRISC.rc5=1;
TRISD = 0;
TRISE = 0b000;
Lcd_Config(&PORTD,0,1,1,7,6,5,4); // Configura o display
Lcd_Init(&PORTD); // inicializa o display // Initialize LCD
lcd_out(1,1,"Tensao em Volts"); //Mostra mensagem no display


HID_Enable(&userRD_buffer, &userWR_buffer); //Inicializa a USB
userWR_buffer[0]=0;
Delay_ms(1000); //Aguarda 1 segundo

while (1)
{

porte.re0=1;
porte.re1=1;
for(i=0;i<60;i++){
adcon0.go_done=1; //Inicializa a conversão
while(adcon0.go_done); //Aguarda finalizar a conversão
tensao=((adresh << 8) + adresl) * 4.87; //Lê o conteúdo da conversão
inttostr(tensao,userWR_buffer); //Converte para string
strcat(userWR_buffer," mV"); //Concatena com "V"
lcd_out(2,4,userWR_buffer); //Mostra no display
delay_ms(1000);
}

//..........................................................
porte.re0=0;
porte.re1=0;

Hid_envia_string(userWR_buffer);


//................................................................

for(j=0;j<15;j++)
{
for(i=0;i<59;i++)
{
delay_ms(1000);
}
}


//................................................................

}

}

MensagemEnviado: 15 Nov 2010 21:26
por Francesco
Fiz uma mudança pequena em uma de suas funções... veja se funciona:

Código: Selecionar todos
void Hid_envia_string( char *str)
{
    while(*str)
        {
            while( !Hid_Write(*str, 1) )
                ;
            str++;
        }
}

MensagemEnviado: 15 Nov 2010 22:01
por roquetti
Francesco escreveu:Fiz uma mudança pequena em uma de suas funções... veja se funciona:

Código: Selecionar todos
void Hid_envia_string( char *str)
{
    while(*str)
        {
            while( !Hid_Write(*str, 1) )
                ;
            str++;
        }
}


apareceu mais coisas agora, mas apareceu lixo, não apareceu o valor lido no AD

MensagemEnviado: 16 Nov 2010 02:06
por Francesco
No display LCD aparece normalmente?

MensagemEnviado: 16 Nov 2010 06:30
por roquetti
Francesco escreveu:No display LCD aparece normalmente?


No display aparece corretamente, já testei com serial e funciona correntamente, só que para usar no notebook terei que fazer funcionar na USB, tenho um adaptador serial USB, posso tentar usar este adaptador.

MensagemEnviado: 16 Nov 2010 11:05
por rosiley
Meu amigo, tive este mesmo problema com um hard que fiz, só funcionava na serial nativa do micro, colocava na usb não funcionava, tentei vários conversores e nada, a solução é voce adquirir um adptador pcmcia para serial este funcionou perfeitamente e não custa caro em torno de R$ 40,00 no ML. Tenta e boa sorte.

MensagemEnviado: 16 Nov 2010 15:25
por Francesco
Calma lá, isso tem que funcionar...
Se aparece corretamente no display, o problema é a USB.

Percebi que você usa o mesmo buffer para o WR da USB e para a mensagem. Não estou certo, mas não seria melhor trabalhar com buffers separados?

Francesco

MensagemEnviado: 16 Nov 2010 20:50
por roquetti
Francesco escreveu:Calma lá, isso tem que funcionar...
Se aparece corretamente no display, o problema é a USB.

Percebi que você usa o mesmo buffer para o WR da USB e para a mensagem. Não estou certo, mas não seria melhor trabalhar com buffers separados?

Francesco


No começo do programa eram separados, tinha uma matriz, mas eu não sabia como juntar, então coloquei direto.

MensagemEnviado: 16 Nov 2010 22:47
por Francesco
Não conheço essa biblioteca, mas normalmente os buffers de trabalho da USB são de controle da biblioteca, e não poderíam ser escritas diretamente. Então tente trabalhar com buffers diferentes, como eu coloquei aqui...

Código: Selecionar todos
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VERSÃO :
* DATA :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição de entradas
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#define botao1 portb.rb2
#define botao2 portb.rb3
#define botao3 portb.rb4
#define botao4 portb.rb5
#define botao5 portb.rb6
#define botao6 portb.rb7

int x,i,j;
int tensao;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração de variáveis *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
char userRD_buffer[64], userWR_buffer[64] , userMSG_buffer[64] ;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração de Interrupções *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void interrupt()
{
  HID_InterruptProc();
}

//......................................................................
void Hid_envia_string( char *str)
{
  while(*str)
  {
    while( !Hid_Write(*str, 1) ) ;
    str++;
  }
}
//............................................................................

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Bloco principal de programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void main()
{
  ADCON0=0b00000001;
  ADCON1=0b00001110;
  ADCON2=0b10011110;
  TRISB = 0b111100;
  TRISC.rc4=1;
  TRISC.rc5=1;
  TRISD = 0;
  TRISE = 0b000;
  Lcd_Config(&PORTD,0,1,1,7,6,5,4); // Configura o display
  Lcd_Init(&PORTD); // inicializa o display // Initialize LCD
  lcd_out(1,1,"Tensao em Volts"); //Mostra mensagem no display

  HID_Enable(&userRD_buffer, &userWR_buffer); //Inicializa a USB
  userMSG_buffer[0]=0;
  Delay_ms(1000); //Aguarda 1 segundo

  while (1)
  {
    porte.re0=1;
    porte.re1=1;
    for(i=0;i<60;i++)
    {
      adcon0.go_done=1; //Inicializa a conversão
      while(adcon0.go_done); //Aguarda finalizar a conversão
      tensao=((adresh << Cool + adresl) * 4.87; //Lê o conteúdo da conversão
      inttostr(tensao,userMSG_buffer); //Converte para string
      strcat(userMSG_buffer," mV"); //Concatena com "V"
      lcd_out(2,4,userMSG_buffer); //Mostra no display
      delay_ms(1000);
    }

    //..........................................................
    porte.re0=0;
    porte.re1=0;

    Hid_envia_string(userMSG_buffer);

    //................................................................

    for(j=0;j<15;j++)
    {
      for(i=0;i<59;i++)
      {
        delay_ms(1000);
      }
    }

    //................................................................

  }
}


Francesco

MensagemEnviado: 17 Nov 2010 10:02
por roquetti
[quote="Francesco"]Não conheço essa biblioteca, mas normalmente os buffers de trabalho da USB são de controle da biblioteca, e não poderíam ser escritas diretamente. Então tente trabalhar com buffers diferentes, como eu coloquei aqui...

não houve alteração na hora de mostrar na tela do computador, está enviando uma string, só não é legível, em decimal da tabela ascii, segue:

187, 187, 105, 157, 131, 0, 187, 154, 161,

li de novo o sensor e mostrou em ascii:

»»i"Ï»š¡

no display LCD está mostrando 4305 mV

MensagemEnviado: 17 Nov 2010 14:31
por Francesco
Acho que descobri. Altere o ponteiro da sua função de envio:

Código: Selecionar todos
void Hid_envia_string( char *str)
{
  while(*str)
  {
    while( !Hid_Write( &str, 1) ) ;
    str++;
  }
}


Acho que agora vai funcionar.

Francesco

Re: Que que tá errado?

MensagemEnviado: 17 Nov 2010 20:28
por r.bertini
roquetti escreveu:Srs,
Estou usando o MikroC for PIC, estou usando o PIC18F4550 com USB, estou tentando enviar uma string para o computador, mas está indo uma letra só, alguém pode me ajudar? segue o programa



/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VERSÃO :
* DATA :
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição de entradas
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#define botao1 portb.rb2
#define botao2 portb.rb3
#define botao3 portb.rb4
#define botao4 portb.rb5
#define botao5 portb.rb6
#define botao6 portb.rb7

int x,i,j;
int tensao;





/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração de variáveis *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
char userRD_buffer[64], userWR_buffer[64] ;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração de Interrupções *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void interrupt()
{
HID_InterruptProc();

}

//......................................................................
void Hid_envia_string( char *str)
{
while(*str)
{
Hid_Write(*str, 1);
str++;
}
}
//............................................................................

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Bloco principal de programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

void main()
{
ADCON0=0b00000001;
ADCON1=0b00001110;
ADCON2=0b10011110;
TRISB = 0b111100;
TRISC.rc4=1;
TRISC.rc5=1;
TRISD = 0;
TRISE = 0b000;
Lcd_Config(&PORTD,0,1,1,7,6,5,4); // Configura o display
Lcd_Init(&PORTD); // inicializa o display // Initialize LCD
lcd_out(1,1,"Tensao em Volts"); //Mostra mensagem no display


HID_Enable(&userRD_buffer, &userWR_buffer); //Inicializa a USB
userWR_buffer[0]=0;
Delay_ms(1000); //Aguarda 1 segundo

while (1)
{

porte.re0=1;
porte.re1=1;
for(i=0;i<60;i++){
adcon0.go_done=1; //Inicializa a conversão
while(adcon0.go_done); //Aguarda finalizar a conversão
tensao=((adresh << 8) + adresl) * 4.87; //Lê o conteúdo da conversão
inttostr(tensao,userWR_buffer); //Converte para string
strcat(userWR_buffer," mV"); //Concatena com "V"
lcd_out(2,4,userWR_buffer); //Mostra no display
delay_ms(1000);
}

//..........................................................
porte.re0=0;
porte.re1=0;

Hid_envia_string(userWR_buffer);


//................................................................

for(j=0;j<15;j++)
{
for(i=0;i<59;i++)
{
delay_ms(1000);
}
}


//................................................................

}

}


Nos programas que eu utilizo o AD pra fazer leitura de temperatura eu utilizo a instrução WordToStr.

Tenta isso no programa original.

MensagemEnviado: 17 Nov 2010 20:35
por Francesco
R.Bertini, até pensei em indicar o sprintf() para substituir o inttostr(). Mas no display a string aparece corretamente. Logo, o problema só pode ser na parte USB do programa.

Francesco

MensagemEnviado: 17 Nov 2010 22:08
por roquetti
Francesco escreveu:R.Bertini, até pensei em indicar o sprintf() para substituir o inttostr(). Mas no display a string aparece corretamente. Logo, o problema só pode ser na parte USB do programa.

Francesco


vou olhar novamente o hardware do USB para ver se acho algum erro.

MensagemEnviado: 18 Nov 2010 04:41
por Francesco
Você chegou a fazer o teste com esta pequena alteração? Um &?

Código: Selecionar todos
void Hid_envia_string( char *str)
{
  while(*str)
  {
    while( !Hid_Write( &str, 1) ) ;
    str++;
  }
}


Francesco