Ir ao conteúdo
  • Cadastre-se

Malditas Interferências [ LCD/PIC]


rodrigocirilo

Posts recomendados

@aphawk, Na clp que controla o display 16x2 estou usandoa biblioteca lcd_flex.c ( não lembro porque usei essa)

 

aqui lcd_flex.c

// Flex_LCD420.c// These pins are for my Microchip PicDem2-Plus board,// which I used to test this driver.// An external 20x4 LCD is connected to these pins.// Change these pins to match your own board's connections.#define LCD_DB4   PIN_C4#define LCD_DB5   PIN_C5#define LCD_DB6   PIN_C6#define LCD_DB7   PIN_C7#define LCD_RS    PIN_C1#define LCD_RW    PIN_C2#define LCD_E     PIN_C0/*// To prove that the driver can be used with random// pins, I also tested it with these pins:#define LCD_DB4   PIN_D4#define LCD_DB5   PIN_B1#define LCD_DB6   PIN_C5#define LCD_DB7   PIN_B5#define LCD_RS    PIN_E2#define LCD_RW    PIN_B2#define LCD_E     PIN_D6*/// If you want only a 6-pin interface to your LCD, then// connect the R/W pin on the LCD to ground, and comment// out the following line.  Doing so will save one PIC// pin, but at the cost of losing the ability to read from// the LCD.  It also makes the write time a little longer// because a static delay must be used, instead of polling// the LCD's busy bit.  Normally a 6-pin interface is only// used if you are running out of PIC pins, and you need// to use as few as possible for the LCD.#define USE_RW_PIN   1     //////////////para usar este pino como I/O tem que comentar e joga RW no gnd// These are the line addresses for most 4x20 LCDs.#define LCD_LINE_1_ADDRESS 0x00#define LCD_LINE_2_ADDRESS 0x40#define LCD_LINE_3_ADDRESS 0x14#define LCD_LINE_4_ADDRESS 0x54// These are the line addresses for LCD's which use// the Hitachi HD66712U controller chip./*#define LCD_LINE_1_ADDRESS 0x00#define LCD_LINE_2_ADDRESS 0x20#define LCD_LINE_3_ADDRESS 0x40#define LCD_LINE_4_ADDRESS 0x60*///========================================#define lcd_type 2   // 0=5x7, 1=5x10, 2=2 lines(or more)int8 lcd_line;int8 const LCD_INIT_STRING[4] ={ 0x20 | (lcd_type << 2),  // Set mode: 4-bit, 2+ lines, 5x8 dots 0xc,                     // Display on 1,                       // Clear display 6                        // Increment cursor };                             //-------------------------------------void lcd_send_nibble(int8 nibble){// Note:  !! converts an integer expression// to a boolean (1 or 0). output_bit(LCD_DB4, !!(nibble & 1)); output_bit(LCD_DB5, !!(nibble & 2));  output_bit(LCD_DB6, !!(nibble & 4));    output_bit(LCD_DB7, !!(nibble & 8));    delay_cycles(1); output_high(LCD_E); delay_us(2); output_low(LCD_E);}//-----------------------------------// This sub-routine is only called by lcd_read_byte().// It's not a stand-alone routine.  For example, the// R/W signal is set high by lcd_read_byte() before// this routine is called.     #ifdef USE_RW_PINint8 lcd_read_nibble(void){int8 retval;// Create bit variables so that we can easily set// individual bits in the retval variable.#bit retval_0 = retval.0#bit retval_1 = retval.1#bit retval_2 = retval.2#bit retval_3 = retval.3retval = 0;   output_high(LCD_E);delay_us(1);retval_0 = input(LCD_DB4);retval_1 = input(LCD_DB5);retval_2 = input(LCD_DB6);retval_3 = input(LCD_DB7); output_low(LCD_E);delay_us(1);   return(retval);   }   #endif//---------------------------------------// Read a byte from the LCD and return it.#ifdef USE_RW_PINint8 lcd_read_byte(void){int8 low;int8 high;output_high(LCD_RW);delay_cycles(1);high = lcd_read_nibble();low = lcd_read_nibble();return( (high<<4) | low);}#endif//----------------------------------------// Send a byte to the LCD.void lcd_send_byte(int8 address, int8 n){output_low(LCD_RS);#ifdef USE_RW_PINwhile(bit_test(lcd_read_byte(),7)) ;#elsedelay_us(60); #endifif(address)   output_high(LCD_RS);else   output_low(LCD_RS);      delay_cycles(1);#ifdef USE_RW_PINoutput_low(LCD_RW);delay_cycles(1);#endifoutput_low(LCD_E);lcd_send_nibble(n >> 4);lcd_send_nibble(n & 0xf);}//----------------------------void lcd_init(void){int8 i;lcd_line = 1;output_low(LCD_RS);#ifdef USE_RW_PINoutput_low(LCD_RW);#endifoutput_low(LCD_E);// Some LCDs require 15 ms minimum delay after// power-up.  Others require 30 ms.  I'm going// to set it to 35 ms, so it should work with// all of them.delay_ms(35);         for(i=0 ;i < 3; i++)   {    lcd_send_nibble(0x03);    delay_ms(5);   }lcd_send_nibble(0x02);for(i=0; i < sizeof(LCD_INIT_STRING); i++)   {    lcd_send_byte(0, LCD_INIT_STRING[i]);       // If the R/W signal is not used, then    // the busy bit can't be polled.  One of    // the init commands takes longer than    // the hard-coded delay of 50 us, so in    // that case, lets just do a 5 ms delay    // after all four of them.    #ifndef USE_RW_PIN    delay_ms(5);    #endif   }}//----------------------------void lcd_gotoxy(int8 x, int8 y){int8 address;switch(y)  {   case 1:     address = LCD_LINE_1_ADDRESS;     break;   case 2:     address = LCD_LINE_2_ADDRESS;     break;   case 3:     address = LCD_LINE_3_ADDRESS;     break;   case 4:     address = LCD_LINE_4_ADDRESS;     break;   default:     address = LCD_LINE_1_ADDRESS;     break;       }address += x-1;lcd_send_byte(0, 0x80 | address);}//-----------------------------void lcd_putc(char c){ switch(c)   {    case '\f':      lcd_send_byte(0,1);      lcd_line = 1;      delay_ms(2);      break;       case '\n':       lcd_gotoxy(1, ++lcd_line);       break;       case '\b':       lcd_send_byte(0,0x10);       break;       default:       lcd_send_byte(1,c);       break;   }}//------------------------------#ifdef USE_RW_PINchar lcd_getc(int8 x, int8 y){char value;lcd_gotoxy(x,y);// Wait until busy flag is low.while(bit_test(lcd_read_byte(),7)); output_high(LCD_RS);value = lcd_read_byte();output_low(LCD_RS);return(value);}#endif

