Ir ao conteúdo
  • Cadastre-se

LCD + USB e PIC18F4550


Dani piresk

Posts recomendados

Galera, lá vem eu encher o saco de vocês de novo.

Bom, estou tendo problemas com o lcd, é falta de prática mesmo, com o mikroc 2009 que eu baixei mudou um pouco a configuração do lcd e eu estou fazendo besteira aqui.

Seguinte, eu ligo o circuito e o lcd fica com uma linha toda acessa de quadradinhos (significando que ele está normal, porém sem dados.).

Meu código:

Meu circuito:

Então é isso, espero que possam me ajudar e desculpa incomodar vocês de novo, mas é que to iniciando na área de mcus, ainda não tenho prática, só sei a lógica mesmo..

Link para o comentário
Compartilhar em outros sites

se você usa o mikroc,pra que você esta usando essa parte?

/* * Configuração do LCD * */

sbit LCD_RS at RE0_bit;

sbit LCD_EN at RE1_bit;

sbit LCD_D7 at RB7_bit;

sbit LCD_D6 at RB6_bit;

sbit LCD_D5 at RB5_bit;

sbit LCD_D4 at RB4_bit;

sbit LCD_D3 at RB3_bit;

sbit LCD_D2 at RB2_bit;

sbit LCD_D1 at RB1_bit;

sbit LCD_D0 at RB0_bit;

sbit LCD_RS_Direction at TRISE0_bit;

sbit LCD_EN_Direction at TRISE1_bit;

sbit LCD_D7_Direction at TRISB7_bit;

sbit LCD_D6_Direction at TRISB6_bit;

sbit LCD_D5_Direction at TRISB5_bit;

sbit LCD_D4_Direction at TRISB4_bit;

sbit LCD_D3_Direction at TRISB3_bit;

sbit LCD_D2_Direction at TRISB2_bit;

sbit LCD_D1_Direction at TRISB1_bit;

sbit LCD_D0_Direction at TRISB0_bit;

/* \\ Configuração do LCD \\ */

só precisa usar a funcão lcd_config que tem no help do mikroc

Link para o comentário
Compartilhar em outros sites

/* * Configuração do LCD * */

[B]sbit LCD_RS at LATB0_bit;
sbit LCD_EN at LATB1_bit;

sbit LCD_D7 at LATB5_bit;
sbit LCD_D6 at LATB4_bit;
sbit LCD_D5 at LATB3_bit;
sbit LCD_D4 at LATB2_bit;[/B]

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;

sbit LCD_D7_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB2_bit;

/* \\ Configuração do LCD \\ */

char teste_var [] = "Testando LCD - PIC";

void configurar_pic()
{
ADCON1 = 0x0F; //configura pinos para digital
CMCON = 7; //desabilita comparador

TRISA = 0; //portA como saída
//PORTA = 0; //zera portA
LATA = 0; //desliga bk

TRISB = 0; //portB como saída
//PORTB = 0xFF;
[B]LATB = 0xFF;
TRISB = 0xff;[/B]
}

void iniciar_LCD()
{
Lcd_Init(); //iniciar lcd
Lcd_Cmd(_LCD_CLEAR); //limpa lcd
Lcd_Cmd(_LCD_CURSOR_OFF); //desabilita cursor lcd
}

void piscar_bk()
{
//PORTA.RA0 = 1;
LATA.RA0 = 1;
delay_ms(1000);
//PORTA.RA0 = 0;
LATA.RA0 = 0;
delay_ms(1000);
}

void main()
{
configurar_pic();

iniciar_LCD();

LATA.RA0 = 1; //ligar o bk;

//Lcd_Out(1, 1, teste_var);
Lcd_out(1,1,"teste");

/*while (1)
{
piscar_bk();
}*/
}

Claro que não funciona ne, olha so o seu lcd esta com os dados e os pinos EN e RS ligados todos ao PORTB, porém voce configurou tudo como entrada, como espera enviar algum dado?

solução, tente TRISB = 0x00;

abs.

Link para o comentário
Compartilhar em outros sites

Funcionou!!!!

Eu tinha invertido os pinos do data do lcd, tinha colocado o D7 no rb 2 e é no rb 5, e assim por diante...

Seguinte, to com um problema, a letra do lcd é amarela, ele escreveu porém ainda fica os quadrados amarelos no fundo, fica muitooo ruim de ler, eu acho que é contraste muito alto e vocês?

OBS: Se desligar o BACKLIGHT esses quadrados desaparecem.

