Ich codiere ein System, das 16 Bit schnell von einer Variablen uint16_t in zwei gepaarte 74HC595-Schieberegister verschieben muss. Ich führe den Code auf einem Arduino (atmega328 @ 16Mhz) aus und das shiftOut im Arduino ist viel zu langsam. Die digitalWrite-Funktion der Bibliothek ist ebenfalls langsam.
Die beste Idee, die ich mir ausgedacht habe, ist eine for-Schleife, die alle 16 Bits der Variablen durchläuft und 1/0 in den Daten-Pin schreibt, das Taktbit so kurz wie möglich hoch setzt und dann zum nächsten Bit der Variablen übergeht.
Ist dies die schnellste Lösung und wenn ja, wie durchlaufe ich die Bits der Variablen uint16_t in c ++?
arduino
atmega
shift-register
74hc595
tirithen
quelle
quelle
Antworten:
Dies ist mit der SPI-Bibliothek einfach genug.
Verbinden Sie Ihren Schieberegister-Eingang mit dem MOSI-Pin (Master Out, Slave In) - Digital Pin 11 - und Sie erhalten schöne schnelle Übertragungen.
Es wird eine sehr geringe Verzögerung zwischen den oberen und unteren 8 Bits jedes übertragenen Wortes geben.
Zum Beispiel:
quelle
Wenn Sie eine Software-Datenübertragung verwenden möchten, möchten Sie die Funktionen digitalWrite nicht verwenden. Sie sind sehr langsam, weil sie die Pin-Nummer durch eine Tabelle in ein tatsächliches Register (PORTx) übersetzen, das richtige Bit maskieren und es ändern müssen. Alle Pins in Arduino sind Zahlen zugeordnet, während sie darunter zu Port A, B, C und noch mehr der MEGA-Version des Arduino gehören können.
Es ist viel schneller, die AVR-Register direkt zu ändern. Wie PORTB und a-like. Sie müssen in der Tat jedes Bit durchgehen. Ich würde eine for-Schleife von 0 bis 15 erstellen und ein bisschen verschieben und maskieren.
Da ich die Pinning-Konfiguration nicht kenne, kann ich kein genaues Beispiel nennen. Allerdings wird es wahrscheinlich sehr ähnlich aussehen. Mit "sehr nah" meine ich, dass dies nicht getestet wurde.
Um herauszufinden, welche Hardware-Pin-Nummer (Pin 4 nicht Pin B4 oder A4!) Ist, müssen Sie sich das Schema von Arduino ansehen.Ich habe einen ähnlichen Code auf einem PIC32 ausgeführt (läuft mit 80 MHz). Der PIC32 konnte dies bei etwa 1,5 MHz tun, aber in main () wurden einige zusätzliche Codezeilen ausgeführt, um eine neue Ausgabe zu berechnen. Trotzdem kann es sehr schnell gehen.
quelle
Sie müssen das SPI-Peripheriegerät verwenden, anstatt die Software zu verschieben. Ich habe noch nie ein Arduino verwendet, aber die Online- Referenz legt nahe, dass es eine SPI-Bibliothek gibt, die Sie verwenden können. Wenn dies nicht Ihren Anforderungen entspricht, können Sie das SPI-Peripheriegerät im ATMega-Datenblatt nachschlagen. SPI-Peripheriegeräte sind normalerweise recht einfach einzurichten und zu verwenden.
quelle
Ich bin alte Schule, codiere seit 100 kHz Prozessoren. Verwenden Sie Inline-Code für die Bitmanipulation direkt am Port anstelle einer Schleife. Die Schleife erfordert Overhead, Inline ist schneller, benötigt jedoch mehr Programmplatz. Informationen zur Bitmanipulation der Ports finden Sie unter AVR035: Effiziente C-Codierung für AVR .
quelle