Boa noite, pessoal!

Estou tendo um problema em relação a chamar a função interrupção com o lcd. O caso é o seguinte as vezes quando eu chamo  a função interrupção o lcd fica com uns caracteres estranho não aparece o que eu tinha feito para ser visualizado, mas tem vezes que da certo. Tem algum macete para isso não acontecer já fiz de tudo.

Exibições: 610

Responder esta

Respostas a este tópico

Bom dia,

Acho que se você publicar seu programa no www.pastebin.com/ e colar o link aqui, ou seguir as recomendações do Rui Viana para enviar aqui mesmo  será mais fácil lhe ajudar, senão vai receber apenas palpites.

Abs.

segue o programa.

Desculpa - me não sei posta por esse programa vou copiar e colar aqui, se tiver um tutorial para fazer eu agradeço.


onst int botao2 = 3;
const int led = 5;
int contarA = 0;
int contarB = 0;
int contarC = 0;
int contarY = 0;
int contador = 0;
int buttonPushCounter = 0;
int estado = 0;
int buttonState = 0;
int ultimoestado = 0;
int lastButtonState = 0;
int bobina1 = 0;
int h = 0;
int y = 0;
int p = 0;
int r = 0;
int k = 0;
int i = 0;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void volta() {
buttonState = digitalRead(botao);
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonPushCounter++;
if (buttonPushCounter == 9 ) {
buttonPushCounter = 0;
}
}
else {
}
}
lastButtonState = buttonState;
if (buttonPushCounter % 4 == 0) {
}
}

void teste() {
estado = digitalRead(botao2);
if (estado != ultimoestado) {
if (estado == HIGH) {
contador++;
}
else {
}
}
ultimoestado = estado;
if (contador % 4 == 0) {
}
}
void interrupcao() {
lcd.clear();
while (contarY > contador) {
teste();
lcd.setCursor(0, 1);
lcd.print("Contador");
lcd.setCursor(8, 1);
lcd.print(contador);
}
lcd.clear();
p++;
}
void setup() {
// put your setup code here, to run once:
pinMode(botao, INPUT);
pinMode(botao2, INPUT);
pinMode(led, OUTPUT);
attachInterrupt(0, interrupcao, RISING);
lcd.begin(16, 2);
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
buttonPushCounter = 0;
for (int x = 0; x < 1500; x++) {
volta();
bobina1 = buttonPushCounter;
lcd.setCursor(0, 0);
lcd.print("Bobina");
lcd.setCursor(7, 0);
lcd.print(bobina1);
}
lcd.clear();
buttonPushCounter = 0;
for (int x = 0; x < 1500; x++) {
volta();
contarA = buttonPushCounter;
lcd.setCursor(0, 0);
lcd.print("Volta");
lcd.setCursor(6, 0);
lcd.print(contarA);
}
buttonPushCounter = 0;
for (int x = 0; x < 1500; x++) {
volta();
contarB = buttonPushCounter;
lcd.setCursor(0, 0);
lcd.print("Volta");
lcd.setCursor(6, 0);
lcd.print(contarA);
lcd.setCursor(7, 0);
lcd.print(contarB);
}
buttonPushCounter = 0;
for (int x = 0; x < 1500; x++) {
volta();
contarC = buttonPushCounter;
lcd.setCursor(0, 0);
lcd.print("Volta");
lcd.setCursor(6, 0);
lcd.print(contarA);
lcd.setCursor(7, 0);
lcd.print(contarB);
lcd.setCursor(8, 0);
lcd.print(contarC);
}
buttonPushCounter = 0;
y = contarA * 100 + contarB * 10 + contarC;
i = 0;
contarY = y;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bobina");
lcd.setCursor(8, 0);
lcd.print(bobina1);
lcd.setCursor(0, 1);
lcd.print("Total");
lcd.setCursor(6, 1);
lcd.print(contarY);
delay(1000);
lcd.clear();
while (bobina1 > i) { // é essa parte que é chamado a função interrupção através do botão, onde as vezes acontece o problema
digitalWrite(led, HIGH); // com os caráteres.
if ( 2 == p) {
i++;
p = 0;
}
lcd.setCursor(0, 0);
lcd.print("Precionar Start");
contador = 0;
}
contador = 0;
bobina1 = 0;
digitalWrite(led, LOW);
}

http://pastebin.com/9PYhn6Mt

Essa é a forma, veja o video que vou postar, estou gravando,  do mesmo jeito que colou aqui, cole lá. De qualquer forma esta feito para voce saber como solicitado.

Video: https://www.youtube.com/watch?v=IhGSDhIbIFA&feature=youtu.be

Abs.

valeu , vou fazer agora

 segue o programa, para analise do pessoal.

http://pastebin.com/7Jeme61K

Oi JJC, boa tarde.

O seu interrupt ( attachInterrupt(0, interrupcao, RISING); é o de numero 0, ou seja 

interrupção do pino Digital 2 sendo levado para o nível HIGH.

O que você usa para disparar este interrupt? Um botão, um pulso?

Rui

Boa tarde Rui Viana, tudo bem !

Sim minha interrupcao é numero 0 do pino 2 é nível HIGH mesmo. No caso de teste estou usando um botão mesmo, mais vai ser um sensor que vai gerar pulsos.

no meu caso quando pressiono o start ele entra na interrupcao e fica mais ou mesmo isso, não da para ver nada, se voce quiser posso filmar e colocar aqui para você ver também. Porque acontece isso ?

Olá Juliano,

a intenção foi somente de ajudar, acho que não tem sentido enviar um video seu agora, como sai  e somente pude responder agora, imagino que tenha resolvido, e tinha certeza porque sabia que estava em boas mãos (Mestre Rui Viana) rsrsr que já te deu a solução, como sempre faz.

Abs.

OiJJC,

eu compilei o seu code, e realmente ele "bagunça" o LCD.

Pela minha analise, aparentemente está ocorrendo o seguinte:

Ao produzir o interrupt, o code ele entra em uma rotina que também usa o LCD.

Mas se ele estava em uma parte do code que manuseava o LCD, e é interrompido,

indo para outra parte que irá usar este mesmo LCD, o protocolo de comunicação do LCD fica "deteriorado".

O Certo seria bloquear interrupt, toda vez que você for usar algum comando para o LCD.

Use     attachInterrupt(0, interrupcao, RISING); e   detachInterrupt(0);

no inicio e no fim de cada rotina que usa LCD.

Rui

Muito obrigado Rui Viana e Carlos Kwiek pela ajuda, deu certo agora o programa.

É verdade o Rui é fera rssssss.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço