Problemas com attachInterrupt e código simples congelando arduino nano.

Estou quebrando a cabeça com esse  attachInterrupt, o código é simples estou começado e ainda não sei as maneiras corretas de trabalhar sem usar o delay, estou trabalhando em um código de contador, conta até 10 interrupções move o servo ate 120 e volta a 0 voltando o valor a 0 também, alguém sabe o motivo dele travar o arduino? Agradeço dês de já!  


#include <LiquidCrystal.h>
#include <Servo.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

float unidade = 0;
const int rele1 = 4;
Servo servo1;

int processo = 0;
int posReal = 0;


void setup()
{
servo1.attach(13);
pinMode(rele1, OUTPUT);
digitalWrite(rele1, LOW);
attachInterrupt(0, ContaUnidades, FALLING);
Serial.begin(9600);

}


void ContaUnidades()
{
unidade += 1;

}


void loop() {


if (unidade >= 10) {
unidade = 0;
processo = 1;
}
for (; posReal <= 120, processo == 1; posReal += 5) {

if (posReal == 120) {
posReal == 0;
processo == 0;
}

}


servo1.write(posReal);
lcd.setCursor(0, 0);
lcd.print (unidade);
lcd.setCursor(10, 1);
lcd.print (processo);
Serial.println (unidade);
}

Exibições: 906

Responder esta

Respostas a este tópico

Observações:

1) Você está "atachando" uma interrupção no pino 0, mas o pino 0 no Nano não suporta interrupções, apenas os pinos 2 e 3 

2) Para atachar uma interrupção, use a sintaxe abaixo:

attachInterrupt(digitalPinToInterrupt(pin), função, modo);

onde pin é o pino que deseja usar

3) Só tem sentido usar interrupções em um determinado pino, se tiver algum componente conectado nesse pino que mude seu estado (FALLING), senão nunca vai ser executada nenhuma interrupção

4) A lib Servo usa interrupções também. Confira no manual se não vai haver conflitos  

5) Se você é iniciante, deixe para usar interrupções mais para frente quando estiver mais experiente

Espero ter ajudado 

 Oi Jose! muito obrigado pelas pontos levantados! Vendo agora a minha explicação ficou rasa sobre o que esta acontecendo.... O código funciona, a interrupção também, ele conta até chegar no 10 e congela, estou lendo um sensor IR, por isso do FALLING...


 Sobre a pingem do attachInterrupt vi em um exemplo do site do arduino mesmo que o attachInterrupt 0 vai pegar o primeiro pino de attach, (2)  e assim na sequencia, attachInterrupt 1 vai ser o (3) no caso do arduino nano, no MEGA ele iria até attachInterrupt 6 linkando o pino (21) automaticamente, ele esta lendo um sensor IR, então nessa parte esta certo, ele trava depois que chega a 10. 

 Eu não tenho saída a não ser usar interrupção, como estou desenvolvendo um contador usar funções delay não são uma opção, venho a vários dias tentando fazer funcionar na base do delay, o programa em si esta funcionando bem, mas a parte que conta não fica rápida o suficiente com os delays no meio do código... por isso comecei do 0 novamente, tentando agora fazer sem delay, mas ta difícil, vc souber de algum material para me indicar sobre o assunto estou procurando! 
 
 Sera que é a lib do servo? eu tive que mudar o meu LCD pq esta usando um ja soldado o IC2, e quando fui usar o attach bugou o LCD, procurando aqui mesmo no lab de garagem descobri que tem incompatibilidade com a biblioteca, será que é o caso do servo tbm? 

 Obrigado pela atenção Jose! 




Oi GR. boa noite.

Ale,m das explicações do nosso amigo JAC,

tem um ponto e virgula (;)  nesta linha que está em lugar errado

for (; posReal <= 120, processo == 1; posReal += 5) {

este ; logo após o abre parentesis.  e Depois do 120 tem que ter um ;

Rui

Complementando as observações do amigo Rui:

A sintaxe desse for está correta, mas a lógica não.

Quando você escreve:

for (; posReal <= 120, processo == 1; posReal += 5) {

Significa: faça até posReal <= 120 e processo == 1;

Esse loop só será executado quando contador = 10, mas aí ele entrará num loop infinito, pois processo será zero e nuca atingirá 1 que é a condição de saida.

Esse if é que zera o processo e trava o programa:

if (posReal == 120) {
posReal == 0;
processo == 0;
}

Precisa rever a lógica.

Não é == que se usa para atribuir e sim =

posReal = 0;

Você não citou que existe um componente no pino 2, causando o mau entendido.

 Valeu Jose! realmente os == em vez dos = estavam confundindo o programa! agora ele parou de travar, ainda não faz o, movimento que desejo, apenas esta pulando de  mas ja foi um grande passo, hahaha, obrigado! 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço