Forum: Mikrocontroller und Digitale Elektronik Arduino Interrupt Geschwindigkeits-Problem?


von Ulrich Schmidt (Gast)


Lesenswert?

Hallo Experten.

Ich versuche mit dem Arduino Uno ein defektes Spezialdisplay meines 
Synthesizers Roland JX-10 zu ersetzen. Das Original ist kein LCD, 
sondern ein Vakuum-fluoreszierendes Display das mit 40 Volt betrieben 
wird.

Der Display-Treiber wird mit Clock und Data versorgt und ist ziemlich 
einfach codiert. Die Bits kommen mit einer Frequenz von ca. 80kHz an.
Ein Byte dauert also ca 100 Mikrosekunden.
Pause zwischen den Bytes ist ca. 200 Mikrosekunden.

Ich habe also PIN 2 als Interrupt für den Clock (RISING EDGE) verwendet, 
auf PIN 3 lese ich die Daten ein.
Zum Teil funktioniert das auch prima.
Im Vergleich zum Speicheroszi (da kommen die korrekten ASCII codes an) 
zeigt die Arduino Auswertung manchmal zufällige falsche ausgelesene 
Character an.

Nun die Frage vom Anfänger an die Experten:
- Kann das ein Timing Problem sein?
- wie schnell kann ein Arduino UNO eigentlich Interrupts auswerten?
- Gibt es eine bessere Möglichkeit, Clock und Data auszulesen (z.B. 
ISP?)
- Sollte ich besser ein 8Bit Schieberegister z.B. 74xx164 vorschalten
  und die Daten dann parallel einlesen?
  Hier wirds allerdings dann eng mit den dig. Inputs....

Danke!

von Ulrich F. (Gast)


Lesenswert?

Ulrich Schmidt schrieb:
> - Gibt es eine bessere Möglichkeit, Clock und Data auszulesen (z.B.
> ISP?)
Das eingebaute https://www.arduino.cc/en/pmwiki.php?n=Reference/ShiftIn
Ob das besser ist, weiß ich nicht, aber kannst ja mal testen...

Die Arduino SPI Lib kann leider keinen Slave Mode.
Da ist Eigenarbeit nötig.
Sonst wäre das evtl. die bessere Wahl.

von Olaf (Gast)


Lesenswert?

> Ich versuche mit dem Arduino Uno ein defektes Spezialdisplay meines
> Synthesizers Roland JX-10 zu ersetzen.

Ah..seit langem das erste Mal das ein Anfaenger versucht etwas 
sinnvolles zu basteln. :-)

> Ich habe also PIN 2 als Interrupt für den Clock (RISING EDGE)
> verwendet, auf PIN 3 lese ich die Daten ein.

Ich wuerde erwarten das dies funktionieren kann. Es waere aber trotzdem 
klueger die SPI-Schnittstele des Controllers zu verwenden weil du dich 
dann erst nach jedem achten Bit um die Daten kuemmern musst und keine 
Timinigprobleme hast.

> Im Vergleich zum Speicheroszi (da kommen die korrekten ASCII codes an)
> zeigt die Arduino Auswertung manchmal zufällige falsche ausgelesene
> Character an.

Das bedeutet das deine Interruptfunktion nicht gelaufen ist. Vermutlich 
weil etwas anderes im Arduinobetriebsystem mehr Rechte hat. Du musst 
dafuer sorgen das dein Interrupt die hoechste Prioritaet hat damit er 
andere Sachen unterbrechen kann. Ich bin jetzt leider schon eine Weile 
von den AVRs weg, aber ich habe so in Erinnerung das die sehr armselig 
waren wenn man soetwas einstellen wollte.

Olaf

von Olaf (Gast)


Lesenswert?

Nur mal so interessehalber... Aber wie aeussert sich denn eigentlich der 
Defekt deines VFDs? Ich halte die Teile eigentlich fuer unkaputbar.

Lediglich bei Anwendungen wo sie immer gelaufen sind 
(Uhren/Videorecorder) laesst ihre Helligkeit nach >10Jahren Dauerbetrieb 
schonmal nach. Ich denke das kann man bei einem Synthie wohl 
ausschliessen. Bist du sicher das da nicht nur irgendwas in der 
Ansteuerung defekt ist?

