Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
ELETRÔNICA / ELÉTRICA => Eletrônica Básica => Microcontroladores => Tópico iniciado por: Ananda em 16 de Julho de 2014, 15:51
-
Boa Tarde queridos,
Estou com algumas duvidas pertinentes aos display de LCD serial. Primeiro, fiz um programa no Ldmicro, e simulei no protheus, tudo funciona normalmente, entretanto, o display não mostra os dados (muito embora ligue). Qual poderia ser o problema?
Segundo, gostaria de saber se posso utilizar qualquer tipo de display (inclusive previamente paralelo com modulo serial) para comunicar com o pic (via porta serial TX)? Ou apenas um tipo específico?
Muito Obrigada!!!
-
Primeiro, fiz um programa no Ldmicro, e simulei no protheus, tudo funciona normalmente, entretanto, o display não mostra os dados (muito embora ligue). Qual poderia ser o problema?
Vou tentar ajudar, mesmo não sabendo qual é o display que você tá usando.
Poderia ser:
-Falta de contraste
-Pouco tempo entre energizar o display e o começo da programação
-Pouco tempo entre o envio de um comando e o envio do próximo
-Velocidade de comunicação (baud rate) errada
-Pino de reset (se houver) continua ressetando o bicho
-Tensão errada entre a saída do controlador e a entrada do display (supondo que o controlador seja de 3,3V e o display de 5V, por exemplo)
-Tensão errada de alimentação ou falta de capacitor desacoplador
Me avise se pode ser algum destes, por favor.
Segundo, gostaria de saber se posso utilizar qualquer tipo de display (inclusive previamente paralelo com modulo serial) para comunicar com o pic (via porta serial TX)? Ou apenas um tipo específico?
Poder, sempre pode, desde que você adapte o circuito e/ou programação do controlador.
Sucesso!!!
-
Nunca tive sucesso em utilizar o LDmicro com LCD...
-
Não sei se lhe ajuda, mas montei alguns LCD 16x2 e 20x4 utilizando 74hc164 e pic12f675.
Comecei aqui, link:
http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html (http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html)
-
Ananda,
tem o modelo deste LCD serial? Ou fotos para tentar identificar?
-
Ananda,
tem o modelo deste LCD serial? Ou fotos para tentar identificar?
Então, o display que usei no protheys foi um Milkford serial 16x2. Mas, se possível gostaria de usar um paralelo com simples módulo serial, (uma vez que tenho um padrão hitachi já aqui)
-
Não sei se lhe ajuda, mas montei alguns LCD 16x2 e 20x4 utilizando 74hc164 e pic12f675.
Comecei aqui, link:
http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html (http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html)
Rodrigo, adorei a ideia, vou olhar com mais calma o link, mas parece que é o que eu precisava. Você usou a porta serial do PIC para mandar os dados? que linguagem usaste para programar? Ladder? deu tudo certo?
Muito obrigada,
bjs
-
Por que você quer usar UART?
-
Ananda Mohini Dasi,
Você é uma estudante? (https://www.facebook.com/anandamohinid (https://www.facebook.com/anandamohinid))
-
Não sei se lhe ajuda, mas montei alguns LCD 16x2 e 20x4 utilizando 74hc164 e pic12f675.
Comecei aqui, link:
http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html (http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html)
Rodrigo, adorei a ideia, vou olhar com mais calma o link, mas parece que é o que eu precisava. Você usou a porta serial do PIC para mandar os dados? que linguagem usaste para programar? Ladder? deu tudo certo?
Muito obrigada,
bjs
Ananda, usei um pino qualquer para o clock e outro para enviar os dados, é bem simples.
Estou programando em C utilizando mplab X compilador CCS e estou utilizando pic16f877.
-
Ananda Mohini Dasi,
Você é uma estudante? (https://www.facebook.com/anandamohinid (https://www.facebook.com/anandamohinid))
Sou sim , estudo na Fatec-sp
-
Não sei se lhe ajuda, mas montei alguns LCD 16x2 e 20x4 utilizando 74hc164 e pic12f675.
Comecei aqui, link:
http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html (http://www.circuitvalley.com/2011/12/two-wire-serial-lcd-16x2-graphics.html)
Rodrigo, adorei a ideia, vou olhar com mais calma o link, mas parece que é o que eu precisava. Você usou a porta serial do PIC para mandar os dados? que linguagem usaste para programar? Ladder? deu tudo certo?
Muito obrigada,
bjs
Ananda, usei um pino qualquer para o clock e outro para enviar os dados, é bem simples.
Estou programando em C utilizando mplab X compilador CCS e estou utilizando pic16f877.
ROdrigo, então, estou usando o LDmicro para programar em ladder, como meus dados foram armazenados no UART, o pino de transmissão do PIC será o TX (correto?), por isto queria utiliza-lo para transmissão serial. VOu tentar a interface com aquelas CIs, pra ver o que que dá. Acho q não preciso mudar os códigos né? Ou será q coisas como xfe/x01 (código q manda o cursos pra primeira coluna primeira linha), não são compreendidas pelo paralelo, mesmo com a interface daquele 74hc164 ???
Obrigadão pessoal bjs!
-
Ananda Mohini Dasi,
Você é uma estudante? (https://www.facebook.com/anandamohinid (https://www.facebook.com/anandamohinid))
Será Fake????
-
Ananda,
Ananda Mohini Dasi,
Você é uma estudante? (https://www.facebook.com/anandamohinid (https://www.facebook.com/anandamohinid))
Sou sim , estudo na Fatec-sp
Então o seu nickname e/ou o seu nome de registro neste fórum são falsos?
-
Não acho que isto realmente importe. Mas, Mohini dasi é um nome religioso. Não, não sou fake.
-
Não acho que isto realmente importe. Mas, Mohini dasi é um nome religioso. Não, não sou fake.
pense bem se eu me cadastra-se como "pedra iluminada" e me apresenta-se como "João Luz das latas" sendo nenhum destes meu nome verdadeiro ficaria estranho. mas realmente isso não importa se puder trazer alguma contribuição ao grupo.
ps: seja bem vinda!!!ou bem vindo!!! nossa to meio perdido agora!
-
Ananda,
Ou seja lá qual for o seu nome....
Não acho que isto realmente importe. Mas, Mohini dasi é um nome religioso. Não, não sou fake.
Nada contra você usar nomes religiosos ou quaisquer outros nomes de sua preferência. Mas a turma daqui tem como costume:
(1) Usar o próprio nome ou parte do nome como "nickname" e informar o nome.
(2) Cadastar um "nickname" fantasia e informar o nome.
(3) Quem entra para este fórum, primeiramente se identifica e se apresenta.
São algumas "regrinhas saudáveis" deste fórum, que não fazem mal e ajudam a manter as coisas mais organizadas.
Não estou dizendo que seja o seu caso!! Mas, em passado recente tivemos pessoas que faziam se passar por outras e até homem se fazendo passar por mulher para bagunçar o fórum e/ou ganhar maior atenção, tendo em vista que a maioria aqui são homens.
-
vai aqui uma tela do proteus
(https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xap1/v/t1.0-9/10636310_1469740166636101_2304103696349843805_n.jpg?oh=2edf8f42b9632475fb0c5b346cda403e&oe=548BC26B&__gda__=1417962066_65776b7db850f0150e11ca7a5f09f3d6)
/* Código de exemplo de Leitura de temperatura com LM35 e PIC16F877A. Com *
* apresentação em display LCD e porta serial. Compilado com o PICC-CCS *
* Autor: Nelson Camilo de Almeida *
* [url=http://www.pictronics.com.br]www.pictronics.com.br[/url] *
* Data 28/03/2011 */
#include <16F877A.h>
#device adc = 10 // Configura ADC para 10 Bits
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock = 4000000) // Configura clock do PIC
// Configura comunicação serial para 9600,8,N,1
#use rs232(baud = 9600, parity = N, xmit = PIN_C6, rcv = PIN_C7, bits = 8)
//#include "main_LM35+PIC.h" // Biblioteca de configuração
#include "mod_lcd.c" // Biblioteca para LCD
void main()
{
int16 valor_anal, valor_temp; // Variáveis do programa
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_adc_channel(0); // Canal do ADC
lcd_ini(); // inicializa o display
lcd_escreve ("\f TempPictronics"); // Nome do Projeto no LCD
printf ("TempPictronics\r"); // Nome do Projeto na Serial
while (true)
{
valor_anal = read_adc(); // Lê o LM35
valor_temp = 5.0 * valor_anal * 100.0 / 1023.0; // Converte em graus celsius
lcd_pos_xy (1, 2); // Posiciona o cursor no display
// Escreve no display a Temperatura lida pelo ADC
printf (lcd_escreve, "Temp: %2.1f%cC", (float)valor_temp, 0b11011111);
// Envia para a porta serial a Temperatura lida do LM35
printf("%2.1f\r", (float)valor_temp);
delay_ms (500); // Dá um tempinho
}
}
/************************************************************************/
/* MOD_LCD.C - Biblioteca de manipulação de módulo LCD */
/* */
/* Autor: Fábio Pereira */
/* */
/************************************************************************/
// As definições a seguir são utilizadas para acesso aos pinos do display
// caso o pino RW não seja utilizado, comente a definição lcd_rw
#ifndef lcd_enable
#define lcd_enable pin_e1 // pino enable do LCD
#define lcd_rs pin_e0 // pino rs do LCD
//#define lcd_rw pin_e2 // pino rw do LCD
#define lcd_d4 pin_d4 // pino de dados d4 do LCD
#define lcd_d5 pin_d5 // pino de dados d5 do LCD
#define lcd_d6 pin_d6 // pino de dados d6 do LCD
#define lcd_d7 pin_d7 // pino de dados d7 do LCD
#endif
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40 // Endereço da segunda linha na RAM do LCD
// a constante abaixo define a seqüência de inicialização do módulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};
byte lcd_le_byte()
// lê um byte do LCD (somente com pino RW)
{
byte dado;
// configura os pinos de dados como entradas
input(lcd_d4);
input(lcd_d5);
input(lcd_d6);
input(lcd_d7);
// se o pino rw for utilizado, coloca em 1
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_high(lcd_enable); // habilita display
dado = 0; // zera a variável de leitura
// lê os quatro bits mais significativos
if (input(lcd_d7)) bit_set(dado,7);
if (input(lcd_d6)) bit_set(dado,6);
if (input(lcd_d5)) bit_set(dado,5);
if (input(lcd_d4)) bit_set(dado,4);
// dá um pulso na linha enable
output_low(lcd_enable);
output_high(lcd_enable);
// lê os quatro bits menos significativos
if (input(lcd_d7)) bit_set(dado,3);
if (input(lcd_d6)) bit_set(dado,2);
if (input(lcd_d5)) bit_set(dado,1);
if (input(lcd_d4)) bit_set(dado,0);
output_low(lcd_enable); // desabilita o display
return dado; // retorna o byte lido
}
void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
// coloca os quatro bits nas saidas
output_bit(lcd_d4,bit_test(dado,0));
output_bit(lcd_d5,bit_test(dado,1));
output_bit(lcd_d6,bit_test(dado,2));
output_bit(lcd_d7,bit_test(dado,3));
// dá um pulso na linha enable
output_high(lcd_enable);
output_low(lcd_enable);
}
void lcd_envia_byte( boolean endereco, byte dado )
{
// coloca a linha rs em 0
output_low(lcd_rs);
// aguarda o display ficar desocupado
//while ( bit_test(lcd_le_byte(),7) ) ;
// configura a linha rs dependendo do modo selecionado
output_bit(lcd_rs,endereco);
delay_us(100); // aguarda 100 us
// caso a linha rw esteja definida, coloca em 0
#ifdef lcd_rw
output_low(lcd_rw);
#endif
// desativa linha enable
output_low(lcd_enable);
// envia a primeira parte do byte
lcd_envia_nibble(dado >> 4);
// envia a segunda parte do byte
lcd_envia_nibble(dado & 0x0f);
}
void lcd_ini()
// rotina de inicialização do display
{
byte conta;
output_low(lcd_d4);
output_low(lcd_d5);
output_low(lcd_d6);
output_low(lcd_d7);
output_low(lcd_rs);
#ifdef lcd_rw
output_high(lcd_rw);
#endif
output_low(lcd_enable);
delay_ms(15);
// envia uma seqüência de 3 vezes 0x03
// e depois 0x02 para configurar o módulo
// para modo de 4 bits
for(conta=1;conta<=3;++conta)
{
lcd_envia_nibble(3);
delay_ms(5);
}
lcd_envia_nibble(2);
// envia string de inicialização do display
for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}
void lcd_pos_xy( byte x, byte y)
{
byte endereco;
if(y!=1)
endereco = lcd_seg_lin;
else
endereco = 0;
endereco += x-1;
lcd_envia_byte(0,0x80|endereco);
}
void lcd_escreve( char c)
// envia caractere para o display
{
switch (c)
{
case '\f' : lcd_envia_byte(0,1);
delay_ms(2);
break;
case '\n' :
case '\r' : lcd_pos_xy(1,2);
break;
case '\b' : lcd_envia_byte(0,0x10);
break;
default : lcd_envia_byte(1,c);
break;
}
}
char lcd_le( byte x, byte y)
// le caractere do display
{
char valor;
// seleciona a posição do caractere
lcd_pos_xy(x,y);
// ativa rs
output_high(lcd_rs);
// lê o caractere
valor = lcd_le_byte();
// desativa rs
output_low(lcd_rs);
// retorna o valor do caractere
return valor;
}
espero que ajude!!!
-
Ananda,
Ou seja lá qual for o seu nome....
Não acho que isto realmente importe. Mas, Mohini dasi é um nome religioso. Não, não sou fake.
Nada contra você usar nomes religiosos ou quaisquer outros nomes de sua preferência. Mas a turma daqui tem como costume:
(1) Usar o próprio nome ou parte do nome como "nickname" e informar o nome.
(2) Cadastar um "nickname" fantasia e informar o nome.
(3) Quem entra para este fórum, primeiramente se identifica e se apresenta.
São algumas "regrinhas saudáveis" deste fórum, que não fazem mal e ajudam a manter as coisas mais organizadas.
Não estou dizendo que seja o seu caso!! Mas, em passado recente tivemos pessoas que faziam se passar por outras e até homem se fazendo passar por mulher para bagunçar o fórum e/ou ganhar maior atenção, tendo em vista que a maioria aqui são homens.
Entendo... Em fim, se serve de conforto, meu primeiro nome é Ananda mesmo, então acho que está tudo bem. Bom, não pretendo fazer bagunça, só trocar informações da nossa área mesmo!
Paulo Lumens, agradeço vou dar uma olhada mais atenta no esquema e na prog que você mandou, muito obrigada!