Que que tá errado?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Que que tá errado?

Mensagempor roquetti » 15 Nov 2010 20:31

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);
}
}


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

}

}
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Francesco » 15 Nov 2010 21:26

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++;
        }
}
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor roquetti » 15 Nov 2010 22:01

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
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Francesco » 16 Nov 2010 02:06

No display LCD aparece normalmente?
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor roquetti » 16 Nov 2010 06:30

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.
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor rosiley » 16 Nov 2010 11:05

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.
rosiley
Nibble
 
Mensagens: 51
Registrado em: 01 Jul 2008 19:38
Localização: rio das ostras

Mensagempor Francesco » 16 Nov 2010 15:25

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor roquetti » 16 Nov 2010 20:50

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.
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Francesco » 16 Nov 2010 22:47

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor roquetti » 17 Nov 2010 10:02

[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
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Francesco » 17 Nov 2010 14:31

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Re: Que que tá errado?

Mensagempor r.bertini » 17 Nov 2010 20:28

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.
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43

Mensagempor Francesco » 17 Nov 2010 20:35

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor roquetti » 17 Nov 2010 22:08

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.
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Francesco » 18 Nov 2010 04:41

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Próximo

Voltar para PIC

Quem está online

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

x