EDIT: Era isso mesmo, coloquei um pot de 10K e regulei, perfeito!!! Agora é fazer a USB funcionar hahaha. Vou utilizar o mesmo tópico para tirar minhas dúvidas da USB ok?

Tá dando esse erro aqui:

erroan.png

Meu código:

O que vocês acham que pode ser?

Link para o comentário
Compartilhar em outros sites

Tá dando esse erro aqui:

erroan.png

O que vocês acham que pode ser?

Nunca usei esse mikroC, você configurou os descritores corretamente?

O regulador interno de 3.3V do transceiver USB está habilitado? (ou você usa fonte de 3.3V no MCU e tensão externa no transceiver usb?)

Colocou o capacitor no pino VUSB?

você está usando USB Self Powered ou Bus Powered?

Tem certeza que o D+ e o D- nao estão invertidos entre si? verifica as conexoes

O clock do MCU está configurado corretamente? pois a configuracão do clock desses mcus com usb da famila PIC18 é bem chatinha, tem que configurar varios prescalers e postscalers.

Já usei usb HID E CDC e pra mim também dava esse mesmo erro que está acontecendo pra você. Se nao me engano o problema era um dos itens que citei acima.

EDIT: você usa a funcao "recebe = HID_Read();", você nao teria que primeiro ter certeza que o seu MCU está enumerado no barramento usb para depois chamar esta funcao? deve ter alguma funcao nesse exemplo que você esta utilizando que retorna o status de enumeracao (no CCS e no MPLAB C18 pelo menos tem) Ja cometi este tipo de erro, pode ser que seja isso tambem. Se voce usar com. USB e alimentacao do circuito independente da usb, você deve usar um pino de i/o pra determinar de a usb está plugada no circuito.

Detalhe: pelo que vi no datasheet, para um cristal de 24mhz, as configuracoes devem ser as seguintes:

(pll prescaler) PLLDIV = 6

(pll postscaler) CPU DIV = 0 ou talvez CPU DIV = 1

problema de driver nao é, pois o driver HID existe por padrão nos sistemas operacionais

Link para o comentário
Compartilhar em outros sites

Nunca usei esse mikroC, você configurou os descritores corretamente?

Sim

O regulador interno de 3.3V do transceiver USB está habilitado? (ou você usa fonte de 3.3V no MCU e tensão externa no transceiver usb?)

O que seria isso?

Colocou o capacitor no pino VUSB?

Não, qual valor você recomenda? Ligo o capacitor entre o vusb e o gnd né?

você está usando USB Self Powered ou Bus Powered?

Bus Powered.

Tem certeza que o D+ e o D- nao estão invertidos entre si? verifica as conexoes

Verifiquei, está tudo correto. PS: O fio verde é o D+ certo?

O clock do MCU está configurado corretamente? pois a configuracão do clock desses mcus com usb da famila PIC18 é bem chatinha, tem que configurar varios prescalers e postscalers.

Sim, 48 Mhz.

EDIT: você usa a funcao "recebe = HID_Read();", você nao teria que primeiro ter certeza que o seu MCU está enumerado no barramento usb para depois chamar esta funcao? deve ter alguma funcao nesse exemplo que você esta utilizando que retorna o status de enumeracao (no CCS e no MPLAB C18 pelo menos tem) Ja cometi este tipo de erro, pode ser que seja isso também. Se voce usar com. USB e alimentacao do circuito independente da usb, você deve usar um pino de i/o pra determinar de a usb está plugada no circuito.

Vou verificar.

Detalhe: pelo que vi no datasheet, para um cristal de 24mhz, as configuracoes devem ser as seguintes:

(pll prescaler) PLLDIV = 6

(pll postscaler) CPU DIV = 0 ou talvez CPU DIV = 1

Está PLLDIV em 6, e o CPU DIV está assim: "[OSC1/OSC2 Src: /1][96Mhz PLL Src: /2]".

As opções:


[OSC1/OSC2 Src: /4][96Mhz PLL Src: /6]
[OSC1/OSC2 Src: /3][96Mhz PLL Src: /4]
[OSC1/OSC2 Src: /2][96Mhz PLL Src: /3]
[OSC1/OSC2 Src: /1][96Mhz PLL Src: /2]

EDIT:

FUNCIONOU!!!

Coloquei um capacitor de 100nF no vusb - gnd e funcionou!!

EDIT 2:

Galera, só to com um problema..

Olha só:


if (buffer_leitura[0] == 'A') Lcd_Chr(buffer_leitura[1], buffer_leitura[2], buffer_leitura[3]); //adicionar caracter

Todos os outros comandos funcionam normalmente, mas esse...

