Ich arbeite an einem Projekt, das den optischen Sensor einer Maus beinhaltet. Ich habe die originale Steuerplatine (bis auf den optischen Sensor selbst noch bestückt) und den optischen Sensor auf meiner benutzerdefinierten Platine, der von einem nrf51822 gesteuert werden soll. Ich habe die Takt- und Datenpins (es ist eine Zweidrahtschnittstelle) mit beiden Platinen verbunden, die von der ursprünglichen Steuerplatine angesteuert werden (ich habe meine Takt- und Datenpins als Eingänge ohne Ziehwiderstände eingestellt).
Ich versuche, den Verkehr zu erfassen, um festzustellen, welche Signale gesendet werden, aber ich habe nicht viel Glück - ich vermute, dass meine Taktrate zu niedrig ist. So schnell wie möglich (nur innerhalb einer while true
Schleife) scanne ich meinen Uhr-Pin und meinen Daten-Pin und drucke sie dann beide über UART mit 1M Baud auf meine Konsolenausgabe. Wenn Sie diese Schleife 5 Sekunden lang leer laufen lassen, führt dies zu ~ 4000 Zyklen, was bedeutet, dass ich für jede Schleife eine Laufzeit von> 1 ms erhalte - was meiner Meinung nach mein Hauptproblem ist.
So wie es ist, nehme ich (in ungefähr 700 Scans) 100 Gruppen von abwechselnd "Uhr 1 und Daten 1" und "Uhr 0 und Daten 0" auf - jede Gruppe weist 4-9 Elemente (also 4-9 "1s" auf beide, gefolgt von 4-9 "0" auf beiden). Dann, ungefähr 400 Scans später (~ 0,5 Sekunden), bekomme ich dasselbe, aber 54 Gruppen. An diesem Punkt habe ich aufgehört zu scannen.
Gibt es eine Möglichkeit: A) meinen Scanzyklus zu beschleunigen, damit ich den Datenverkehr genauer erfassen kann? oder B) Entschlüsseln, was ich bereits habe (zweifelhaft)?
Muss ich eine alternative Route in Betracht ziehen? Ich habe keinen Zugang zu einem Oszilloskop gefunden, was ... bedauerlich ist.
Ich würde mich über jeden Rat freuen. Danke.
Wie Chris Stratton in seinen Kommentaren zur anderen Antwort angegeben hat, müssen Sie die Funktionsweise Ihrer Software ändern.
Es gibt zwei Möglichkeiten:
Option 1:
Ausführen in einer engen Schleife, Abfragen der Pins und Aufzeichnen eines Zeitstempels in einem Puffer, wenn sie ihren Status ändern. Wenn sich der Wert nicht geändert hat, tun Sie nichts.
Sobald der Puffer voll ist, geben Sie die aufgezeichneten Zeiten über die serielle Verbindung aus.
Option 2:
Verwenden Sie die seriellen und Taktleitungseingänge als Interrupts. Wenn sich die Pins ändern, wird ein Zeitstempel für den Übergang und den neuen Zustand des Pins in einen Puffer aufgenommen.
Lassen Sie eine Hintergrundschleife die protokollierten Daten an die serielle Schnittstelle senden, um so gut wie möglich mit den Daten Schritt zu halten, während angezeigt wird, ob der Puffer übergelaufen ist.
Beide lösen das große Problem, dass Sie versuchen, serielle Daten aus einem zeitkritischen Codestück auszugeben, printf ist langsam und serielle Ports laufen in einem rasanten Tempo, tun Sie sie niemals in einem Codeabschnitt, den Sie benötigen schnell laufen. Option 1 ist einfacher und wird wahrscheinlich mit etwas höheren Frequenzen zurechtkommen, nimmt aber nur so lange auf, wie Sie Platz zum Puffern haben, und könnte möglicherweise zwei sehr nahe beieinander liegende Kanten als in der falschen Reihenfolge melden. Option 2 gibt während des Betriebs aus und sollte daher länger laufen können (ob es 1 Kante mehr ist oder mithält und undefinierbar läuft, hängt von den Geschwindigkeiten der Kanten und der seriellen Schnittstelle ab), hat aber aufgrund des Interrupt-Overheads eine niedrigere Spitze Geschwindigkeit und ist komplexer zu codieren.
Die andere offensichtliche Lösung besteht darin, ein Oszilloskop oder einen Logikanalysator von jemandem zu leihen / zu mieten.
Der NRF51822 verwendet einen ARM Cortex M0, der für Ihre Erfassungsaufgabe einzigartig ungeeignet erscheint. Der Cortex M0 verwendet alles von 1-4 Zyklen für die grundlegenden Anweisungen und viel länger, wenn Sie Dinge wie Multiplizieren verwenden. Der Prozessor kann nicht innerhalb einer grundlegenden Befehlsdecodierung unterbrochen werden.
Wenn Sie Daten erfassen möchten, wäre es mit einem kleinen 8-Bit-1-Zyklus-Prozessor wie dem ATMega328 viel besser. Sie sollten in der Lage sein, einen $ 3 Arduino Nano zu verdrahten, um die Daten zu serialisieren und über die serielle Schnittstelle auszugeben.
Da das Protokoll synchron ist, sollten Sie die SPI im Slave-Modus verwenden können, um die Daten zu empfangen. Sie sollten Nick Gammons hervorragende Berichterstattung über SPI lesen , um loszulegen.
Wenn Sie einen SPI-Slave verwenden, müssen Sie effektiv alle 8 Zyklen Ihrer Geräteuhr 8 Bits in die UART-Warteschlange stopfen. Denken Sie daran, dass diese Erfassungsmethode keine Lücken (ohne Takte) erfasst. Sie erhalten also einen dichten Dump (keine Leerzeichen) der Daten.
Um zu verstehen, warum der ARM Cortex M0 entweder bei Interrupt-Geschwindigkeit oder Bit-Bashing-Ports schlecht ist, lesen Sie this und this .
Vince Patron
Chris Stratton
Hilfreich
Hilfreich
Chris Stratton
0___________
Hilfreich