Ich such nen "Interrupt-Konzentrator"...

Ich suche einen IC, der, wenn sich an einem von mindestens drei (besser vier) Eingangsports die Signalflanke wechselt, die Flanke eines Ausgangsports wechselt.

Kennt jemand einen solchen Chip?

Da würde ich aus dem Stehgreif auch kein entsprechendes Bauteil nennen können. (Gibts aber bestimmt).

Ansonsten nimm doch einfach einen entsprechend programmierten Atmeg168 ;)

Man könnte einen entsprechend programmierten Atmega168 oder noch kleiner nehmen. Z.B. Atmega8 oder Atmega16.

Jeder Eingansport bekommt einen Wert zugewiesen. E1 - H = 1 oder L = 0 E2 - H = 2 oder L = 0 E3 - H = 4 oder L = 0 E4 - H = 8 oder L = 0

Daraus berechnet man bei jeder Überprüfung eine Summe. Wenn die Summe sich ändert, also nicht mehr gleich der vorherigen Summe ist, schaltet man den Zustand des Ausgangsports um.

Und dann stellt sich noch die Frage wie zeitkritisch das ganze sein darf. @Joghurt, wofür brauchst du das denn ?

Hallo Yogurt

Du könntest eine I2C Port Expander verwenden. PCF8475 der INT Ausgang reagiert auf Flanken der Eingänge. MCP23008 kann die Interuptquellen programmiert werden.

Grüße Uwe

wofür brauchst du das denn ?

Für mein Ganganzeige-Tankuhr-Projekt hab ich sechs (davon drei kritische) Impulsquellen, auf deren Änderung ich reagieren muss. Im Prinzip würde mir ein einfacher dritter Interrupt-Eingang reichen, aber da die Größe eine Rolle spielt kann ich nicht einfach einen Mega nehmen... :(

Wies scheint kann der Atmega328 s.g. "Pin Change Interrupts" für die einzelnen Pinbänke auslösen (siehe hier bzw. hier), das sollte mein Problem lösen können... :)

Danke für Eure Hilfe! :)

Was hälst du von einem CMOS-AND gatter der ist wahrscheinlich schnell genug Packst alle Siganle auf die Eingänge geht einer auf Null ist der Ausgang auch Null. Mit dem And halt andersrum. Nur so ne Idee. Die ReaktionsZeit ist zwischen 50-200nS

Das Problem ist, dass meine Signale keine Spitzen sind sondern saubere Rechtecke, das gäbe mit ANDs Probleme... :(

Ich machs jetzt über die PCINT-Lösung, mein Testsketch, an dem ich gerade bastle, sieht schon recht gut aus... :)

Das Problem ist, dass meine Signale keine Spitzen sind sondern saubere Rechtecke, das gäbe mit ANDs Probleme...

Wie begründest Du das denn ??? Grübel ??

Beim Reedkontakt an der Felge würde ich Euch Recht geben, das ist ein ganz kurzer Peak, aber z.B. mein Durchflussmesser erzeugt saubere Rechtecke.

Wenn nun entweder AND- oder OR-Gatter verwendet werden, dann hast Du im schlimmsten Fall, also je nachdem was der Sensor gerade liefert (logisch HIGH bei OR oder logisch LOW bei AND), auf jeden Fall ein negatives Ergebnis aus den Gattern, egal was die anderen Sensoren gerade liefern.

Und damit würde er Impulse verlieren. :(

Na dann werfe ich mal einen neuen Gedanken in den Ring :

wie wäre ein 74HC148 als Lösung ??

Ich vermute das kommt dem "Konzentrator" doch recht nahe...

8 Eingänge die auf 3 Bit umgesetzt werden... damit kannst Du auch die Art des Interrupts auswerten. (sieh die Logiktabelle)

Auch eine Idee, danke. :slight_smile:

Mittlerweile bin ich aber schon recht weit mit der Lösung mit den Pin Change Interrupts gekommen, das funktioniert soweit richtig gut. Der einzige Unterschied zu den per “attachInterrupt()” angebundenen Interrupts ist, dass ich prüfen muss, welcher Pin ihn denn nun ausgelöst hat, aber das ist kein Problem. :slight_smile:

Aber danke nochmal für die Ideen!

Ich werfe nochmal den PCF8475 bzw MCP23008 in den Raum. Die sind meiner Meinung besser als ein Priority Encoder geeignet. Eine Änderung an einem der Eingänge ruft ein Signal am INT Ausgang hervor und durch Auslesen der Zustände der Eingänge erfährt man welcher Eingang es war.

Statt eines Arduino Mega kannst Du einen Seeeduino Mega nehmen, der ist gleich groß wie ein Arduino Uno.

Grüße Uwe

Ich verwende (wegen der Größe) einen "Arduino Pro Mini", und ich habe fünf "Signalquellen" (Drehzahlimpuls von der Zündanlage, Reed-Impuls vom Vorderrad, Impuls vom Benzindurchflusssensor, Leerlaufsignal und Button zwecks Einstellungen und Moduswahl) und die ersteren drei davon können teilweise recht schnell teilweise sehr kurze Impulse liefern, und davon will ich keinen verpassen. Auch dann nicht, wenn ich gerade am Display-auffrischen bin.

Ich hab mich jetzt etwas schlau gemacht und herausgefunden, dass der verbaute Atmega328 außer den auf Pins 2 und 3 per attachInterrupt anbindbaren Interrupts zusätzlich noch einen "Pin Change Interrupt" pro nativer Portbank hat, also einen Interrupt für die Pins D0-D7, einen für D8-D13 und einen für D14-D19. Zusätzlich kann man dann die einzelnen Pins noch ausmaskieren, d.h. nur für speziell ausgewählte Pins wird ein Interrupt ausgelöst.

Ich hab also den Drehzahlimpuls von der Zündanlage auf D2 (IRQ0) gelegt (da hier die höchste Impulsfolge zu erwarten ist), den Reed-Impuls vom Vorderrad auf D3 (INT1, da hier die kürzesten Impulse zu erwarten sind) und die restlichen drei auf D4, D5 und D6, den Interrupt-Vektor von PCIE#2 entsprechend befüllt und PCMSK2 passend zu den drei Pins maskiert.

Zusätzlich habe ich in den drei Interruptroutinen eine Flankenerkennung und einen kurzen Debounce eingebaut, und in den Routinen passiert nicht viel mehr als dass er die aktuelle millis()-Zeit in eine von drei Queues (nichts anderes als jeweils ein Array, das rollierend befüllt und gelesen wird) schreibt. Letzteres einfach deswegen, um möglichst wenig Zeit im Interrupt zu benötigen. Diese Queues kann ich dann in aller Ruhe auswerten, wenn mein Programm an der entsprechenden Stelle durchkommt.

Ich hab mir einen zweiten Arduino als "Teststand-Signalquelle" angeschlossen und alle Pins mit mehr als der zu erwartenden Frequenz gefüttert, und nachdem ich erst einmal ermittelt hatte, wie groß die Queues sein mussten, hat er seither keinen einzigen Impuls mehr verloren.

:)

