Arduino Mega interrupt

Gestart door bumper, 07 februari 2025, 15:05:18 PM

bumper

Hallo,

Een tijdje stil gelegen, en nu terug aan de slag.
Dus problemen. Momenteel gebruik ik 4 interrupts via de pinnen 2/3/18/19.
Werkt voortreffelijk. Ik wil dit uitbreiden tot zes, via pinnen 20 en 21.
Interrupts worden gestuurd door hall sensoren in de baan en een magneet onder de locs.
In het begin werkte het niet. Op de arduino website gezocht en daar schreef men dat pinnen 20 en 21
aangesloten moeten worden met een externe Pull_Up weerstand van 10K ohm.
Aansluiting gecorrigeerd en getest met een losse magneet. Werkt prima.
Maar als ik mijn loc laat rijden dan worden beide interrupt routines geactiveerd, zonder dat de loc ook maar over één sensor is gereden. Mij een raadsel hoe dit komt, en dus systeem werkt niet.
Hall sensoren zijn van het type TLE4905.
Iemand enig idee of raadgevingen ?

Dank en groeten.
Ludo.
 

perk

zo snel een paar gedachten uit mijn mouw geschud.

a) pins 20-21 zouden toch ook pull-ups moeten hebben?

b) misschien als de loc gaat rijden, dat je een magnetisch veld door de rails gaat creeren, dat de hal sensor laat afgaan

c) zonder de code te zien, blijk het gokken

d) je gebruikt toch een MEGA, geen UNO he ?

e) ik gebruik 2 HAL sensoren zonder interrupts, maar door gewoon de ingang te lezen in analoge in.  De arduino is snel genoeg als je de code goed structureerd.

bumper

Patrick,

a)Pin 20 en 21 worden ook gebruikt voor I2C communicatie. Maar de twee tezamen gaat niet. Misschien daarom dat een interne PULL_UP niet werkt.
b) Zou een uitleg kunnen zijn, maar ik zie niet in hoe dat kan.
c) code is simpel :
     attachInterrupt (digitalPinToInterrupt(S5interrupt),sens1,RISING);
     attachInterrupt (digitalPinToInterrupt(S6interrupt),sens2,RISING);
     .
     .
     .
     void sens1 (){
     y = y+1;
     digitalWrite(setQ1,HIGH);
     digitalWrite(hallsens1,HIGH);
     }
     void sens2 (){
     z = z+1;
     digitalWrite(setQ2,HIGH);
     digitalWrite(hallsens6,HIGH);
     }
     const int hallsens1 = 34;
     const int hallsens6 = 33;
Pin 33 en 34 sturen een led aan, dit om te controleren of de interrupt binnen gekomen is.
d) Ja het is een Mega.
e) Dat weet ik maar ik gebruik nog enkele subroutines. En om te voorkomen dat ik een sensor mis omdat de subroutine niet afgewerkt is, gebruik ik een interrupt routine.
Maar ik vraag mij af waarom u "analoog in" gebruikt, ik gebruik hiervoor "digital in". Misschien is hierin de oorzaak te vinden.

Ludo.
 

perk

Ik heb een analoge input omdat de HAL sensor die ik gebruik gewoon een variabele spanning genereerd, geen echt digitaal signaal.   Ik lees dus het voltage en vergelijk dat met wat ik vind dat een omschakeling vereist (afhankelijk van de plaatsing van de HAL sensor en afstand tot magneet).  Zolang ik geen delay's ergens gebruikt, is het snel genoeg en geen interrupts nodig.

In jouw geval is dat niet zo relevant want jouw HAL sensor is het digitale type op/af.

Weeral wat gokwerk

1) https://www.mouser.com/datasheet/2/196/Data_Sheet_TLE49x5L_Family_V1_5-57396.pdf?srsltid=AfmBOooxpIMi4wfJ1yaxrframfDUzEXc0HAg47RqmwxKNfDynGfGoJnh

figuur 4, je HAL sensor gaat geleiden op de uitgang als er een magnetisch veld is. S5interrupt gaan van hoog naar laag bij het naderen van de magneet, natuurlijk daarna terug hoog.
Dus eigenlijk zou ik 'FALLING' gebruiken bij het definiëren van de interrupt.  Of dit impact op het probleem heeft kan ik niet zeker zeggen, want anders zou je het met de hand testen ook voorhebben.   Maar wie weet triggert het de interrupt al bij het opstarten.

2) je hebt toch ergens voor het stukje code dit staan?

  pinMode(S5interrupt, INPUT);
  pinMode(S6interrupt, INPUT);

alhoewel ik toch INPUT_PULLUP zou gebruiken, kan toch geen kwaad?

