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!
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.
> 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
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
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...
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
>Die Arduino SPI Lib kann leider keinen Slave Mode. https://forum.arduino.cc/index.php?topic=184527.0
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.