Ir ao conteúdo
  • Cadastre-se

Problemas com a rotina de Lcd em C


Posts recomendados

Colegas Boa tarde!

 

Alguém pode me Ajudar ??? !!!

 

Estou Iniciando Nesse mundo de Programação de Microcontroladores !!! 

 

Estou Tentando desenvolver um Sistema de Controle de Potência (dimmer) utilizando um PIC 16F877A para Gerar um pulso de disparo no gate de um Triac e paralelamente a ISSO Mostrar em hum visor de LCD algumas Mensagens Como Por Exemplo Uma escala de potencia. Para ISSO Estou utilizando o conversor A / D do pic para Ligar hum POTENCIOMETRO em um canal AN0 e Controlar o angulo de disparo. Estou utilizando uma Interrupção externa em rb0 para avisar Ao pic QUANDO a senóide da rede passa por 0, e Dentro do Vetor de Interrupção Fiz Uma Rotina para Contar um tempo em relaçao Ao valor contido na Variável que DETEM OS Valores da Conversão A/D provenientes do ajuste do POTENCIOMETRO e em SEGUIDA Gerar hum pulso de disparo no gate do triac. Até ESSE Ponto Parece Que a Rotina ESTA Funcionando Bem !!! O Problema E que o Lcd NÃO Funciona corretamente, FICA Exibindo caracteres malucos, Tentei Colocar hum delay Depois da Rotina de Escrita mas ELE Funciona Por Um Pequeno tempo e Fica maluco de novo !!! Acho Que Tem haver com a Rotina da Interrupção externa que FICA acontecendo de 8,3ms em 8,3 ms e Põe em Conflito a Rotina do Lcd !!!  

O compilador que Estou usando E o mickroc, e um para Aplicação do lcd Estou usando uma biblioteca de lcd do MESMO.

 

Alguém pode me Ajudar ???

 

Segue a Rotina:

 

int i;
flutuar tmp = 0;
int pot_1;
int fase;
int disparo;
flutuar temperatura;
flutuar semi_ciclo;
flutuar andamento;
flutuador graus = 25,511;
flutuador ciclo = 0,12276;
flutuar Senóide = 123.401,69;
Char txt [7]; // Criando Uma Variável fazer tipo de char de Nome txt parágrafo alocar 7 caracteres
Char txt_2 [7];
 
sbit LCD_RS em RD0_bit;       //Atribui o pino RS LCD Ao fazer pino 0 fazer PORTD, informa se OS Dados enviados São INSTRUÇÕES OU caracteres, uma                                                    //biblioteca Faz automáticamente.
sbit LCD_EN em RD1_bit;        // atribui o pino EN fazer LCD Ao pino 1 do PORTD, habilita uma Escrita não LCD, uma biblioteca Faz automáticamente.
sbit LCD_D4 em RD2_bit;         // Atribui o pino D4 fazer LCD Ao pino 2 do PORTD, Tráfego de Dados.
sbit LCD_D5 em RD3_bit;         // Idem
sbit LCD_D6 em RD4_bit;         // idem
sbit LCD_D7 em RD5_bit;         // Idem
 
LCD_RS_Direction sbit em TRISD0_bit; // Definir o pino 0 fazer PORTD entrada Como UO saida, uma biblioteca Faz ISSO automáticamente conforme à                                                                         // necessidade.
LCD_EN_Direction sbit em TRISD1_bit; // idem
LCD_D4_Direction sbit em TRISD2_bit; // Idem
LCD_D5_Direction sbit em TRISD3_bit; // idem
LCD_D6_Direction sbit em TRISD4_bit; // idem
LCD_D7_Direction sbit em TRISD5_bit; // idem
// Conexões do módulo LCD End
 
void fluxo () {
TRISA = 0b00000001;
TRISB = 0b00000001;
TRISD = 0b00000000;
PORTB = 0b00000000;
PORTD = 0b00000000;
}
 
void config_rb0 () {
INTCON.GIE = ​​1;
OPTION_REG.INTEDG = 1; // Interrupçãoo TEM de ocorrer na borda de Descida Por Causa conseguirem cruzar a fronteira
INTCON.INTE = 1; // Interrupção externa HABILITADA
}
 
void interrupção () {
for (i = 0; i <tempo; i ++) {
delay_us (1);
}
PORTD = 0b10000000;
delay_us (1);
PORTD = 0b00000000;
INTCON.INTF = 0;
}
 
void main () {
 
Fluxo ();
 
ADC_Init ();
delay_ms (20); // tempo de adequação do capacitor do conversor
 
Lcd_Init (); // Inicializar LCD
 
Lcd_Cmd (_LCD_CLEAR); // Comando do LCD "LCD apaga"
Lcd_Cmd (_LCD_CURSOR_OFF); // Comando do LCD "cursor apaga fazer LCD"
 
config_rb0 ();
 
while (1) {
 
disparo = 1023 - ADC_read (0);
tempo = disparo / Senóide;
 
pot_1 = ADC_read (0); // Variável Que Contém OS Valores da entrada analógica AN0 convertidas cabelo o conversor A / D e Conta de 0 a 1023 de forma //                                         //Crescente.
fase = 1023 - ADC_read (0); // Variável Que Contém OS Valores da entrada analógica AN0 e Conta de 1023 um 0 de forma decrescente.
temperatura = pot_1 / graus; // Variável that dividir uma Resolução da entrada AN0 fazer conversor em 40 partes "escala de 0 a 60 graus" na forma                                                              //Crescente
semi_ciclo = fase / ciclo;        // Variável Que a Resolução da entrada AN0 fazer conversor EM 8333 contraditório
 
 
IntToStr (temperatura, txt); // Função do mikroC que Converte Números inteiros em caracteres 
Lcd_Out (1,1, txt); // ffunção do mikroC que escreve no lcd 
Lcd_Out (1, 8, "agua");
IntToStr (semi_ciclo, txt_2);
Lcd_Out (2,1, txt_2);
Lcd_Out (2, 8, "nós");
delay_ms (500);
 
}
}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...