zie ook https://forum.arduino.cc/t/arduino-mega-interrupt-2-3-problem-not-anymore/26231 maar da's heel oud

3) ik heb een hoop treads op het internet gelezen over die pinnen 20-21 met veel problemen en meestal geen antwoord.  Ikzelf gebruik ze nooit, en heb liever een simpele digitalread ofzo, dan ben je ook niet zo gebonden aan bepaalde beperkte pinnen. 

4) niets van al dit verklaard dat je zegt dat het werkt als de loc niet rijd en je gewoon met de hand een magneet beweegt. Tenzij er in de test toch iets anders was.   Met de hand testen, dat was toch met de HAL sensor al in de baan gebouwd?






bumper

Patrick,

1) deze specificatie ken ik.
FALLING had ik ook in gedachte, maar die andere 4 werken met RISING, dus ik opteerde in eerste instantie om alles hetzelfde te houden. Nu ik heb dat getest, als ik de magneet boven de sensor laat , dan gebeurt er niets. Zolang die erover blijft brandt de led niet. Het is pas als ik de magneet weg haal dat de interrupt werkt en de led gaat branden. Ik vond dat wel OK, want dan ben je zeker dat de loc erover gereden is.
Triggering bij het opstarten denk ik niet, want dan moet de led direct beginnen branden denk ik.
2) ja, dat stukje code staat inderdaad ook in de setup. Sorry voor de onvolledigheid.
3) niets relevant gevonden.
4) de sensors zijn inderdaad ingebouwd. Het is zo dat als ik opgestart ben, alle controle leds uit zijn. Als ik niets doe, zelfs een uur gewacht, gebeurt er niets. Als ik een trein uit mijn schaduwstation laat vertrekken en die is ongeveer halverwege het traject tot de sensor S5 dan floepen de leds van zowel S5(pin hallsensor1) en S6(pin hallsensor6) aan. En dat is wel vreemd, en niet bruikbaar.
Nu is het wel zo dat twee condensatoren van 4,7 nF nog niet geplaatst zijn, vanwege aanpassingen aan de print noodzakelijk. Ik hoopte mijn programma zo eerst uit te testen. Aanpassingen vereisen waarschijnlijk ook aanpassingen aan de componenten van enkele prints.
Maar ik ga toch al eens bekijken of ik mijn programma kan aanpassen zonder al te veel te moeten veranderen.
 

patrick smout

Ludo,

Maak de pullup eens veel kleiner, ongeveer 470 Ohm. 10K is best wel een hoge waarde. Hoe lager de ingangsweerstand hoe meer energie je nodig hebt om de ingang te verstoren. De sensor kan 100mA schakelen dus met 470 Ohm heb je nog een ruime marge. Verder zou ik ook over de voeding van de sensor tussen Vs en GND een kleine condensator zetten van bv 470nF - 10uF en daarmee in serie een weerstand van 10 Ohm. De condensator rechtstreeks aan Vs van de sensor , vanaf Vs van de sensor de weerstand richting de externe voeding. Doel is om de voeding voor de sensor wat op te poetsen voor vervuiling die instraalt op je bedrading.
Met vriendelijke groeten,

Patrick Smout

bumper

Patrick S,

Dank voor de info. Ik ga alles uittesten, maar item voor item, anders weet ik niet welke interventie geholpen heeft. De aansluiting van uw voorstel versta ik echter niet goed. Nu is de signaalkabel van de sensor juist voor de inputpin van de arduino Mega aangesloten d.m.v. een weerstand van 10K aan de 5V voeding en dan verbonden met de ingang van de Mega. Deze vervang ik dus door een van 470 Ohm. Dan van de voeding van de sensor een condensator van 470 nF en een weerstand van 10 Ohm in serie naar de GND met de condensator aan de 5V voeding en de weerstand aan de GND.
Dat snap ik, maar wat u daarna schrijft snap ik niet, dat vereist wat meer uitleg.

Ludo.
 

patrick smout

Dag Ludo,

Heb nu even de mogelijkheid niet om een schema te tekenen voor het filter maar zal het morgen posten. De weerstand van 10k zou ik idd vervangen door een weerstand van 470 Ohm.

Met vriendelijke groeten,

Patrick Smout

patrick smout

Dag Ludo,

hier een schema dat het wat duidelijker zou moeten maken. Bedoeling is dat C1/R1 zo dicht mogelijk bij de microcontroller staan. R2/C2 staan zo dicht mogelijk bij de hall sensor.

Met vriendelijke groeten,

Patrick Smout

patrick smout

Dag Ludo,

even nog een andere kijk op het gebruik van interrupt ingangen.