Den aktuellen Stand samt Sourcecode sieht man hier.

Hallo Joghurt

Wie genau möchtest Du die Motordrehzahl haben?

Wenn Du einen 10 er Teiler hineinschaltest hast Du (6000 U/min, 4 Takter) statt 50 Hz nur 5Hz und das erleichtert Dir die Zeitkritische Programmierung ungemein. Die Daten mußt Du ja nicht so oft updaten und Du hast ein schönes Signal mit 50% Tastverhältnis.

Statt des Reedkontakts würde ich ein Hallsensor nehmen, der hat keine mechanischen Teile und eine höher maximale Schaltfrequenz. Wenn Du den mit einem Zähler durch 2 teilst hast Du ein wunderschönes Rechtecksignal mit 50% Taktverhältnis. Impuls vom Vorderrad: willst Du etwas auf die Felge montieren oder am Getriebeblock vor den Halbachsen? Jetzt weiß ich nicht welche Felgen und Räder Du hast aber sage wir mal als Radumfang was zwischen 1500 und 2000mm dann hast Du bei 130km/h max ca 2,5 Impulse / sec (wenn ich nicht falsch geechnet habe).

Den Button zur Einstellung würde ich nicht als Interupt abfragen sondern auf Abfrage; du hämmerst ja nicht wie ein Verückter mit 100 Hz drauf.

Was ist das Leerlaufsignal?

Grüße Uwe

Wie genau möchtest Du die Motordrehzahl haben?

So genau wie möglich, ich will meinen aktuellen Gang damit ausrechnen. :)

Wenn Du einen 10 er Teiler hineinschaltest hast Du (6000 U/min, 4 Takter) statt 50 Hz nur 5Hz und das erleichtert Dir die Zeitkritische Programmierung ungemein. Die Daten mußt Du ja nicht so oft updaten und Du hast ein schönes Signal mit 50% Tastverhältnis.

Stimmt schon, aber das wären wieder zusätzliche Bauteile, die ich unterbringen muss... :( Und wie gesagt sieht es im moment ja recht gut aus, was den Impulsverlust angeht. :)

Statt des Reedkontakts würde ich ein Hallsensor nehmen, der hat keine mechanischen Teile und eine höher maximale Schaltfrequenz.

Ich hab ehrlich gesagt keine Ahnung, was es jetzt genau ist, ich wollte den Fahrradtacho recyclen, den mein Vorbesitzer angebracht hat, der macht erwiesenermaßen bis 300 km/h, das reicht mir. ;)

Jetzt weiß ich nicht welche Felgen und Räder Du hast aber sage wir mal als Radumfang was zwischen 1500 und 2000mm dann hast Du bei 130km/h max ca 2,5 Impulse / sec (wenn ich nicht falsch geechnet habe).

Ich könnte mich irren, aber ich komme auch etwa 23 Radumdrehungen pro Sekunde bei 130km/h...?

Den Button zur Einstellung würde ich nicht als Interupt abfragen sondern auf Abfrage; du hämmerst ja nicht wie ein Verückter mit 100 Hz drauf.

Da hast Du Recht. :)

Was ist das Leerlaufsignal?

Beim Motorrad gibts eine kleine grüne Leuchte auf dem Armaturenbrett welche leuchtet, wenn man im Leerlauf ist (da ein Motorrad ein sequentielles Getriebe hat und der Leerlauf sich zwischen dem 1. und 2. Gang befindet ist der nicht immer ganz einfach zu Finden).