já na clp que controla o display de 20x4 estou usando a biblioteca lcd420.c  tambem do CCS

 

 

Editando:

 

@aphawk, @MatheusLPS e @vtrx caros amigos, fiz uma alteração para a biblioteca lcd.c e retirei a lcd_flex.c, eu percebi (não sei se tem alguma relação) que na simulação do proteus os pinos do uC que vão para o LCD ficam piscando entre azul e vermelho, pois bem, com essa biblioteca FLEX algumas vezes eles piscavam amarelo (bem rápido )  mas piscavam, pode ser que tenha alguma relação com a probabilidade de interferência!!  Agora que coloquei só a LCD.C parou de piscar amarelo as vezes!!!

Att.

Link para o comentário
Compartilhar em outros sites

@rodrigocirilo,

 

Tá fácil modificar, até eu consigo fazer isso.... esse código fonte tá muito bem explicado, e foi escrito por um ser humano normal kkk, sem aqueles "truques" de simbolos malucos que só Deus entende !

 

Vamos ver se aparece alguém mais experiente em C, senão eu faço e te passo.

 

Quanto ao que voce falou, de piscar, acho que não tem nada a ver com o problema. 

 

Paulo

Link para o comentário
Compartilhar em outros sites

@aphawk, seguinte, alterei o codigo para trabalhar com 1Mhz, fui comprar os cristais e quem disse que eu achei!!! que falta nos faz uma Santa Efigênia kkk.

 

