Ich habe grade ein Phänomen das ich mir nicht erklären kann.
Ich habe einen PFC8574 an dem Taster als auch LEDs hängen.
Erstmal hab ich alles programmiert ohne den interrupt einzubinden.
Das hat auch alles funktioniert wie erwartet.
Dann hab ich den Interrupt pin später eingebunden, aber nur mittels digitalRead um die Zykluszeit etwas zu senken da ich keinen Interrupt brauche an der Stelle.
Auch das hat geklappt und die Zykluszeit um 200ns gesenkt.
Wenn ich aber jetzt ne Taste drücke bleibt die Zykluszeit unten.
Ich lese auch lange Tasterauslösungen ein und die Klappen wunderbar.
Aber dann sollte die Zeit doch wieder dem entsprechen wie wenn ich den Interrupt nicht abfragen würde,
da ich ja jeden Zyklus eine Abrage mache.
Aber sie geht eine ns Hoch das wars.
Wenn ich die Abfrage aus dem Sketch entferne bin ich wieder bei den 200ns.
Auch wenn alles funktioniert, würde ich gerne wissen woran das liegt.
Das ist meine Abfrage.
void button_read() {
if (digitalRead(intPin) == LOW) {
Wire.requestFrom(button_adress, 1);
if (Wire.available()) {
button = Wire.read();
}
}
}
Der ist über 1000 Zeilen lang und über 5 Module verteilt.
Wenn ich den Poste ist das noch unübersichtlicher als das.
Hier mal die ino.
Von der rufe ich an der Stelle erstmal nur die Funktion button_read() auf und frage den Beschleunigungssensor ab.
Einzig wenn ich ins Menu gehe kommt noch was dazu.
Um den Sketch einfacher zu verstehen.
Das Verhalten hab ich immer.
Auch wenn alles abgeschalten ist.
dark_mode == false
ts_on == false
dmx_on == false
fb_on == false
Ich überspringe also den gesamten Block nach button_read() bis menü on change.
Da ist dann nicht mehr viel übrig und Befehle die Erklärung bräuchten, weil sie hier nicht nachvollziehbar sind,
kommen erst nach 1000ms Tasterauslösung, wo das Verhalten aber schon besteht.
ich brauch aber keinen interrupt.
Ich greife lediglich das low Signal am int Anschluss des 8574 ab um nicht jeden Zyklus den 8574 auszulesen wenn kein Taster gedrückt wird.
Kadara:
ich brauch aber keinen interrupt.
Ich greife lediglich das low Signal am int Anschluss des 8574 ab um nicht jeden Zyklus den 8574 auszulesen wenn kein Taster gedrückt wird.
Ist ja auch ok.....dennoch verstehe ich deine Beschreibung nicht.
Nur ist klar, ohne den IRQ dauert es halt auch mal länger, je nach dem wie schnell dein loopdurchlauf ist.
Der PFC gibt am int pin ein low signal aus, wenn ein Taster gedrückt wird.
Das frage ich ab um nicht jede Runde zu prüfen. Das funktioniert wie es soll und ich bin 200ns schneller.
Das komische ist, das sich mit dieser Abfrage die Zykluszeit nicht erhöht wenn ich einen Taster drücke.
Und ich würde eigentlich damit rechnen, das ich dann wieder 200ns mehr haben würde.
Hab ich aber nicht. Und ich will nur wissen warum das so ist und kanns mir nicht erklären.
Ok....ich kann mir das nur so erklären, da der Controller immer in der loop abfragt, wird sich da nicht viel verändern.
Die eigentliche Tasterauswertung ist ja deutlich kürzer und fällt nicht ins Gewicht.
Das dürfte mit einem IRQ sicher noch schneller sein.
Kadara:
Der PFC gibt am int pin ein low signal aus, wenn ein Taster gedrückt wird.
Das LOW Signal steht aber nicht an solange der Taster gedrückt ist, sondern nur bis du ihn gelesen hast - dann ist der Int Pin wieder HIGH. Und da Du sowieso nur den Mittelwert von 1000 Zyklen misst, merkst Du da keinen Unterschied, wenn in einem Zyklus mal das I2C Lesen vorkommt.
Außerdem: um was für einen Arduino handelt es sich denn? Bei einem Standard Arduino sind 200ns gerade mal 3 Prozessortakte - das misst Du bestimmt nicht heraus.
Ok, jetzt wirds klar.
Als ich das erste mal getestet hab war der Pin eben auf die Dauer in der ich gedrückt hab low.
Das hab ich als Referenz genommen. Aber das der pcf den Pin selbst umschreibt wenn er gelesen wurde, war mir nicht klar. Wenn man das weiß, und an den richtigen stellen misst macht auch alles Sinn.
Er schreibt ihn um bei Steigender und fallender Flanke und hält ihn so lange auf low bis gelesen oder geschrieben wurde. Den Rest der Zeit bleibt die Variable halt auf ihrem Wert, weil nichts nach kommt. Erst wenn ich los lasse.
Einen echten Interrupt brauch ich nicht. Mir bringts rein gar nichts wenn das Lesen des Buttons schneller geht. Mir gehts nur im die Zykluszeit wenn nix gedrückt wird.
Alles was ich sparen würde, ist eine if Abfrage. Und die schlägt sich denk ich nicht bemerkbar auf die Zykluszeit.
Es ist ein Mega. Aber sorry, ich meinte µS nicht nS.
Mehr zeigt meine Messung ja nicht an und genauer muß ichs auch nicht wissen.