Hallo Freunde, ich bin auf der suche nach einem Kontroller, der in der lage ist 2Pins nach einem BIT-Muster das ich vorgebe mit einemr Taktzeit von 5 us. Ich habe einige Arduino und einen ESP 32 getestet. Ich bekomme aber nicht weniger als 15 us. Wenn ich einen Timmer interrupt nutze schaffe ich es nicht. Und wenn ich nur die MainLoop nutze schalten die PINS auch nicht schnell genug. Wozu soll das ganze sein ? Ich möchte damit ein recht exotisches Protokoll nachbilden um eine Art Simulator für schnelle Tests zu bauen. Gruß Elchi
Elchi schrieb: > ich bin auf der suche nach einem Kontroller, der in der lage ist 2Pins > nach einem BIT-Muster das ich vorgebe mit einemr Taktzeit von 5 us. Das kein Satz. > Ich > habe einige Arduino und einen ESP 32 getestet. Ich bekomme aber nicht > weniger als 15 us. Mit digitalRead wird das schwierig. > Wenn ich einen Timmer interrupt nutze schaffe ich es nicht. Und wenn ich > nur die MainLoop nutze schalten die PINS auch nicht schnell genug. Doch, das tun sie. Aber deine Programmierung ist suboptimal. > Wozu soll das ganze sein ? Ich möchte damit ein recht exotisches > Protokoll nachbilden um eine Art Simulator für schnelle Tests zu bauen. Dann nimm einen Vergleicher in Hardware, der CD4585 ist dein Freund, der kann sogar 4 Bits vergleichen.
Raspberry Pi mit der pigpio library siehe http://abyz.me.uk/rpi/pigpio/ Sehr maechtig aber nicht ganz straight forward zu benutzen.
Andi M. schrieb: > Sehr maechtig aber nicht ganz straight forward zu benutzen. Mit nem Linux oben drüber? Niemals
Hallo, wenn der Ablauf blockierend sein darf, beschreibst du die Pin Register direkt ohne digitalWrite auf dem Arduino. Dann dauert ein Takt genau ein µC Takt. Üblicherweise 62,5ns bei 16MHz. Den Rest der Wartezeiten füllst du mit NOP mittels Schleife auf, welche blockiert. Dafür hättest du die genau Kontrolle über jeden Takt. Das wäre die einfachste Art und Weise ohne weitere Anforderungen. Ansonsten musst du mehr zum Protokoll schreiben usw.
RP4020 pio... Damit wurde schon DVI/HDMI per Bitbanging realisiert und das ist etwas schneller als die 5µs.
Mit dem PSSI der STM32U5x5 mit DMA geht das problemlos auch ein 'wenig' schneller als gefordert, nämlich mit max. 64MHz und auch mit bis zu 16 Pins synchron.
Elchi schrieb: > Ich bekomme aber nicht weniger als 15 us. Mein Ardunio Pro Mini kommt mit 1/10 der Zeit aus - alles eine Frage der Programmierung. Schon die Benutzung von einer der digitalWriteFast()-Funktionen hilft deutlich.
Hallo, erst mal sorry wegen des "tollen" Einleitungssatzes. Und Danke für die Tipps: Das mit dem direkten Register beschreiben habe ich getestet. Das schreiben ist schnell genug. Aber der Pegelwechsel am pin ist laudt dem Oszi nicht schnell genug. Das Protokoll ist einfach es sind 32 bit Worte die für meinen Test Fix sind ca. 10 die sich immer wiederholen. Eine "1" ist PIN1 = High und PIN2 = Low und eine "0" andersrum. Ich werde eure Vorschläge mal prüfen. Gruß und Danke
Elchi schrieb: > ich bin auf der suche nach einem Kontroller, der in der lage ist 2Pins > nach einem BIT-Muster das ich vorgebe mit einemr Taktzeit von 5 us. Das sind auf dem AVR @16MHz 80 CPU-Zyklen lang. Das sollte sogar mit Interrupt-Overhead zu schaffen sein. Du mußt aber die Ports direkt setzen, also nicht mit digitalWrite. Ich würde einen 5µs Timer aufsetzen und das Interruptbit in der Mainloop pollen. Damit sollte der Jitter minimal sein.
Elchi schrieb: > Aber der Pegelwechsel am pin ist laudt dem > Oszi nicht schnell genug. Dann steht der Pin vermutlich noch auf Input und Du schaltest nur den Pullup ein und aus.
Das Problem hatte ich bei der Ansteuerung eines Tintendruckkopfes, einfach die C-Routine als Assembler ausgeben und dann optimieren.
Elchi schrieb: > Aber der Pegelwechsel am pin ist laudt dem > Oszi nicht schnell genug. 1µs für ein vollständiges Rechteck sind schon drin. Ohne große Klimmzüge. Verlangsamen soll dann wohl kein Problem sein....
1 | // toggle nach muster UNO Pin 8 und 9
|
2 | byte muster[] { |
3 | _BV(PB0)|_BV(PB1), |
4 | _BV(PB1), |
5 | _BV(PB1), |
6 | _BV(PB0)|_BV(PB1), |
7 | _BV(PB0)|_BV(PB1), |
8 | _BV(PB1), |
9 | _BV(PB1), |
10 | _BV(PB0)|_BV(PB1), |
11 | _BV(PB0)|_BV(PB1), |
12 | _BV(PB1), |
13 | _BV(PB1), |
14 | _BV(PB0)|_BV(PB1), |
15 | _BV(PB0)|_BV(PB1), |
16 | _BV(PB1), |
17 | _BV(PB1), |
18 | _BV(PB0)|_BV(PB1), |
19 | };
|
20 | |
21 | int main() |
22 | {
|
23 | DDRB |= _BV(PB0)|_BV(PB1); // UBO Pin 8 und 9 |
24 | for(;;)for(byte m:muster) PINB = m; |
25 | }
|
Hallo, Elchi schrieb: > Ich > habe einige Arduino und einen ESP 32 getestet. Ich bekomme aber nicht > weniger als 15 us. ein ESP32 schafft das mit seiner I2S-Hardware völlig problemlos. Auch aus der ArduinoIDE, siehe ESP866Audio oder FastLED-Lib. usw. Gruß aus Berlin Michael
EAF schrieb: > > _BV(PB0)|_BV(PB1), > lange nicht mehr gesehen, da musste ich erstmal ne Sekunde drüber nachdenken...
Lies mal hier, gut erklärt und funktioniert perfekt. http://wp.josh.com/2015/03/05/the-perfect-pulse-some-tricks-for-generating-precise-one-shots-on-avr8/
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.