Paulo então vou abaixar o clock da clp que está a 20mhz para 4Mhz (esta trava o lcd só as vezes) e a que está travando o lcd direto vou manter em 4mhz (por falta de cristal nessa porcaria de cidade), há uma maneira de reduzir o clock via software???

 

Estou no aguardo da atualização da biblioteca...

 

Att.

Link para o comentário
Compartilhar em outros sites

Muda para  delay_us(5);

 

Esse delay_cycles é independente do valor do cristal indicado no programa, o tempo dele depende do tempo do ciclo de máquina, exemplo:

 

Cristal 4MHz:

delay_cycles(1); -->= 1us

 

Cristal 8MHz:

delay_cycles(1); -->= 0.5us

 

Cristal 20MHz:

delay_cycles(1); -->= 0.2us

 

Com o delay_us(); o compilador calcula para você o número de ciclos necessários para dar o tempo indicado.

Link para o comentário
Compartilhar em outros sites

@rodrigocirilo,

 

Já é um bom começo essas alterações que o Projetos_afg postou, mas eu aumentaria ainda mais os delays , para 10 uS.

 

E acrescentaria ainda outros delays, todos pequenos também, que vai ficar imperceptível no seu display, mas vai eliminar qualquer problema de alteração por efeito capacitivo.

// Flex_LCD420.c// These pins are for my Microchip PicDem2-Plus board,// which I used to test this driver.// An external 20x4 LCD is connected to these pins.// Change these pins to match your own board's connections.#define LCD_DB4   PIN_C4#define LCD_DB5   PIN_C5#define LCD_DB6   PIN_C6#define LCD_DB7   PIN_C7#define LCD_RS    PIN_C1#define LCD_RW    PIN_C2#define LCD_E     PIN_C0/*// To prove that the driver can be used with random// pins, I also tested it with these pins:#define LCD_DB4   PIN_D4#define LCD_DB5   PIN_B1#define LCD_DB6   PIN_C5#define LCD_DB7   PIN_B5#define LCD_RS    PIN_E2#define LCD_RW    PIN_B2#define LCD_E     PIN_D6*/// If you want only a 6-pin interface to your LCD, then// connect the R/W pin on the LCD to ground, and comment// out the following line.  Doing so will save one PIC// pin, but at the cost of losing the ability to read from// the LCD.  It also makes the write time a little longer// because a static delay must be used, instead of polling// the LCD's busy bit.  Normally a 6-pin interface is only// used if you are running out of PIC pins, and you need// to use as few as possible for the LCD.#define USE_RW_PIN   1     //////////////para usar este pino como I/O tem que comentar e joga RW no gnd// These are the line addresses for most 4x20 LCDs.#define LCD_LINE_1_ADDRESS 0x00#define LCD_LINE_2_ADDRESS 0x40#define LCD_LINE_3_ADDRESS 0x14#define LCD_LINE_4_ADDRESS 0x54// These are the line addresses for LCD's which use// the Hitachi HD66712U controller chip./*#define LCD_LINE_1_ADDRESS 0x00#define LCD_LINE_2_ADDRESS 0x20#define LCD_LINE_3_ADDRESS 0x40#define LCD_LINE_4_ADDRESS 0x60*///========================================#define lcd_type 2   // 0=5x7, 1=5x10, 2=2 lines(or more)int8 lcd_line;int8 const LCD_INIT_STRING[4] ={ 0x20 | (lcd_type << 2),  // Set mode: 4-bit, 2+ lines, 5x8 dots 0xc,                     // Display on 1,                       // Clear display 6                        // Increment cursor };                             //-------------------------------------void lcd_send_nibble(int8 nibble){// Note:  !! converts an integer expression// to a boolean (1 or 0). output_bit(LCD_DB4, !!(nibble & 1)); output_bit(LCD_DB5, !!(nibble & 2));  output_bit(LCD_DB6, !!(nibble & 4));    output_bit(LCD_DB7, !!(nibble & 8));    delay_us(10); delay_cycles(1); output_high(LCD_E); delay_us(10); output_low(LCD_E);}//-----------------------------------// This sub-routine is only called by lcd_read_byte().// It's not a stand-alone routine.  For example, the// R/W signal is set high by lcd_read_byte() before// this routine is called.     #ifdef USE_RW_PINint8 lcd_read_nibble(void){int8 retval;// Create bit variables so that we can easily set// individual bits in the retval variable.#bit retval_0 = retval.0#bit retval_1 = retval.1#bit retval_2 = retval.2#bit retval_3 = retval.3retval = 0;delay_us(10);output_high(LCD_E);delay_us(10);retval_0 = input(LCD_DB4);retval_1 = input(LCD_DB5);retval_2 = input(LCD_DB6);retval_3 = input(LCD_DB7);delay_us(10);output_low(LCD_E);delay_us(10);   return(retval);   }   #endif//---------------------------------------// Read a byte from the LCD and return it.#ifdef USE_RW_PINint8 lcd_read_byte(void){int8 low;int8 high;output_high(LCD_RW);delay_cycles(1);delay_us(10);high = lcd_read_nibble();low = lcd_read_nibble();delay_us(10);return( (high<<4) | low);}#endif//----------------------------------------// Send a byte to the LCD.void lcd_send_byte(int8 address, int8 n){delay_us(10);output_low(LCD_RS);#ifdef USE_RW_PINwhile(bit_test(lcd_read_byte(),7)) ;#elsedelay_us(120); #endifdelay_us(2);if(address)   output_high(LCD_RS);else   output_low(LCD_RS);      delay_cycles(1);delay_us(2);#ifdef USE_RW_PINdelay_us(10);output_low(LCD_RW);delay_us(10)delay_cycles(1);#endifdelay_us(10);output_low(LCD_E);delay_us(10);lcd_send_nibble(n >> 4);lcd_send_nibble(n & 0xf);}//----------------------------void lcd_init(void){int8 i;lcd_line = 1;delay_us(10);output_low(LCD_RS);delay_us(10);#ifdef USE_RW_PINoutput_low(LCD_RW);#endifdelay_us(10);output_low(LCD_E);// Some LCDs require 15 ms minimum delay after// power-up.  Others require 30 ms.  I'm going// to set it to 35 ms, so it should work with// all of them.delay_ms(50);         for(i=0 ;i < 3; i++)   {    lcd_send_nibble(0x03);    delay_ms(10);   }lcd_send_nibble(0x02);for(i=0; i < sizeof(LCD_INIT_STRING); i++)   {    lcd_send_byte(0, LCD_INIT_STRING[i]);    delay_us(10);    // If the R/W signal is not used, then    // the busy bit can't be polled.  One of    // the init commands takes longer than    // the hard-coded delay of 50 us, so in    // that case, lets just do a 5 ms delay    // after all four of them.    #ifndef USE_RW_PIN    delay_ms(10);    #endif   }}//----------------------------void lcd_gotoxy(int8 x, int8 y){int8 address;switch(y)  {   case 1:     address = LCD_LINE_1_ADDRESS;     break;   case 2:     address = LCD_LINE_2_ADDRESS;     break;   case 3:     address = LCD_LINE_3_ADDRESS;     break;   case 4:     address = LCD_LINE_4_ADDRESS;     break;   default:     address = LCD_LINE_1_ADDRESS;     break;       }address += x-1;lcd_send_byte(0, 0x80 | address);delay_us(10);}//-----------------------------void lcd_putc(char c){ switch(c)   {    case '\f':      lcd_send_byte(0,1);      lcd_line = 1;      delay_ms(5);      break;       case '\n':       lcd_gotoxy(1, ++lcd_line);       break;       case '\b':       lcd_send_byte(0,0x10);       break;       default:       lcd_send_byte(1,c);       break;   }}//------------------------------#ifdef USE_RW_PINchar lcd_getc(int8 x, int8 y){char value;lcd_gotoxy(x,y);// Wait until busy flag is low.while(bit_test(lcd_read_byte(),7)); delay_us(10);output_high(LCD_RS);value = lcd_read_byte();output_low(LCD_RS);delay_us(10);return(value);}#endif

Tenta e ve se resolve.

 

Paulo

Link para o comentário
Compartilhar em outros sites

@aphawk e @Projetos_afg muito obrigado galera, vou testar hj a noite.. depois posto os resultados, apesar que na hora do almoço fui lá ver a montagem e ja fizeram como eu havia pedido duas blindagens separadas para as duas telas... com a malha do lcd aterrada na placa e soldada na blindagem!!

 

Paulo este que você postou ja está com a inclusão dos demais delays?? se for ja copio, ou vou olhando e alterando....

 

Editando:

 

@aphawk ja vi que está alterado, vou usa-lo..

Link para o comentário
Compartilhar em outros sites

Se o problema é o delay, porque não utilizar a leitura do busy flag que todo LCD desses oferece para não ficar dependendo de delay?

Segue um explicativo de como fazer isso e dar uma ideia de como modificar no CCS (argh! que nojo de compilador)

http://www.8051projects.net/lcd-interfacing/busyflag.php


Pegando o gancho, o que ocorre de estranho com o LCD? Caracteres esquisitos?

Abs!

Link para o comentário
Compartilhar em outros sites

@,

 

Eu acho que é pior que o delay, ele está usando um cabo manga ( feito para áudio !!! ) que tem um efeito capacitivo, e isso pode estar fazendo o sinal chegar deformado ao LCD, minha ideia é justamente esperar um pouco mais antes de acionar os bits de controle, para esperar o sinal estabilizar. Fica fácil de testar, amanha já saberemos....

 