Não funciona.. Eu abro o HID Terminal do MikroC e digito lá A11D, ele não mostra nada na tela...

O que pode ser?

Link para o comentário
Compartilhar em outros sites

Dani piresk:

- Sobre o regulador do transceiver: O transceiver da USB (que é diferencial e half-duplex) funciona com 3.3V. O PIC possui internamente um regulador de 3.3V para o controlador USB. Se voce utiliza alimentacao de 5V no PIC, deve-se habilitar esse regulador. Agora, se seu pic fosse alimentado com 3.3V (e nao 5V), voce teria que desabilitar o regulador interno de 3.3V do PIC e conectar a fonte de alimentacao do PIC no pino VUSB (ele seria entrada daí). Ja usei USB num PIC18F4553 desta última forma. Olhe no datasheet do PIC na página de descricao da interface USB, verá que há um bit de algum registrador que habilita/desabilita esse regulador interno (mas ele também pode ser desabitado/habilitado por comando pré-processador/ fusíveis).

- Sobre o capacitor de desacoplamento no pino VUSB: O datasheet recomenda um valor de 220nF. Eu sempre utilizei 470nF em todos projetos e nunca tive problemas. Então recomendo-lhe usar este valor também :D

- Sobre o erro que voce disse estar acontecendo: Essa funcao le o buffer de recepcao. Mas como voce quer ler o buffer de recepcao se você nem sabe se há algo válido para leitura? Com certeza há uma funcao nesse seu exemplo do mikroC que retorna se há dados válidos diponíveis (e a quantidade de valores válidos diponiveis) para leitura no buffer de repcepcao.

- Outra coisa: Nao sei se você leu bastanta sobre teoria de USB antes de iniciar seus testes, mas, quando um pacote de dados é recebido num dispositivo USB, este pacote deve ser lido completamente, e só depois disso a interface USB aceitará receber novos pacotes do Host (PC no caso).

Exemplo: Você recebeu um pacote com 30bytes do PC, então o PIC irá ignorar todos os novos pacotes enviados pelo Host e somente aceitará receber novos pacotes de dados assim que os 30bytes que estão no buffer forem lidos, para que os dados anteriores não sejam sobescritos com os novos valores. Sempre um dispositivo USB tem dados a serem lidos no buffer e o host tenta enviar outro pacote, o dispositivo envia um pacote de Handshake com o PID = NAK para o PC, informando-o que os dados anteriores ainda nao foram processados e que o PIC ainda nao está preparado para receber novos pacotes. Mas nao precisa se preocupar com isso, o controlador USB do PIC faz isso automaticamente por hardware.

Um pergunta: Como funciona esse HIDTerminal do mikroC? ele envia pacotes de dados via HID? Posso escolher o dispositivo e o endpoint/pipe a ser utilizado?

Poderia compartilhar ele aqui? Já que ele é HID e HID é padrão, gostaria de testar comunicacao com um firmware USB para PIC que fiz no CCS C, pois até hoje sempre usei CDC emulando UART sobre USB.

Compartilha esse HIDTerminal ae se puder.

EDIT: pelo que entendi esse hidterminal é uma ferramenta integrada no mikroC. Posso abrir o mikroC e usar somente o hidterminal?

Recomendo que você baixe o "USBTrace" e "USBlyzer", que sao os 2 melhores monitoradores/debugadores para portas USB. Com eles voce poderia monitorar se o mikroC está realmente enviando pacotes de dados pelas portas (e também seria possivel ver os descritores do seu PIC, ele mostra). Se quiser me adiciona no msn que te passo eles.

OBS: "USB in a Nutshell - Making Sense of the USB Standard", o melhor tutorial sobre USB para quem quer aprender o funcionamento de barramentos USB, tipos de pacotes utilizados,tipos de velocidades disponiveis, tipos de transferencia, descritores, codificacao de bits e parte de hardware USB:

http://www.beyondlogic.org/usbnutshell/usb-in-a-nutshell.pdf

Link para o comentário
Compartilhar em outros sites

Bom, o problema era de ponteiros...

Agora o último problema tá sendo a conversão de str pra int, para usar na função lcd_out..

To testando aqui.

EDIT: Tive que dar uma saída e só voltei a 1 h atrás, então não pude testar ainda. Se alguém tiver alguma sugestão do que pode ser..

EDIT: RESOLVIDO!!! Consegui resolver com a função atoi, nem sabia que o mikroc tinha ela, por isso nem tinha usado antes hehe... Nada que dar uma lida no manual não resolva huheuhee

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!