attachInterrupt werkt niet altijd?

algemene C code
Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

attachInterrupt werkt niet altijd?

Berichtdoor ercmrj » 14 Mrt 2014, 21:18

Ik probeer attachInterrupt te begrijpen maar de laatste tijd lukken zelfs de eenvoudigste dingen niet meer.

Als ik onderstaande code in een arduino-uno laad doet hij elke keer weer iets anders. De ene keer krijg ik alleen maar nullen op de serieële monitor, de andere keer alleen maar eenen. Heel af en toe geeft hij om de beurt nul en een zoals het moet volgens mij. Ik heb zelfs een keer gehad dat hij helemaal niets aangaf op de monitor en als ik de data naar een andere arduino stuur reageert hij ook weer anders terwijl ik niets aan het programma wijzig.

Iemand enig idee hoe dit komt?


Code: Alles selecteren
int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
  Serial.begin(9600);
}

void loop()
{
  digitalWrite(pin, state);
  Serial.println(state);
}

void blink()
{
  state = !state;
  int xx = millis() + 500;
  while(millis() < xx) {};
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: attachInterrupt werkt niet altijd?

Berichtdoor nicoverduin » 14 Mrt 2014, 21:27

a) attach interrupt betekent dat je een interrupt signaal naar pin2 wil sturen. Hoe is dat geregeld? Zo niet klopt het wel. Die ingang is nu kennelijk zwevend en kan een willekeurige "1"of "0" genereren. Vandaar de je ofwel een pull down of pull-up weerstand moet gebruiken OF een signaalbron hebben waarvan zeker is of het een "1" of "0" is.
b) je bouwt een delay in een interrupt routine. Dat is de goden verzoeken en een beetje onzinnig. Een interrupt gebruik je om in te breken in het lopende programma. Als jij getimed een interrupt wil gebruiken voor het knipperen, dan moet je een timer interrupt gebruiken (google "timer interrupt arduino").
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: attachInterrupt werkt niet altijd?

Berichtdoor ercmrj » 14 Mrt 2014, 21:45

Ik had dat inderdaad ergens gelezen dat je geen timers en delay mag gebruiken met attachInterupt, maar zie hier op het forum voorbeelden genoeg met timers in attachInterupt dus toen wist ik het ook niet meer.

Ik wil hem gebruiken voor het tellen van omwentelingen van een draaiend wiel en had hier ook ergens op het forum gezien dat ze hem daar ook voor gebruikten. Het is ook op te lossen zonder attachInterupt maar dan vind ik het programma zo ingewikkeld en onoverzichtelijk worden.

Wat ik van attachInterupt begreep is dat je het er op de achtergrond een routine constant doorloopt en waarvan je op elk moment een variabele kunt uitlezen. Mijn bedoeling is natuurlijke elke keer als het magneetje, wat op het wiel zit, voorbij een sensor komt hij dat signaal oppikt en dat het programma niet op dat moment toevallig met iets anders bezig is.
Is attachInterupt daar wel geschikt voor?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: attachInterrupt werkt niet altijd?

Berichtdoor nicoverduin » 14 Mrt 2014, 23:15

Attach interrupt is daat zeker geschikt voor. Maar voor dat je overgaat op de volgende frustratie:)
a) weet hoe de sensor werkt. M.a.w. geeft hij een puls af? En is die digitaal of analoog. Als het analoog is zou ik er zeker een digitale van maken. En bij Digitaal ervan verzekeren dat het een strakke puls is. Eventueel met een schmitt trigger
b) weet of de interrupt levels voldoende zijn (dus "0" < 0.9v en "1" > 3.8V) anders krijg je onverwachte problemen
c) Dat andere voorbeeld werkt bij de laatste post volgens mij voor geen meter omdat de eerste vraag niet beantwoord is.
Dus weet wat je als input kan verwachten. Anders zie ik die bui al hangen... "Ik heb er nu meer dan xxx uur in zitten en geen meter opgeschoten....".
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: attachInterrupt werkt niet altijd?

Berichtdoor ercmrj » 15 Mrt 2014, 11:45

Ik had van pjh al een stukje gevonden over debouncing waarbij ze ook een schmitt trigger gebruiken om dat te onderdrukken. Zal ik vast nog nodig gaan hebben.

Maar is het misschien een goed idee om met een LM555 timer chip een "astabiele oscilator" te bouwen, en de magneetsensor te vervangen door de LM555. Dan weet ik zeker dat ik een goed signaal binnenkrijg en kan ik eerst mijn schakeling testen. Want ik weet zo 123 nog niet hoe ik zonder scoop er achter kan komen wat voor signaal mijn magneetsensor geeft.

Het lijkt erop dat ik het begin te snappen. onderstaand werkt in ieder geval. Klopt het dat het eerste getal achter AttachInterupt de pin is, dat maak ik niet op uit de uitleg op de website daar staat dat je die alleen op kan geven bij de "Arduino Due". In ieder geval werkt het alleen op pin 2 en 3.

Code: Alles selecteren
int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  pinMode(2, INPUT);
  attachInterrupt(1, blink, CHANGE);
  Serial.begin(9600);
}

void loop()
{
  digitalWrite(pin, state);
  Serial.println(state);
}

void blink()
{
  state = digitalRead(3);
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: attachInterrupt werkt niet altijd?

Berichtdoor nicoverduin » 15 Mrt 2014, 15:23

Op de arduino site staat welke hardware pinnen verbonden zijn met interrupts van enkele borden. Bij de UNO is interrupt 0 (dus niet pinnummer) verbonden aan digital pin 2 en interrupt 1 aan digital pin 3.
Als je meer vrijheid wilt, dan kan je ook gebruik maken van de zogenaamde pinChangeInterrupt. Met deze library (zie: http://code.google.com/p/arduino-pincha ... p&can=2&q=) kun je van elke pin een interrupt maken.
Het wordt wel hee lastig om zonder scope te meten wat hoe de pulse eruit ziet. Verder zijn er wel wat projectjes gedaan in het verleden met arduino en snelheid. o.a. met eigen spoeltje bijvoorbeeld.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 26 gasten