O que ocorre, é que é uma máquina que tem alguns solenóides, e quando aciona e desaciona corrompe a visualização no LCD, com caracteres esquisitos e tudo, mas o CLP continua funcionando direitinho. Já tentamos blindar o cabo, blindar o display, e apenas melhorou um pouco, sem resolver. Acho que agora vai !

 

Paulo

Link para o comentário
Compartilhar em outros sites

Isso ta com cara de "crosstalk", potencializado pelo cabo manga, uma vez que com os sinais pertinho e da forma que o cabo é distribuído la dentro está ocorrendo acoplamento entre os sinais de controle e dados, bagunçando tudo (obviamente os solenóides potencializam esse efeito, mas nem sempre são a causa raíz). Tanto que num outro topico que li, você Paulo, comentou que estava a usar o LCD com menos fios (acho que por I2C), mas essa tendencia cresce na industra a um bom tempo, inclusive com displays gráficos em que a interface Série é preferida ante a paralela, visando problemas de acoplamento, caso o display fique muito longe do processador host.


Aumentar o delay, pode resolver sim, mas nao sei se vai eliminar o problema todo, a minha sugestão iria um pouco além.... escrever no barramento de dados, usar o delay como filtro de amortecimento (no caso colocar logo um delay de 100u) e além disso ler o barramento de dados e se e somente se liberar os sinais de controle se o valor lido for igualzinho ao valor que deseja - se escrever. o mesmo vale para os sinais de controle. 

é mais processamento? Sem dúvida é, mas você blinda o seu barramento de dados com diversos mecanismos de segurança que podem garantir um bom desempenho com problema de acomplamento entre os sinais se houver e ainda te dar controle te tentar ou nao escrever novamento o dado no barramento.

Abs.

Felipe

Link para o comentário
Compartilhar em outros sites

@,

 

Isso mesmo, eu fiz com I2C a 10Khz e ficou uma maravilha ! E ví também um cara num Fórum que levou 5 metros dessa maneira, e ficou muito bom...

 

Boa ideia essa que voce deu, comparar os valores, pois os delays são isrrisórios para comunicação com LCD de texto. Eu tentei ver se o Rodrigo tinha um osciloscópio no local, mas ele não tinha, justamente prá ver  o tipo de problema que está acontecendo lá. Eu tenho quase certeza que é a capacitância do cabo, que junto com o ruído, deixa o sinal doido.

 

Mas tenho uma útima carta na manga ( minha manga kkk)  .... é o próprio CLP que aciona e desaciona o solenóide, então se esperar um pouco para esse ruído induzido passar, e só acionar o display depois disso, com certeza resolve também, pois só suja o display quando aciona o solenóide. É só não ficar escrevendo nada no display nesses momentos críticos, tipo esperar uns 500 mseg depois de acionar ou desacionar, para que não tenha a interferência na escrita do display.

 

Paulo

Link para o comentário
Compartilhar em outros sites

Bem, acho que de possíveis soluções ja temo, agora é aguardar o retorno do amigo.

Uma sugestão que quero deixar para projetos futuros, caso use o LCD e nao precise manter ele a distancia, sugiro que solde o LCD de forma que ele fique em cima do PIC, isso resultará em databus pequeno, layout mais fácil e maior imunidade a ruídos já que qualquer acomplamento será minimizado pelo menor comprimento das trilhas.

Sempre que possivel utilizar databus de baixa largura (o modo 4 bits do LCD), inclusive existem técnicas em que dar pra usar um unico pino do microcontrolador para rodar todos so sinais de controle do LCD usando filtros passa tudo para gerar deslocamento de fase entre os sinais, funciona que é uma beleza :)

Abs.

Felipe

Link para o comentário
Compartilhar em outros sites

@aphawk, @Projetos_afg e @

 

Bom amigos, quero agradecer o empenho em solucionar o problema, sem vocês eu estaria perdido hehe..

 

Vamos lá, o problema foi resolvido, nenhuma das telas se alteraram nos acionamentos dos solenoides...vou listar o que fiz, pois nem sei qual foi a opção que resolveu hehe

 

 - capacitores de 100nf e 10uF nos terminais de vcc e gnd direto no lcd.

 

- aterramento da malha do cabo.  ajudou

 

- blindagem metálica para os dois lcds (individual)  ajudou.

 

- capacitores de poliester de 100nf direto nos terminais de cada solenoide.

 

- solenoides para um lado e clp´s e lcd para outro (dentro da caixa) separados por uma chapa de aço inox.

 

- encurtamento em mais de 60% dos cabos, tanto dos lcd quanto dos teclados.

 

- diminuição do clock de uma das cpl´s  que estava com 20Mhz, foi abaixado para 4mhz, a outra se manteve em 4 Mhz.

 

- alteração da biblioteca do LCD ( feita pelo amigo Paulo).

 

Bom pessoal, foi isso tudo que fiz, e como disse agora não sei qual delas que resolveu, as que estão vermelhas ja tinha feito mas não resolveu, as outra como fiz de uma só vez não sei qual foi hehe.

 

A maquina ciclou mais de 50 vezes se nenhuma interferência.

 

Paulo você disse que o cabo manga é feito para audio, qual cabo seria adequado para interligação entre uC e LCD´s ??

 

@ eu ja estou desenhando para as proximas unidades, a clp ja conterá soldado na própria placa o LCD e o teclado será na própria placa tambem, de antemão ja pergunto, há algum macete para este tipo de montagem?

 

 

O que vocês acham que foi o ponto chave contra esta MALDITA INTERFERÊNCIA  kkkkkkkkkk....

 

Att.

Link para o comentário
Compartilhar em outros sites

Eu também já enfrentei muitos problemas com esses displays. Agora mesmo estou projetando um módulo dedicado para controlar o display, usando delays grandes e todas as técnicas para reduzir ruídos no sistema. O módulo consiste de uma plaquinha com um PIC16F1828 que fica dedicado no controle do LCD (pretendo também controlar o contraste e o backlight do display), esse PIC vai suportar os protocolos SPI, I2C e RS232 (TTL), e assim acredito que sanarei de uma vez por todas esses problemas com os displays, além de fornecer uma interface serial e flexível.