Olaf

von Ulrich F. (Gast)


Lesenswert?

Olaf schrieb:
> Vermutlich
> weil etwas anderes im Arduinobetriebsystem mehr Rechte hat.
Das gibts nicht....

Der Timer0 Interrupt könnte den eigenen Interrupt verzögern.


Da der Code bisher geheim ist, kann ich da auch keinen Fehler sehen.
Meine Glaskugel schreit: "Volatile" und "ATOMIC"
Aber was solls, ohne Code kann sie schreien, soviel sie will...

von Hafax (Gast)


Lesenswert?

Hallo,

Ja es kann durchaus ein Timing Problem sein.

Programmierst du den Arduino über die Arduino IDE?

Die Arduino IDE erzeugt für die Funktion mills() einen Timer Interrupt. 
Dieser kann deinen Interrupt verzögern. Falls du diese Funktion 
verwendest.

Auserdem ist der Overhead der, ich nenn es mal Arduino Sprache, sehr 
hoch.
Im Arduino Forum bin ich auf ein Beitrag gestoßen in dem die 
Geschwindikeit der Pin Funktionen gemessen wrude. [1]
Dort schreibt ein Nutzer "...Up to 40KHz the numbers were usually the 
same (within 1 or 2) but past 40KHz, the Arduino couldn't keep up.". 
Daher denk ich das deinen erkennung in reiner Software mit "Arduino 
Sprache" eher schwer werden wird.

Mfg. Hafax

[1]http://forum.arduino.cc/index.php?topic=222002.0

von ch (Gast)


Lesenswert?

>Die Arduino SPI Lib kann leider keinen Slave Mode.
https://forum.arduino.cc/index.php?topic=184527.0

von Peter D. (peda)


Lesenswert?

Ulrich Schmidt schrieb:
> Die Bits kommen mit einer Frequenz von ca. 80kHz an.
> Ein Byte dauert also ca 100 Mikrosekunden.
> Pause zwischen den Bytes ist ca. 200 Mikrosekunden.

Dann nimm das SPI im Slave-Mode.
Das VFD müßte eigentlich 3 Eingänge haben, der 3. ist das /SS.

von Ulrich F. (Gast)


Lesenswert?

Hafax schrieb:
> Die Arduino IDE erzeugt für die Funktion mills() einen Timer Interrupt.
> Dieser kann deinen Interrupt verzögern. Falls du diese Funktion
> verwendest.
Das tut die Timer0 ISR auch wenn millis() nicht verwendet wird.
(man kann Arduino dazu überreden, keine ISR zu installieren)

Hafax schrieb:
> Auserdem ist der Overhead der, ich nenn es mal Arduino Sprache, sehr
> hoch.
> Im Arduino Forum bin ich auf ein Beitrag gestoßen in dem die
> Geschwindikeit der Pin Funktionen gemessen wrude. [1]
> Dort schreibt ein Nutzer "...Up to 40KHz the numbers were usually the
> same (within 1 or 2) but past 40KHz, the Arduino couldn't keep up.".
> Daher denk ich das deinen erkennung in reiner Software mit "Arduino
> Sprache" eher schwer werden wird.
Es zwingt einen keiner die digitalWrite() und digitalRead() Funktionen 
zu nutzen. Bei Nichtnutzung schmeißt der Optimierer sie raus.

Den Arduino Overhead kann man auf Null reduzieren.
Bei Beibehaltung der Arduino IDE.

von Hafax (Gast)


Lesenswert?

Ulrich F. schrieb:
>Das tut die Timer0 ISR auch wenn millis() nicht verwendet wird.
>(man kann Arduino dazu überreden, keine ISR zu installieren)

Ok dass wuste ich nicht. Dachte der Timer0 wird nur bei verwendung der 
Funktion initialisiert.

Mir ist klar das digitalWrite() und digitalRead() nicht verwendet werden 
muss, dem TO möglichweise nicht.
Da ich eben keinen Code gesehen habe, wollt ich auf den Umstand 
hinweisen, das diese Funktionen einen mächtigen Overhead haben...

@Ulrich Schmidt:
Zeig doch mal deinen Code.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.