Ik begrijp zeker je keuze en motivering maar er zit ook een vervelend kantje aan het gebruik van interrupt ingangen. Het risico is namelijk vrij groot dat je de microcontroller op zijn knieën krijgt. Als er door externe invloeden (zoals storingen) teveel ruis komt op interrupt ingangen zullen er zoveel interrupts komen dat de microcontroller niet langer stabiel werkt. Als de interrupt bron een zuiver signaal is dan doet dit probleem zich niet voor maar signalen die van de buitenwereld komen zijn meestal niet zuiver. Je kan dit oplossen door een spertijd in te lassen nadat een ingang een interrupt gegeven heeft. De spertijd kan je realiseren door in de interrupt routine een timer te starten en te wachten op de interrupt die aangeeft dat de tijd voorbij is. Op dat ogenblik kan de je de interruptingang als het ware terug wapenen. Nadeel sis dat je wel wat timers moet reserveren om al de ingangen tegelijk te kunnen servicen.

Een andere aanpak is om gebruik te maken van een timerinterrupt en in die interruptroutine de sensoringangen af te vragen. Voordeel van deze aanpak is dat externe invloeden er nooit voor kunnen zorgen dat de microcontroller door zijn knieën gaat. De interruptfrequentie is vast ingesteld. Een modeltrein die 120km/u rijdt legt ongeveer 38cm af per sec of ~25ms/cm. Stel dat de detectiezone van de sensor 0,5cm is dan heb je bij een timerinterrupt om de 1ms ongeveer 12x de kans om een trein te detecteren. Sterker nog, je kan ook een teller maken die vanaf de 1e detectie tot 8 moet tellen alvorens hij de trein als aanwezig ziet. Op die manier kan je de ingangen vrij robuust maken. Uiteraard kan je de 6 sensoren allemaal afhandelen in dezelfde timerinterrupt routine.
Het enige nadeel van deze methode tov echte interrupt ingangen is dat er een vertraging kan zijn tot 1ms alvorens een ingang gezien wordt. In deze toepassing niet echt een probleem, in andere toepassingen mogelijk wel. Daarnaast is het ook zo dat de microcontroller gemiddeld meer belast wordt maar de belasting is wel meer deterministisch.
Met vriendelijke groeten,

Patrick Smout

bumper

Patrick S,

Bedankt voor het schema, is nu duidelijk voor mij.
Bedankt ook voor de uitleg, die ga ik eens goed bestuderen.
Maar aansluitend daarop, gisteren avond nog vlug iets willen testen. Bij het uitrijden van mijn schaduwstation was een wissel blijven hangen in de verkeerde stand. Resultaat kortsluiting als de loc erover kwam. Tegelijk floepten alle zes de controle leds van de interrupt ingangen aan. Dus zonder dat er ook maar één sensor bediend was.
Valt dit onder het fenomeen dat je beschreven hebt ? Ik snap eigenlijk niet goed hoe dat kan.

Bedankt voor de hulp en het geduld.
Groeten.
Ludo
 

perk

Ik heb hier ergens een ouder marklin model, als ik dat op de vorige baan zetten sloegen mijn servo's aan de arduino totaal in de war.
De storingen die dit (2dehands) model gaven moeten toch wel de moeite geweest zijn, en dat zette zich waarschijnlijk door interferentie door naar de servo draden.

Momenteel met mijn nieuw projectje stuur ik de DC loc aan met een merk H-brug driver en arduino, netjes zoals het moet.   De minste kortsluiting op de sporen bij het plaatsen van de loc resulteerd in een harde reboot van de arduino.

'k verbaas me niet dat een arduino eens doorslaat als je storingen of kortsluiting ergens op de baan hebt.


patrick smout

Citaat van: bumper op Gisteren om 12:02:30 PMValt dit onder het fenomeen dat je beschreven hebt ? Ik snap eigenlijk niet goed hoe dat kan.
Dag Ludo,

Dit zijn inderdaad de verschijnselen die je kan verwachten. Ogenschijnlijk is er geen directe elektrische verbinding tussen de rails en de arduino echter in een systeem zijn er altijd zeer kleine parasitaire condensators. Die condensators zorgen voor ongewenste koppelingen tussen signaalleidingen. Als de verstoring groot genoeg is kunnen zij ervoor zorgen dat bv het logisch niveau van een digitale ingang kortstondig omklapt. Een kortsluiting geeft gedurende een zeer korte tijd een heel grote stroom en komt zeker in aanmerking als bron voor dergelijke verstoringen. Bij het professioneel ontwerpen van schakelingen wordt de robuustheid tegen dergelijke verstoringen getest door de schakeling te onderwerpen aan zogenaamde Electrical Fast Transients (EFT). Ingangen laagohmig maken en voorzien van de nodige filtering (in hardware en/of software) zijn gangbare oplossingen.
Met vriendelijke groeten,

Patrick Smout