Link para o comentário
Compartilhar em outros sites

Bom, como nem tudo são flores hehe, acabei de receber uma ligação do colega que está lá no local das maquina e ele me disse que o display de 20x4 que raramente dava interferência e só no momento que acionava a solenoide, ele disse que após um tempo ligada só com 2 resistências atuando ela imprimiu lixo na tela.. :(   como falei é estranho pois esta dava interferência raramente....

 

Será que há alguma comando via software que posa ajudar, tipo de tempos em tempos dar o comando de inicialização do lcd??

Link para o comentário
Compartilhar em outros sites

@rodrigocirilo,

 

Experimente usar a mesma biblioteca alterada, creio que voce não usou ela nesse LCD.

 

Caso já tenha feito, altere o seu programa, coloque um delay de 1 segundo logo após enviar o comando para acionar ou desacionar, ok ?

 

Sobre os cabos para display...o melhor caminho é transformar ele em um display serial com nivel TTL. e usar um bom cabo blindado para levar até ele a alimentação, sinal serial e gnd. E aterrar mesmo assim a blindagem na ponta do CLP.

 

@Projetos_afg,

 

Eu tenho exatamente uma placa dessas, com I2C e serial TTL, e que aceita teclado matricial e rotary switch , e pode ligar um beep e ainda tem 4 saídas de Leds para sinalização . Fiz dois layouts para displays lcds diferentes, um na parte superior, e outro na parte inferior....

 

Paulo

Link para o comentário
Compartilhar em outros sites

Já ví um pessoal falando em reinicializar o display LCD periodicamente. Ao meu ver não me parece uma solução profissional, é só um quebra galho que pode ajudar um pouco, mas não chega na raíz do problema.

 

Ambos os displays estão ligados no mesmo microcontrolador? O driver é igual para ambos?

 

Bom, você pode aumentar os delays, de 5us para 10us, 20us, 50us... Até que encontre um valor que não dê problemas.

 

@aphawk

 

Interessante... Eu estou projetando um módulo para talvez vender, comprei esses pic da china por 1,86$ cada, já fiz uma placa protótipo, agora tenho que escrever o programa e arranjar algum lugar que fabrique as placas.

Link para o comentário
Compartilhar em outros sites

@aphawk, pois é eu ja havia colocado a mesma biblioteca para as duas clp´s.... este delay que você diz é depois do acionamento da solenoide?? mas o problema do lixo na lcd não está ocorrendo mais no momento dos acionamentos e sim só da maquina fica ligada ... as únicas coisas que ficam ligando/desligando são duas resistências, uma de 60w outra de 300w para aquecer determinadas partes da maquina...... são ligadas pela clp que estava tendo problemas hehe agora não mais... mas como eu disse esta que quase nao dava problema agora está dando, não sei se é por causa das resistências, acho que não pois antes sem acionar, ela ficava ligada varias horas e isso não acontecia...vai entender....

 

 

@Projetos_afg bom então eu posso aumentar os delays da biblioteca..

 

 

o driver é o mesmo para ambos..

 

É assim: 

 

PIC 16F876A controla 16x2 -    temperatura

PIC 16F877A controla o 20x4 - pressão e injeção

 

quando este 877A acionava as solenoide o lcd do 876A que dava pau.... agora isso parou, mas a 877A (20X4) que raramente dava problema no lcd agora só da maquina ficar ligada atuando nas resistencias  depois de um tempo imprime lixo no 20x4 ok.

Link para o comentário
Compartilhar em outros sites

@rodrigocirilo,

 

Aí muda tudo de figura !

 

Sem nenhum ruido gerado, suja o display, para mim é problema com o display mesmo. Pode ser um problema com o seu programa também , tipo invadir o stack, usar alguma variável com cálculo que extrapola, algo desse tipo. Não é mais ruído interferindo ! Pode ser que o chipset do seu display 20x4 não esteja aceitando bem as modificações dos delays. Experimente voltar então ao que era a biblioteca apenas desse display, ou troque ele por um outro semelhante, mas com outro chipset. Já tive um problema parecido uma vez.

 

Paulo


@Projetos_afg,

 

Eu também fiz para isso, e ficou muito legal, ela já encaixa direto em qualquer dos Lcds até 24x4 , e prevê as duas variações físicas de layout dos pinos dos LCDs. E ficou bem pequena, fisicamente. Ela aceitan tanto I2c como serial, o hardware é o mesmo, mas não coube as duas variações no mesmo processador, pois fiz para usar um Atmega48. 

 

Criei funções inteligentes para tudo, para ler teclado, para receber dados até o ENTER, para ler chave rotativa, para ser informado de alguma variação na chave rotativa, para mostrar mensagens de inicialização, etc. Se voce não usar o teclado matricial, tem 8 I/OS livres, 4 como saida e 4 como entrada, podendo ser acessados um a um. Ou em modo de variação, tipo qualquer entrada muda é enviado uma informação.

 

Se quiser eu posto uma foto dela montada num display.

 

Paulo

Link para o comentário
Compartilhar em outros sites

Opa, opa, opa, foi isso mesmo que lí? Sem ruído imprime coisa estranha no LCD?

Vou na do Paulo, display com problema ou software com pau, não acredito em problema de stack, uma vez que os PIC16 e 18F possuem um stack por hardware dedicado apenas ao salvamento dos endereços de retorno das funções, pode dar pau a menos que voce chame varias funções uma dentro da outra de forma consecutiva e muitas vezes.

Você pode postar o seu código pra gente dar uma olhada? Pode ser sincronismo do seu programa, ou mesmo vazamento de memória ao imprimir strings no LCD... (não duvido que possa ser do CCS).

Abs!

Link para o comentário
Compartilhar em outros sites

@aphawk e @Projetos_afg 

 

Bom pessoal, quanto a ser problema no display ou no codigo (ficou extenso mas se precisar eu posto aqui sim) eu acho que não, pois antes da única modificação que fiz que foi trocar a biblioteca antiga propria para lcd 20x4 do próprio CCS, para a biblioteca modificada pelo colega Paulo, isso não acontecia, na verdade acontecia as vezes quando acionava alguma solenoide...

 

E a maquina ficou ligada um tempão e sem acionar solenoides não imprimiu nada de errado no lcd....

 

E antes este pic estava oscilando em 20Mhz e eu abaixei o clock para 4Mhz e mudei a biclioteca, bom vou voltar  a biblioteca que estava antes e testar hoje e manter o clock em 4Mhz pois conforme eu li aqui um clock mais baixo pode ajudar.....

 

@Projetos_afg quanto a chamada de funções, o programa e praticamente só funções, uma vai chamando a outa, mas no "stand-by" ( que é onde esta acontecendo o lixo no LCD) ele não esta dentro de nenhuma função, está rodando no laço principal, chamando só a função da tela de stand-by. ( agora o fato de ficar chamando ela consecutivamente não sei se pode influenciar).

 

e quando chamo a primeira função (primeiro menu) tenho chaves para ficar preso dentro dela, e ao final da programação do primeiro menu apertasse um botão de confirmação, chama outra função(menu) faz aquela chave anterior falsa e a nova verdadeira para manter dentro da referida função. Espero ter conseguido explicar....

Link para o comentário
Compartilhar em outros sites

@aphawk

Agora vi que o Atmega48 está 0,85$ na china, parece bem mais interessante que o PIC16F1828...


@rodrigocirilo

Se não der para resolver de jeito nenhum, acho melhor procurar por displays seriais. 

 

Não existe nenhuma maneira de você levar um osciloscópio digital para dar uma olhada nos sinais? Por que senão nós ficamos tentando resolver o problema às cegas.

 

Tem como você postar o layout da placa? Às vezes pode ser o formato das trilhas o problema. Em uma PCB profissional tomamos muito cuidado com a indutância e capacitância das trilhas além dos efeitos de ponta.

 

Como a placa foi confeccionada? Feita em casa ou mandou para fazer em alguma fábrica especializada?

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!