Jetzt komm ich mal mit einer Frage
Ich hatte erst in Anlehnung an dem Beispiel "PCF8575_interrupt.ino" aufgebaut
So wollte ich per IRQ die 6 Hallgeber hier im Testaufbau zu sehen ist, auslesen.
Die freien Eingänge des PCF85.. habe ich mittels Widerstände vorerst fest definiert. Alle Eingänge des PCF8575 sind als Eingänge festgelegt.
Die TLE 4905 (Bipolar Hallgeber) geben ein sauberes Signal ab. Auch bei diesem doch einfachen Testaufbau. Also Eingänge am PCF sind in Ordnung.
Ich habe mein Programm jetzt ohne IRQ klappt bestimmt so. Zeit habe ich ja genug.
Die Drehgeschwindigkeit 60 1/min auf einen Radius 20.7 mm ergibt bei einer 30° Bewegung 0,083 sec. Die Magneten haben einen Durchmesser 3 mm sind dann etwa 0,012 sec. Ansprechzeit. ABER mit interessiert schon warum das mit dem IRQ nicht hinhaut. Wie gesagt Prog läuft auch ohne. Erwänen sollte ich vielleicht auf dem I2C Bus sind noch ein PCA9685 für die PWM und ein PCF8574 für das LCD Display.
Und jetzt noch einen Dank an die die mit Ihrem Wissen anderen Helfen. Ich habe so einiges Lernen können. Für das was ich bis jetzt noch nicht so ganz verstehe hat mir Combi nen Buchtipp gegeben. Den Welzer hab ich auch schon da Dafür Danke nochmal.
```cpp
//
// FILE: PCF8575_interrupt.ino
// AUTHOR: Rob Tillaart
// DATE: 2021-01-03
// PUPROSE: test PCF8575 library
//
// TEST SETUP
// Connect INT pin of the PCF8575 to UNO pin 2
// Place a pull up resistor 4K7 between pin and 5V
#include "PCF8575.h"
PCF8575 PCF(0x38);
////////////////////////////////////
//
// INTERRUPT ROUTINE + FLAG
//
const int IRQPIN = 2;
volatile bool flag = false;
uint16_t x=0;
uint8_t Pwinkel; uint8_t Wwinkel;
void pcf_irq() {
flag = true;
}
void setup() {
Serial.begin(115200);
PCF.begin();
pinMode(IRQPIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(IRQPIN), pcf_irq, FALLING);
}
void loop() {
if (flag) {
flag = false;
x = PCF.read16();
Pwinkel = 0x3F ^ (x >> 8 & 0x3F); // 6 Bit aus dem 1. Byte P0 - P7
Wwinkel = 0x3F ^ (x & 0x3F); // 6 Bit aus dem 2. Byte P8 - P15
}
// Zum positionieren geht das, aber wehe ich versuche eine kontinuirliche veränderung zu erfassen. z.B Eine Umdrehung der Ronde
// Dann gehen Bits ins Nirwana.
**************************** So ist mein Auslesen gegeben *************
obriger Teil geht nicht so im Sketch geht.
// Ohne IRQ If (flag ...... und so weiter
void loop()
if(digitalRead(2)!= true) {
x = PCF.read16();
Pwinkel = 0x3F ^ (x >> 8 & 0x3F); // 6 Bit aus dem 1. Byte P0 - P7
Wwinkel = 0x3F ^ (x & 0x3F); // 6 Bit aus dem 2. Byte P8 - P15
// gibet es keine Probleme mit dem Auslesen
}
// -- END OF FILE --
```
Bitte gib uns 2 lauffähige Sketche die das Problem zeigen bzw nicht zeigen. Der gezeigte Sketch ist nicht lauffähig und wertet die meßwerte nicht aus.
Grüße Uwe
Und mit einem Sketch kommst Du auch nicht weiter. Da brauchst Du ja noch die Hardware zu um das nachstellen zu können.
Und ich hatte ja schon geschrieben mein Sketch läuft ja. Und die Variablen Pwinkel und Wwinkel und Schaltstellungen sind auf dem Sketch verwendbar. Durch die If(DigitalRead(2) != true) {} umgehe ich ja das permanente Abfragen im Loop. Den Rest erledigt ja dann der PCF8575 über den /INT Pin. Also das haut ja Perfekt hin. Ich werde noch den Pin 2 hier ändern. Ich habe ja noch Pin 10 oder 11 frei dann habe ich Pin 2 und 3 frei für SoftwareSerial. Wer weiß wozu es noch gut ist.
Und mein Sketch belegt momentan 50% des Uno Speichers willst Du dich da durchkämpfen? Mit dem IDE 2.0 ist es jetzt recht angenehm geworden. Aber wenn dass alles aufgeklapt ist wird es recht verwirrend
Ok, jetzt hast du im Sketch noch eine Information nachgetragen, die aber nicht wirklich alles erklärt.
Warum trennst du die Teile nicht so voneinander, das jeder sieht, die gehören nicht in einen Sketch.
Der 8575 arbeitet ja auch so. Bei Änderung an den Eingangspins. Wenn ich Daten auf die Pins schreibe Oder eben wenn ich die Daten dann Auslese.
Int Beschreibung mal Übersetzt.
PCF8575 stellt einen Open-Drain-Interrupt (INT) bereit, der einem
entsprechenden Eingang des Mikrocontrollers zugeführt werden
kann (siehe Abbildungen 9, 10 und 12). Dadurch erhalten diese Chips eine
Art Masterfunktion, die an anderer Stelle im System eine Aktion auslösen
kann.
Ein Interrupt wird durch jede steigende oder fallende Flanke der Port-Eingänge
generiert. Nach der Zeit tiv ist das Signal INT gültig.
Der Interrupt verschwindet, wenn Daten am Port auf die ursprüngliche
Einstellung geändert werden oder Daten von dem Gerät gelesen oder auf das
Gerät geschrieben werden, das den Interrupt erzeugt hat.
**** Enfällt ja bei mir da ich alle Pins als Eingang benutze ********
Im Schreibmodus kann der Interrupt bei der steigenden Flanke des
Schreibimpulses auf den Port deaktiviert (HIGH) werden. Bei der fallenden
Flanke des Write-to-Port-Impulses wird der Interrupt definitiv deaktiviert
(HIGH).
Und irgendwo hier vermute ich das Problem in der Zeit ******
Der Interrupt wird im Lesemodus mit der steigenden Flanke des Leseimpulses
vom Port zurückgesetzt.
Ich habe z.B. auch mal
attachInterrupt(digitalPinToInterrupt(2), pcf_irq, LOW);
ausprobiert Das gab in der Regel überwiegend Nullen. Ein anzeichen dafür, das die Magneten schon wieder außer Reichweite waren.
Ich probier gleich mal dein Vorschlag aus und Berichte.
So habe ich probiert. Oh gar nicht gut. Der Pin 2 (UNO) wird auf LOW gesetzt und der Arduino bleibt stehen. Um dann den geänderten Sketch wieder hochzuladen muss man einmal den UNO von der Stromversorgung trennen.
Aber ich habe heute Abend mal ein Serial.Print in die IRQ gebaut und das Ergebnis war fast richtig. Gestern waren ja BIT gesetzt die nie hätten auftauchen dürfen.
Dann machst Du irgendwas Grundlegendes falsch, was ich nicht sehen kann.
Ich habe meinen PCF8574 ausgegraben, PCF8574 library von Rob Tillaart installiert und das Beispiel PCF8574_interrupt.ino laufen. Nach Deinen Angaben in #1 verwende ich ein Signal 10 ms low und 73 ms high, die Ausgabe sieht dann so aus:
11:28:12.967 -> READ: 451016 FE
11:28:12.967 -> READ: 451026 FF
11:28:13.068 -> READ: 451099 FE
11:28:13.068 -> READ: 451109 FF
Das scheint mir plausibel.
Leider verstehe ich den Sinn Deiner Scheibe nicht, aber wenn Du drei Magnete und sechs Halls verbaut hast, dann kommen die Interrupts durch mechanische Toleranzen vermutlich nacheinander anstelle, wie von Dir gemutmaßt, gleichzeitig.
Verbinde ich P0 und P1 mit meinem Signal, sehe ich
11:43:13.063 -> READ: 1349872 FC
11:43:13.063 -> READ: 1349882 FF
darum sollst du ja den kleinstmöglichen Sketch machen.
a) damit hast du selber die Möglichkeit dein Problem einzugrenzen in dem du weglässt was nichts mit deinem Problem zu tun hat.
b) wenn du dann diesen vollständig kompilierbaren Code postest erhöhst du die Chance dass Helfer dir helfen können.
Nein, ganz anders.
Der Fehler lag mal wieder vor dem Bildschirm. Ich schreibe dass mal im Laufe des Tages mal richtig zusammen.
Ich hatte ja gestern einen Ausdruck erstellen wollen. Und auf einmal hat das mit dem Interrupt auch geklappt. Ein bissel zur Vorgeschichte. Ich hatte die Library von SkyWodd im Gebrauch. Das gab immer Fehlermeldungen Alte Lib u.s.w
Sobald eine Lib z.B. Rob Tillaart im Ordner der Lib´s war wird die neue Lib vom IDE2. Verwendet. Das gibt ja eine Fehlermeldung beim kompilieren ,weil der neue IDE 2. die alten Lib´s nicht übernimmt und diese ja unterschiedlich programmiert werden.
Ein Löschen der neuern Lib aus dem Ordner geht zwar, ist aber auch nicht das gelbe vom Ei.
Also Prog umbauen. Nur! ich hatte das übersehen :
Lib SkyWodd:
PCF8575 PH1(); // Adresse I2P 1 A0=0 A1=0 A2=0
Und im Setup
PH1.begin(0x20);
In der Lib von Rob Tillaart muss das so aussehen:
PCF8575 PH1(0x20); // Adresse I2P 1 A0=0 A1=0 A2=0
Und im Setup
PH1.begin();
Und wenn man das so nicht macht kommt es zu diesen merkwürdigen Ausgaben
Diese Konstruktion soll mir die Position auf 30° ausgeben ohne das ich bei Programmstart eine Refferenzposition anfahren muss. Ein Drehgeber auf dem Antriebsmotor geht nicht weil zwischen Motor und Scheibe nacher eine Rutschkupplung vorgesehen ist. So wie auf dem Bild war das mal gedacht. Aber ich muss noch den Abtastdurchmesser vergrößern und wahrscheinlich noch einen Aufnahmekranz für die Hallgeber konstruieren. Der Test zur Zeit hat gezeigt, dass diese genau im abstand und Position stehen müssen.