5us PIN Change

OP #7292000
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
#7292003
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.
#7292009
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.
Gast #7292024
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.
OP #7292031
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
#7292037
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.
Gast #7292065
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.