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.
Tags:
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.
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);
}
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.
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por