Repository navigation
LinkKST de
English · Deutsch
Diese Seite ist ein Abschnitt von Der Link, der die Verkabelung, das Frame-Format, die Page Map und die übrigen Pages enthält. Pins heißen nach ihrer GPIO-Nummer (General-Purpose Input/Output). PWM steht für Pulsweitenmodulation.
Die Servo-Programmier-Page (KST, 0x32) ist neu in 4.12 und nennt seit 4.13
einen Programmierport. Die
Page fährt das Programmierprotokoll aus
protocols/kst für KST- und Chaservo-Servos,
die ein Protokoll und einen Registersatz teilen, auf einem Port von
PROG zur Zeit. Ein Port gibt PWM-Pulse aus oder
fährt das Programmierprotokoll, nie beides. Ob ein KST- oder Chaservo-Servo
im Programmiermodus PWM-Pulsen folgt, ist nicht gemessen. Ein
Standard-Servoport ist kein Programmierport, und ein Kommando, das einen
nennt, wird abgewiesen.
Die Session läuft auf dem Koprozessor mit dem Planer und den Grenzen des
Moduls. Das Panel schreibt eine Operation und die Images, die sie braucht.
Es liest den Zustand, das Ergebnis und die 32 Register des Servos. Es sendet
keinen Registerschreibzugriff. shared/outputs/kst_port.c hält die Regeln.
Nichts wird im Flash gehalten: nach einem Neustart des Koprozessors steht
der Port in PWM ohne Session und mit gelöschtem Bit 4 in Register 0, gleich
in welchem Modus das Servo ist, und die Versorgung ist aus angefordert.
Die Session plant ein WRITE und ein RESTORE selbst (seit 4.14). Der Frame
des Kommandos prüft den Auftrag und bereitet den Job des Planers vor, 64 us
Planerarbeit. Ein Ziel, das der Planer ohne Suche abweist, wird dort
abgewiesen (PLAN_RULES, PLAN_R00, PLAN_PAIRING), und keine Operation
startet. Jeder andere Auftrag startet die Operation, und jeder Durchlauf
der Hauptschleife von Kern 0 fährt dann einen Slice des Planers: 100 bis
109 Einheiten Arbeit, höchstens 892 us. Solange der Port plant, ist Bit 3
von Register 0 gesetzt, das Low-Byte von LINK_KS_RESULT liest 35, der
Frame-Zähler liest 0, und kein Frame geht an das Servo. Das Planen endet
nach höchstens 216 000 Einheiten, 2 161 Durchläufen:
- mit einem Plan:
LINK_KS_RESULTliest 1, und die Session liest das Servo und schreibt; - ohne eine Reihenfolge von Schreibzugriffen, die jedes Image dazwischen gültig hält: Ergebnis 33;
- mit verbrauchten 216 000 Einheiten, bevor eines von beiden feststeht: Ergebnis 34. Ob der Auftrag einen Plan hat, ist dann nicht bekannt;
- ein RESTORE, dessen Ergebnis sich nicht prüfen lässt, ohne die Bestätigung: Ergebnis 11.
Bei den Ergebnissen 33, 34 und 11 wird nichts an das Servo gesendet, die Session ist nicht gesperrt, und das nächste WRITE wird ohne READ_ALL angenommen. Der teuerste gefundene Auftrag braucht 120 136 Einheiten, höchstens 1 202 Durchläufe und 397 bis 647 ms Planerzeit. Die Zeiten sind in einem Emulator aus den ausgeführten Instruktionen für 150 MHz berechnet (Performance) und nicht auf Hardware gemessen. Die Zeit eines Durchlaufs mit dem Rest der Hauptschleife ist nicht gemessen; die Planzeit an einem Prüfstand ist also nicht bekannt. Ein 4.13-Koprozessor fährt die ganze Suche im Frame des Kommandos und beantwortet einen Auftrag ohne Reihenfolge von Schreibzugriffen mit der Abweisung PLAN_NO_PATH.
Der Port, die Page und das Modul des Panels laufen in der Host-Suite gegen ein Servo-, Leitungs- und Versorgungsmodell.
| Zustand | Wert | Der Pin des Ports | Die Versorgung | Endet |
|---|---|---|---|---|
| PWM | 0 | der PWM-Generator | die des Panels, auf SUPPLY | wenn ENTER oder REBOOT angenommen ist |
| STOPPING | 1 | der PWM-Generator, ohne Puls: ein laufender Puls endet | unverändert | nach 50 ms |
| LOW | 2 | der Leitungstreiber, auf Low getrieben | für das Programmieren gesetzt, siehe unten | nach 100 ms und wenn die Versorgung wie angefordert liest |
| PROGRAMMING | 3 | der Leitungstreiber: Low, ein Frame oder Eingang für ein Antwortfenster | an, vom Port gehalten | mit POWER_CYCLED, REBOOT oder LEAVE, und wenn die Versorgung ausgeht; vor dem ersten Frame auch mit ABORT, einem Stopp oder einem fehlgeschlagenen Einstieg |
| RAIL_OFF | 4 | der Leitungstreiber, oder nach einem REBOOT in PWM der PWM-Generator ohne Puls | aus | 2000 ms nachdem die Versorgung aus liest |
| RAIL_WAIT | 5 | wie RAIL_OFF | an, mit den Sollwerten, die sie hatte | 1000 ms nachdem die Versorgung an liest, nach PWM |
| LEAVING | 6 | der Leitungstreiber, auf Low getrieben | wie sie ist: nicht geschaltet, kein Sollwert geschrieben | nach der Wartezeit aus Schreibregister 28, nach PWM (seit 4.15) |
Die Einstiegssequenz der Session hält die Leitung nach LOW weitere 100 ms
auf Low. Ab LOW hat der Generator den Pin nicht. Jede Quelle eines
PWM-Kommandos (das Panel, der Sweep, der automatische Test) endet am
Bankkanal des Ports, keine erreicht also den Pin; PROG und SERVO nehmen ein
solches Kommando weiterhin an. Das PWM-Bit des Ports und TARGET bleiben
über eine Session wie geschrieben, und der Puls ist zurück, wenn der Port
wieder in PWM steht. Der Koprozessor schreibt kein Flash, solange der Port
nicht in PWM steht.
Das Servo des Ports wird vom PD mini von SUPPLY (0x2A) versorgt. Bit 10 von Register 0 liest 1, solange ein PD mini antwortet; der Port schaltet ihn dann.
ENTER nimmt die Programmierspannung und die Stromgrenze aus den
Schreibregistern 26 und 27. Antwortet ein PD mini, wird ENTER mit
SUPPLY_RANGE abgewiesen, außer die Spannung ist höchstens 8400 mV, der Strom
50 bis 3000 mA und die Spannung der Session mindestens 700 mV unter der Eingangsspannung des PD
mini. 8400 mV ist die höchste Servoschiene des IO-Boards. Die Spannung der
Session ist die bereitgestellte oder die niedrigere von ihr und der
Spannung eines Ausgangs, der an ist; unter 4800 mV wird ENTER mit
SUPPLY_LOW abgewiesen (seit 4.15), und die Versorgung bleibt unberührt.
Das Panel hält dieselbe Untergrenze auf seiner Seite: es sendet kein ENTER,
solange es einen Ausgang des PD mini liest, der an ist und unter 4800 mV
gesetzt ist, was auch immer der Koprozessor mit diesem ENTER tut.
4800 mV ist KST_PORT_SUPPLY_MIN_MV; die
Versorgungsspannung, die ein Servo zum Speichern eines Registers braucht,
ist nicht gemessen. In LOW tut der Port dann eines von zwei Dingen:
- der Ausgang ist aus angefordert: die Sollwerte werden geschrieben und der Ausgang wird eingeschaltet. Die Session beginnt 1000 ms nachdem der PD mini an liest;
- der Ausgang ist an: die Spannung wird auf die niedrigere der zwei Spannungen gestellt und die Stromgrenze auf die niedrigere der zwei Grenzen (die Grenze seit 4.15). Nichts wird geschrieben, wo beide schon die des Ausgangs sind.
Kein Schritt des Ports hebt die Spannung oder die Stromgrenze eines Ausgangs, der an ist, und das Verlassen des Programmierens stellt keinen höheren Wert wieder her, den ENTER gesenkt hat. Ein PD mini, der nicht innerhalb von 3000 ms wie angefordert liest, beendet ENTER mit Ergebnis 32: der Port steht in PWM, und ein Ausgang, den dieses ENTER eingeschaltet hat, ist wieder aus.
POWER_CYCLED und REBOOT in PROGRAMMING, bei an angefordertem PD mini, schalten die Versorgung aus und ein: aus, RAIL_OFF für 2000 ms ab der Lesung, die sie aus zeigt, an mit den Sollwerten, die sie hatte, RAIL_WAIT für 1000 ms ab der Lesung, die sie an zeigt, dann PWM mit gelöschtem Bit 4. REBOOT wird auch in PWM angenommen, für ein Servo, das neu starten soll: derselbe Ablauf, ohne Puls am Port währenddessen. 2000 ms und 1000 ms sind die Werte des Eigentümers. Die Zeit, die ein KST-Servo ohne Spannung braucht, um den Programmiermodus zu verlassen, die Zeit, die es zum Starten braucht, und die Versorgungsspannung, die es im Programmiermodus annimmt, sind nicht gemessen. Ebenso wenig die Zeit, die der PD mini zum Schalten braucht.
Antwortet kein PD mini, fasst der Port keine Versorgung an. Die Session läuft, Bit 10 liest 0, POWER_CYCLED ist das Wort des Bedieners, dass das Servo ohne Spannung war, und bringt den Port sofort nach PWM, und REBOOT wird mit NO_SUPPLY abgewiesen. REBOOT wird ebenso abgewiesen, solange der PD mini aus angefordert ist.
Solange der Port nicht in PWM steht, ist Bit 11 der Flags von SUPPLY gesetzt (seit 4.13), und SUPPLY weist jedes Schreiben seiner Register 4 bis 6, das kein OFF ist, mit BAD_VALUE ab: ein ON eines Ausgangs, der aus ist, und jede Änderung der Spannung oder der Stromgrenze, nach oben oder unten (seit 4.15; 4.13 und 4.14 weisen nur ein ON und ein Heben der Spannung ab). Ein Schreiben mit OUTPUT 0 wird als OFF angenommen, welche Sollwerte auch mitkommen, und die Seite behält die Sollwerte, die sie hatte. Ein Schreiben, das einen Ausgang, der an ist, mit den geltenden Sollwerten wiederholt, wird angenommen. Der Port schaltet den Ausgang nicht ein, solange eine eben geschriebene Verdrahtung der Versorgung noch nicht im Flash ist.
Ein OFF, das an SUPPLY geschrieben wird, oder ein verlorener Heartbeat,
während eine Operation des Ports läuft, liest in OUTPUT sofort 0 und
erreicht den PD mini, wenn der Port seinen Frame abgebrochen hat und keine
Operation läuft, spätestens 12 ms danach (SUPPLY_PAGE_OFF_WAIT_MS, seit
4.15). Der Port sieht OUTPUT 0 in seinem nächsten Durchlauf und beendet die
Operation. Ein Ausgang, den der PD mini selbst abschaltet, wird nicht
verzögert. Die Zeit, die der Ausgang des PD mini nach dem Kommando zum
Abfallen braucht, ist nicht gemessen.
Der Koprozessor schaltet keine Ausgangsbank auf ARMED, solange ein Programmierport nicht in PWM steht: das Register ARM wird angenommen, und die Bank bleibt SAFE, bis der Port wieder in PWM steht. ENTER wird mit BUSY abgewiesen, solange die Bank ARMED ist (beides seit 4.15).
Wo die Versorgung endet, wenn etwas ausfällt:
| Ereignis | Die Versorgung | Der Port |
|---|---|---|
| Der PD mini antwortet bei ENTER nicht | unberührt | die Session läuft wie an einem Prüfstand ohne einen |
| Der PD mini antwortet nicht mehr oder liest in LOW nicht innerhalb von 3000 ms wie angefordert | aus angefordert, wenn dieses ENTER sie eingeschaltet hat, sonst an gelassen, auf der niedrigeren Spannung, wenn dieses ENTER sie gesenkt hat | PWM, Ergebnis 32 |
| Die bereitgestellte Spannung ist außerhalb des Bereichs | unberührt | ENTER mit SUPPLY_RANGE abgewiesen |
| Die Spannung der Session liegt unter 4800 mV | unberührt | ENTER mit SUPPLY_LOW abgewiesen |
| Die Versorgung liest aus oder ist aus angefordert in PROGRAMMING (das Panel, ein verlorener Heartbeat, der eigene Schutz des PD mini) | 2000 ms aus gehalten, nicht wieder eingeschaltet | die Operation endet, ein Frame auf der Leitung wird beendet; PWM mit gelöschtem Bit 4, Ergebnis 19 |
| Die Versorgung liest nicht innerhalb von 3000 ms nach Beginn eines Aus-Ein-Ablaufs aus | aus angefordert | aus PROGRAMMING: wieder PROGRAMMING, Bits 4 und 5 bleiben, Ergebnis 32. Aus PWM: PWM, Ergebnis 32 |
| Der Heartbeat ist verloren oder der Link still in RAIL_OFF | bleibt aus | PWM mit gelöschtem Bit 4, Ergebnis 19 |
| Die Versorgung liest in RAIL_WAIT nicht innerhalb von 3000 ms an | aus angefordert | PWM, Ergebnis 32 |
| Die Versorgung ist in RAIL_WAIT aus angefordert (das Panel, ein verlorener Heartbeat) | aus | PWM, Ergebnis 19 |
Die Versorgung endet aus, wann immer kein Panel da ist, das sie ausschalten könnte: SUPPLY schaltet den PD mini aus, wenn der Heartbeat endet, und der Port schaltet nichts ein, solange dem Heartbeat nicht vertraut wird. Ein Servo ohne Spannung ist in keinem Modus; ein Port, der so nach PWM zurückkehrt, hat also Bit 4 gelöscht.
LEAVE (Operation 10, seit 4.15) bringt einen Port von PROGRAMMING nach PWM zurück, mit der Versorgung, wie sie ist. Der Port sendet keinen Frame, schaltet nichts und schreibt keinen Sollwert. Ein Ausgang, der an ist, bleibt an, mit seiner Spannung und seiner Stromgrenze, auch einer, den ENTER eingeschaltet oder abgesenkt hat. Antwortet kein PD mini, tut der Port dasselbe. POWER_CYCLED und REBOOT bleiben, wie sie sind.
Ein angenommenes LEAVE setzt den Port in LEAVING. Der Leitungstreiber hält
den Pin für die Wartezeit aus Schreibregister 28 (LEAVE_MS) auf Low, 0 bis
10 000 ms, gezählt ab dem Kommando. Die Wartezeit ist 100 ms, bis ein Panel
das Register schreibt, und das Register behält das Geschriebene bis zum
Neustart des Koprozessors. Das Register nimmt jeden Wert: ein LEAVE, das
mehr als 10 000 darin findet, wird mit LEAVE_MS abgewiesen, der Port bleibt
in PROGRAMMING, und der Wert wird nicht begrenzt. Ein Schreiben des
Registers, während der Port wartet, gilt für das nächste LEAVE. Nach der
Wartezeit hat der Generator den Pin, der Port steht in PWM mit gelöschten
Bits 4 und 5 und Ergebnis 0, und der Puls des Ports ist zurück, wie sein
PWM-Bit und TARGET es sagen. Eine Wartezeit von 0 ms endet beim nächsten
Durchlauf der Hauptschleife. Die verbleibende Zeit steht nicht auf der
Page: alle 32 Leseregister sind belegt. Ein Panel zählt sie mit seiner
eigenen Uhr.
Nicht gemessen an einem KST- oder Chaservo-Servo: die Zeit, die die Leitung vor dem ersten PWM-Puls auf Low sein muss, ob das Servo im Programmiermodus PWM folgt, und ob ein geschriebener Wert vor dem nächsten Einschalten des Servos wirkt. Ein gelöschtes Bit 4 nach einem LEAVE sagt, dass der Port keine Session hält. Es sagt nicht, dass das Servo den Programmiermodus verlassen hat.
| Der Port beim Kommando | LEAVE |
|---|---|
| dem Heartbeat wird nicht vertraut oder der Link schweigt, in jedem Zustand | abgewiesen mit UNSAFE |
| PWM | abgewiesen mit NOT_PROGRAMMING |
| STOPPING, LOW, RAIL_OFF, RAIL_WAIT, LEAVING | abgewiesen mit BUSY; eine laufende Wartezeit beginnt nicht neu |
| PROGRAMMING, eine Operation läuft oder plant | abgewiesen mit BUSY. Die Operation läuft weiter; ABORT beendet sie |
| PROGRAMMING, ein anderer Port genannt | abgewiesen mit PORT |
| PROGRAMMING, Bit 5 gesetzt | abgewiesen mit MUST_READ: eine unterbrochene Session wird nicht verlassen, bevor ein READ_ALL gelungen ist |
| PROGRAMMING, Bit 9 gesetzt | abgewiesen mit LOCKED: ein Servo, das ein Schreiben im Zweifel gelassen hat, wird mit RESTORE und dann LEAVE verlassen, oder durch Aus- und Einschalten der Versorgung |
| PROGRAMMING, Register 28 über 10 000 | abgewiesen mit LEAVE_MS |
| PROGRAMMING, nichts davon | angenommen: LEAVING, Bit 3 gesetzt, Ergebnis 1 |
Ein abgewiesenes LEAVE ändert nichts: kein Frame, kein Kommando an die Versorgung, der Pin und der Zustand wie zuvor.
| In LEAVING | Die Versorgung | Der Port |
|---|---|---|
| Die Wartezeit endet | wie sie ist | PWM mit gelöschten Bits 4 und 5, Ergebnis 0 |
| ABORT | wie sie ist | PROGRAMMING mit Ergebnis 19, die Session, wie LEAVE sie vorfand, Bit 5 nicht gesetzt |
| Ein Schalten auf SAFE | wie sie ist | PROGRAMMING mit Ergebnis 19 und gesetztem Bit 5 |
| Der Heartbeat verloren oder der Link schweigt, kein PD mini antwortet | unberührt | PROGRAMMING mit Ergebnis 19 und gesetztem Bit 5 |
| Die Versorgung liest aus oder ist aus angefordert (das STOP des Panels, ein verlorener Heartbeat, der eigene Schutz des PD mini) | 2000 ms aus gehalten, nicht wieder eingeschaltet | RAIL_OFF, dann PWM mit gelöschten Bits 4 und 5 und Ergebnis 19 |
| Der PD mini antwortet nicht mehr | unberührt | die Wartezeit läuft weiter |
| Jedes andere Kommando | wie sie ist | abgewiesen mit BUSY |
Ein Stopp in dem Durchlauf, in dem die Wartezeit endet, kommt zuerst: der Port steht in PROGRAMMING.
Ein Lesen gibt diese Register:
| Register | Name | Liest |
|---|---|---|
| 0 | STATE |
Bits 0 bis 2 der Zustand. Bit 3 eine Operation läuft. Bit 4 ein Frame wurde gesendet, seit das Servo zuletzt ohne Spannung war oder der Port zuletzt mit LEAVE verlassen wurde. Bit 5 ein Stopp oder ein Abbruch hat die Session unterbrochen: READ_ALL kommt vor allem anderen. Bit 6 ein Image ist gelesen. Bit 7 die Session hält ein Backup. Bit 8 das Image hat das bekannte Layout. Bit 9 nur RESTORE wird angenommen. Bit 10 ein PD mini antwortet, und der Port schaltet die Versorgung des Servos. Bit 11 die Register 16 bis 31 zeigen das Backup. Bits 12 bis 15 der Programmierport |
| 1 | SEQ |
die SEQ des zuletzt angenommenen Kommandos; 0 beim Start |
| 2 | OP |
Bits 12 bis 15 die zuletzt gestartete Operation, 0 beim Start und bis eine Operation startet; ein abgewiesenes Kommando lässt sie stehen. Bits 0 bis 11 die Frames, die sie gesendet hat, gehalten bei 4095 |
| 3 | LINK_KS_RESULT |
Low-Byte das Ergebnis dieser Operation, 1 solange sie läuft, 35 solange ein WRITE oder ein RESTORE plant (seit 4.14). High-Byte der Grund, aus dem das zuletzt angenommene Kommando nichts gestartet hat, 0 wenn es gestartet hat |
| 4 | LINK_KS_FAIL |
Low-Byte das Servoregister, das das Ergebnis nennt, 0xFF für keines. High-Byte die erledigten Schreibzugriffe des Plans |
| 5, 6 | DIFF |
Bit n: Servoregister n weicht von dem ab, was die Operation erwartet hat. Register 5 hält die Servoregister 0 bis 15 |
| 7, 8 | BAD |
Bit n: Servoregister n hat keine 3 gleichen Lesungen in 5 |
| 9 | FP_RULES |
Bit n: Regel n des Layout-Fingerprints ist verletzt |
| 10, 11 | FP_REGS |
Bit n: Servoregister n weicht vom Fingerprint ab |
| 12, 13 |
HALF_MIN_NS, HALF_MAX_NS
|
die kürzeste und die längste Halbzelle, gemessen an den Antworten des Servos, seit der Port den Pin genommen hat, ns; 0 vor der ersten Antwort |
| 14, 15 |
DELAY_MIN_US, DELAY_MAX_US
|
die letzte Flanke eines Lese-Frames bis zur ersten Flanke seiner Antwort, µs; 0 vor der ersten |
| 16 bis 31 | IMAGE |
Servoregister 2 k im Low-Byte von Register 16 + k, 2 k + 1 im High-Byte. Das zuletzt gelesene Image, oder das Backup, solange VIEW 1 ist; 0 solange es keines gibt |
Ein Schreiben sieht andere Register:
| Register | Name | Nimmt |
|---|---|---|
| 0 | CMD |
Bits 0 bis 3 die Operation, Bit 6 gesetzt: das Kommando nennt einen Programmierport (seit 4.13), Bit 7 die Bestätigung eines ungeprüften Restore (nur RESTORE), Bits 8 bis 11 der Port; jedes andere Bit 0 |
| 1 | SEQ |
die SEQ der Page plus 1, modulo 65536 |
| 2 | KEY |
0x57A5 für WRITE, RESTORE und RELEASE, sonst 0 |
| 3 | CRC |
die Prüfsumme über die Register 4 bis 24, für WRITE, RESTORE, RELEASE und VERIFY; für die anderen nicht angesehen |
| 4 bis 19 | IMAGE |
gepackt wie die Register 16 bis 31 des Lesens: das Ziel eines WRITE, das Backup eines RESTORE, das Image, das ein VERIFY erwartet |
| 20 bis 23 | UNLOCK |
Low-Wort zuerst: die Felder, die ein WRITE über die editierbare Klasse hinaus ändern darf, Bit n für Feld n von kst_field_id_t
|
| 24 | START_CRC |
die Prüfsumme über die 16 Register des Images, von dem das Panel geplant hat, wie das Lesen sie gab |
| 25 | VIEW |
0: die Register 16 bis 31 des Lesens zeigen das zuletzt gelesene Image. 1: das Backup. Gilt ab dem Schreiben |
| 26 | SUPPLY_MV |
die Versorgungsspannung eines ENTER, mV (seit 4.13). Der Standard des Panels ist 5000 |
| 27 | SUPPLY_MA |
die Stromgrenze eines ENTER, das die Versorgung einschaltet, mA (seit 4.13) |
| 28 | LEAVE_MS |
die Wartezeit eines LEAVE mit der Leitung auf Low, 0 bis 10 000 ms (seit 4.15). 100, bis es geschrieben wird |
Die Prüfsumme ist die CRC-16 (zyklische Redundanzprüfung) des Links,
Startwert 0xFFFF, über das Low-Byte und dann das High-Byte jedes Registers
(link_kst_crc()).
Die Register 0 bis 3 sind das Kommando: ein Frame, geschrieben als genau
diese 4 Register und ganz oder gar nicht angenommen. Die Register 4 bis 28
werden in beliebigen Fenstern vor dem Kommando geschrieben. Ein Schreiben,
das Register 29 oder höher erreicht, wird mit READ_ONLY abgewiesen, ein
Fenster, das die Register 0 bis 3 berührt und nicht genau sie ist, mit
BAD_RANGE. Ein Kommando mit einem reservierten Bit, einer Operation
außerhalb von 1 bis 10, der Bestätigung an einer anderen Operation als
RESTORE, einem KEY, der weder 0 noch 0x57A5 ist, oder einer SEQ, die
nicht die der Page plus 1 ist, wird mit BAD_VALUE abgewiesen und ändert
nichts. Der zuletzt angenommene Frame, noch einmal gesendet, wird quittiert
und tut nichts; ein Kommando, dessen Antwort verloren ging, wird also
unverändert noch einmal gesendet. Nach einem Abbruch am Panel wird es nicht
noch einmal gesendet: das Panel liest die Register 0 bis 3. Die SEQ vor
dem Kommando heißt, dass es nicht angenommen wurde; die Anfrage gilt dann
als verworfen. Die SEQ des Kommandos heißt nur zusammen mit seiner
Operation in OP oder einer Abweisung im oberen Byte von
LINK_KS_RESULT, dass es angenommen wurde. Jede andere SEQ ist ein
Koprozessor, der neu gestartet ist. Ein neu gestarteter Koprozessor liest
SEQ 0, Operation 0 und keine Abweisung. Operation 0 nach einem Lesen,
das eine Operation nannte, ist ein Neustart bei jeder SEQ, auch bei der
des Kommandos und der davor: die SEQ 0 einer frischen Page ist nach
SEQ 0xFFFF die des Kommandos und nach SEQ 0 die davor, und eine
frische Page nimmt ein noch einmal gesendetes Kommando mit SEQ 1 als ihr
eigenes nächstes an. Das Panel meldet dann einen Neustart und kein
Ergebnis. Ein Koprozessor, der seit seinem Start kein Kommando angenommen
hat, liest vor und nach einem Neustart SEQ 0 und Operation 0: startet er
zwischen seinem ersten Kommando und diesem Lesen neu, gilt die Anfrage als
verworfen. Von solchen ersten Kommandos starten nur ENTER und REBOOT eine
Operation; jedes Schreiben braucht PROGRAMMING, das ein ENTER startet. Ein
angenommenes Kommando wird quittiert; was aus ihm wurde, steht in
LINK_KS_RESULT.
| Operation | Wert | Tut |
|---|---|---|
| ENTER | 1 | in PWM: nimmt den Pin des Ports, setzt die Versorgung und fährt die Einstiegssequenz. In PROGRAMMING: fährt die Einstiegssequenz noch einmal |
| READ_ALL | 2 | liest die 32 Register, jedes bis 3 von höchstens 5 Lesungen übereinstimmen. Das erste Image einer Session ist ihr Backup |
| WRITE | 3 | plant vom gelesenen Image zum bereitgestellten Image, ein Slice je Durchlauf (seit 4.14), und fährt den Plan: jeder Schreibzugriff wird zurückgelesen, und einer, der nicht greift, wird rückgängig gemacht |
| RESTORE | 4 | plant zurück zum Backup, das die Session hält, und fährt den Plan. Ein bereitgestelltes Image, das nicht dieses Backup ist, beendet es mit Ergebnis 10 |
| RELEASE | 5 | löst das Pairing |
| VERIFY | 6 | liest alle Register und vergleicht sie mit dem bereitgestellten Image |
| ABORT | 7 | beendet die laufende Operation. In STOPPING und LOW kehrt der Port nach PWM zurück. In RAIL_OFF wird die Versorgung nicht wieder eingeschaltet, in RAIL_WAIT wird sie ausgeschaltet, und der Ablauf endet mit Ergebnis 19. In jedem Zustand angenommen; Register 2 nennt es nicht |
| POWER_CYCLED | 8 | in PROGRAMMING: schaltet die Versorgung aus und ein und bringt den Port nach PWM. Antwortet kein PD mini oder ist er aus angefordert: das Wort des Bedieners, dass das Servo ohne Spannung war, sofort nach PWM |
| REBOOT | 9 | schaltet die Versorgung aus und ein, in PROGRAMMING und in PWM (seit 4.13) |
| LEAVE | 10 | in PROGRAMMING ohne laufende Operation: hält die Leitung für die Wartezeit aus Register 28 auf Low und bringt den Port nach PWM zurück. Die Versorgung wird nicht geschaltet (seit 4.15) |
Das Ergebnis im Low-Byte von LINK_KS_RESULT ist das kst_ses_t der Session: 0
fertig, 1 läuft, 4 kein Servo hat geantwortet, 5 nicht im Programmiermodus,
6 ein Register ohne 3 gleiche Lesungen, 7 kein Backup, 8 das Layout ist
nicht das bekannte, 9 auf einen Restore gesperrt, 10 ein Plan, den die
Session nicht annimmt, 11 ein Restore, der die Bestätigung braucht, 12 das
Image des Servos hat sich seit dem Lesen geändert, 13 ein Schreibzugriff
hat nicht gegriffen und nichts ist geändert, 14 ein Plan rückgängig
gemacht, 15 ein Plan zum Teil rückgängig gemacht, 16 ein Register hat sich
geändert, das der Plan nicht geschrieben hat, 17 das Image weicht nach dem
Plan ab, 18 der Leitungstreiber ist ausgefallen oder ließ sich nicht
öffnen, 19 abgebrochen. 32 bis 35 sind die eigenen des Ports. 32 (seit
4.13): die Versorgung hat nicht rechtzeitig geschaltet. 33 (seit 4.14):
keine Reihenfolge von Schreibzugriffen hält jedes Image dazwischen gültig.
34 (seit 4.14): der Planer hat 216 000 Einheiten Arbeit verbraucht, bevor er
einen Plan hatte oder wusste, dass es keinen gibt. 35 (seit 4.14): die
Operation plant; es ist nie das Ergebnis einer beendeten Operation.
| Abweisung | Wert | Das Kommando hat nichts gestartet, weil |
|---|---|---|
| BUSY | 1 | eine Operation läuft oder der Port zwischen zwei Zuständen ist |
| PORT | 2 | der Build keinen solchen Programmierport hat, dem Kommando Bit 6 fehlt oder der Port nicht der in PROGRAMMING ist |
| UNSAFE | 5 | dem Heartbeat nicht vertraut wird oder der Link still ist |
| NOT_PROGRAMMING | 6 | der Port in PWM steht |
| NO_ENABLE | 7 | WRITE, RESTORE oder RELEASE ohne den Key |
| STAGED | 8 | die Register 4 bis 24 nicht die Prüfsumme haben, die das Kommando nennt |
| START | 9 | das gelesene Image nicht das ist, von dem das Panel geplant hat |
| MUST_READ | 10 | ein Stopp oder ein Abbruch die Session unterbrochen hat und seitdem kein READ_ALL gelungen ist |
| NO_IMAGE | 11 | kein Image gelesen ist, von dem geplant werden kann |
| PLAN_RULES | 12 | das Ziel eine harte Regel verletzt |
| PLAN_R00 | 13 | das Ziel in Servoregister 0x00 abweicht |
| PLAN_PAIRING | 14 | ein WRITE in Servoregister 0x1D abweicht |
| PLAN_NO_PATH | 15 | keine Reihenfolge von Schreibzugriffen jedes Image dazwischen gültig hält (nur 4.12 und 4.13; seit 4.14 Ergebnis 33) |
| NO_PIN | 16 | der Port keinen Pin hält, bei einem ENTER und bei einem REBOOT in PWM (seit 4.13) |
| SUPPLY_RANGE | 17 | die bereitgestellte Versorgungsspannung oder der Strom außerhalb dessen liegt, was ENTER nimmt (seit 4.13) |
| NO_SUPPLY | 18 | ein REBOOT, bei dem kein PD mini antwortet oder der PD mini aus angefordert ist (seit 4.13) |
| LEAVE_MS | 19 | ein LEAVE mit mehr als 10 000 ms in Register 28 (seit 4.15) |
| LOCKED | 20 | ein LEAVE, während nur RESTORE angenommen wird (seit 4.15) |
| SUPPLY_LOW | 21 | ein ENTER, dessen Versorgungsspannung, die bereitgestellte oder die niedrigere eines Ausgangs, der an ist, unter 4800 mV liegt (seit 4.15) |
Die Werte 3 und 4 werden nicht gegeben. Ein Ergebnis, das die Session ohne Plan kennt (5, 7, 8, 9 und 10 bei einem RESTORE, dessen bereitgestelltes Image nicht das Backup ist), wird vor PLAN_RULES, PLAN_R00 und PLAN_PAIRING gegeben (seit 4.14): eine gesperrte Session beantwortet ein WRITE mit Ergebnis 9, gleich welches Ziel es hat. NO_ENABLE wird vor jedem anderen Grund geprüft. Das Panel sendet den Key nur, solange sein Schalter ENABLE WRITE TO SERVO an ist; ein Kommando, das den Koprozessor ohne ihn erreicht, schreibt also in keinem Zustand des Ports. Kein Bildschirm dieses Builds hält diesen Schalter.
Ein Programmierport ist per Definition bidirektional: sein Pin ist ein blanker GPIO, den der Leitungstreiber zwischen Ausgang und Eingang umschaltet. Ein Servo hinter einem Puffer, der nur ausgibt, beendet ENTER mit Ergebnis 4.
Der Port sieht drei Dinge. Ein Stopp ist die Flanke des Failsafe (der Heartbeat hat geendet oder der Link ist still geworden) oder die Flanke des Schaltens der Bank auf SAFE. Unsicher ist die Zeit, in der dem Heartbeat nicht vertraut wird oder der Link still ist. Das dritte ist die Versorgung: SUPPLY schaltet den PD mini aus, wenn der Heartbeat endet, und das Panel schreibt den Ausgang von SUPPLY bei jedem STOP aus.
Das STOP des Panels ist am Koprozessor deshalb drei Dinge: ein Schalten
einer Bank von ARMED auf SAFE, der Ausgang von SUPPLY auf 0 geschrieben und das
Kommando ABORT aus kst_link_abort().
| Zustand | Ein Schalten auf SAFE allein | Das STOP des Panels | Heartbeat verloren, Link still |
|---|---|---|---|
| PWM | der Puls endet, wie an jedem Ausgang. Die Versorgung bleibt, wie sie ist | der Puls endet, und die Versorgung ist aus | der Puls endet. SUPPLY schaltet den PD mini aus |
| STOPPING, LOW | der Port kehrt mit Ergebnis 19 nach PWM zurück. Eine Versorgung, die dieses ENTER eingeschaltet hat, wird ausgeschaltet; eine an vorgefundene bleibt an | dasselbe, und die Versorgung ist aus | dasselbe, und SUPPLY schaltet den PD mini aus |
| PROGRAMMING | die laufende Operation endet mit Ergebnis 19: ein Frame auf der Leitung wird beendet, was höchstens 12 ms dauert, und kein weiterer beginnt. Der Pin ist danach auf Low getrieben oder Eingang. Nach einem ersten Frame wird Bit 5 gesetzt, und der Port bleibt PROGRAMMING; davor kehrt der Port nach PWM zurück. Die Versorgung bleibt an | die Operation endet ebenso. Die Versorgung ist aus: der Port hält sie 2000 ms aus und kehrt mit gelöschten Bits 4 und 5 und Ergebnis 19 nach PWM zurück. Antwortet kein PD mini, bleibt der Port PROGRAMMING mit gesetztem Bit 5 | wie das STOP des Panels |
| RAIL_OFF | nichts: der Ablauf geht weiter | die Versorgung bleibt aus; nach den 2000 ms steht der Port mit Ergebnis 19 in PWM | wie das STOP des Panels |
| RAIL_WAIT | nichts: der Ablauf geht weiter | die Versorgung wird ausgeschaltet; der Port steht mit Ergebnis 19 in PWM | wie das STOP des Panels |
| LEAVING | die Wartezeit endet mit Ergebnis 19, und der Port steht in PROGRAMMING mit gesetztem Bit 5. Die Versorgung bleibt an | die Wartezeit endet genauso. Die Versorgung ist aus: der Port hält sie 2000 ms aus und kehrt mit gelöschten Bits 4 und 5 und Ergebnis 19 nach PWM zurück. Antwortet kein PD mini, bleibt der Port in PROGRAMMING | wie das STOP des Panels |
Solange Bit 5 gesetzt ist, nimmt der Port nur ENTER, READ_ALL, ABORT, POWER_CYCLED und REBOOT, bis ein READ_ALL gelungen ist. ABORT allein hat in STOPPING, LOW und PROGRAMMING die Wirkung eines Schaltens auf SAFE. In LEAVING bringt es den Port ohne Bit 5 nach PROGRAMMING zurück.
Eine Operation, die plant, ist eine Operation in PROGRAMMING, und die Zeile oben gilt für sie: ein Schalten auf SAFE, das STOP des Panels, ein verlorener Heartbeat, ein stiller Link, ein ABORT und eine aus vorgefundene Versorgung beenden das Planen im nächsten Durchlauf mit Ergebnis 19. Kein Frame wurde gesendet und kein Register geschrieben, und die Session ist nicht gesperrt. Bit 5 ist gesetzt wie nach einem abgeschnittenen Frame, weil die Session Frames gesendet hat, bevor sie plante. Die Versorgung bleibt nach einem Schalten auf SAFE oder einem ABORT allein an. Nach dem STOP des Panels, einem verlorenen Heartbeat oder einem stillen Link ist sie aus, und wenn ein PD mini antwortet, hält der Port sie 2000 ms aus und kehrt mit gelöschten Bits 4 und 5 nach PWM zurück. POWER_CYCLED und REBOOT beenden das Planen und laufen dann. Jedes andere Kommando wird mit BUSY abgewiesen, und das Planen geht weiter. Ein PD mini, der nicht mehr antwortet, beendet es nicht.
Ein Schalten auf SAFE wird als Flanke gesehen: der Port stoppt einmal und nimmt wieder Kommandos, während die Bank SAFE bleibt; ein Servo wird also an einem Prüfstand in SAFE gelesen und geschrieben. Solange dem Heartbeat nicht vertraut wird oder der Link still ist, beginnt kein Frame, und jede Operation außer ABORT und POWER_CYCLED wird mit UNSAFE abgewiesen.
Ein Link, der in RAIL_OFF verloren geht, lässt die Versorgung aus und den Port in PWM: ohne Panel am Link könnte niemand die Versorgung wieder ausschalten, und ein Servo, das 2000 ms ohne Spannung war, hat den Programmiermodus verlassen, wenn 2000 ms genügen, was nicht gemessen ist. Das Panel schaltet die Versorgung auf SUPPLY wieder ein.
| Panel | Koprozessor | Servo-Programmier-Page (KST, 0x32) |
|---|---|---|
| 4.15 oder neuer | 4.15 oder neuer | bedient |
| 4.15 oder neuer | 4.14 | bedient ohne LEAVE. Ein 4.14-Koprozessor weist die Operation 10 mit BAD_VALUE und ein Schreiben auf Register 28 mit READ_ONLY ab: das Modul des Panels sendet keines von beiden und beantwortet die Anfrage mit KST_LINK_START_NO_OP. POWER_CYCLED und REBOOT sind die Wege hinaus |
| 4.14 | 4.15 oder neuer | bedient. Das Panel sendet keine Operation 10 und kein Register 28, und der Port steht nie in LEAVING |
| 4.14 oder neuer | 4.13 | bedient, ab 4.15 ohne LEAVE wie oben. Der Koprozessor plant im Frame des Kommandos: das Modul des Panels meldet nie PLANNING, und ein Auftrag ohne Reihenfolge von Schreibzugriffen ist die Abweisung PLAN_NO_PATH |
| 4.13 | 4.14 oder neuer | bedient. Das Modul des Panels liest eine Operation, die plant, als eine, die läuft, und die Ergebnisse 33 und 34 als Ergebnisse, für die es keinen Namen hat |
| 4.13 oder neuer | 4.12 | die Page nennt dort einen Ausgangskanal; das Modul des Panels liest die Minor beim Link-up und sendet unter 13 nichts, kein Schreiben und kein Lesen |
| 4.13 oder neuer | 4.11 oder älter | keine Page: der Koprozessor beantwortet eine Anfrage an 0x32 mit BAD_PAGE, und das Panel sendet keine |
| 4.12 | 4.13 oder neuer | ein Kommando von 4.12 hat Bit 6 gelöscht und wird mit PORT abgewiesen; ein Schreiben auf Register 26 oder 27 kommt nie. Der Port bleibt in PWM |
| 4.11 oder älter | 4.13 oder neuer | das Panel liest und schreibt 0x32 nie; der Port bleibt in PWM |
shared/bench/kst_link.c ist die Hälfte des Panels. Eine Anfrage nennt den
Port, für ENTER Spannung und Strom der Versorgung und für LEAVE die
Wartezeit, die das Modul über 10 000 ms abweist, bevor etwas gesendet wird.
Es stellt die
Register bereit, sendet das Kommando mit der nächsten SEQ, liest die
Register 0 bis 3 alle 50 ms, solange eine Operation läuft oder der Port
nicht in PWM steht, und sonst alle 500 ms (eine Anfrage und ein Daten-Frame,
0,31 ms Buszeit), und liest nach einer Operation die Register 4 bis 15, das
Backup und das Image. Seine Phase ist PLANNING, solange die zuletzt
gelesene Page Bit 3 gesetzt und Ergebnis 35 hat, und RUNNING vor dem ersten
Lesen und ab dem Plan. Es sendet ein Kommando bis zu 3-mal noch einmal, wenn
keine Antwort kommt, nach kst_link_abort() kein Mal, und liest SEQ nach einer Abweisung mit BAD_VALUE neu.
Nach einem abgewiesenen ABORT behält dieses Lesen die Prüfungen von oben:
eine Page abseits der SEQ des Panels oder mit Operation 0 nach einem
Lesen, das eine nannte, beendet die laufende Operation als neu gestartet,
nie als erledigt. Ein mit BAD_VALUE abgewiesenes ABORT geht nach dem Lesen
noch einmal, mit der SEQ der Page.
Ein mit BAD_PAGE abgewiesenes Lesen der Register 0 bis 3 heißt: ein
Koprozessor ohne die Page; mit jedem anderen Code abgewiesen zählt es als
unbeantwortet und wird erneut gesendet. Bei einem Koprozessor ohne die Page
behält das Modul für den Aufrufer, ob der Port beim letzten beantworteten
Lesen außerhalb von PWM war. Jede Anfrage hat eine Nummer, und ihr Ergebnis
trägt diese Nummer.
Es weist WRITE, RESTORE und RELEASE ohne den Schalter des Aufrufers ab,
bevor etwas gesendet wird. shared/bench/supply_link.c nimmt ein Kommando,
das der Port auf SUPPLY hinterlassen hat, als das angeforderte und schreibt
sein eigenes nicht darüber (supply_link_adopted()). Der Programmierer des
SERVO-Bildschirms ist der Aufrufer
(Servo-Programmierer).
test_kst_port fährt den Port und die Page gegen das Servo- und das
Versorgungsmodell: jeden Übergang und jede Abweisung, einen Stopp in jedem
Zustand und mitten in einem Frame, ein Schreiben, das 864 Durchläufe lang
mit je einem Slice plant, ein ABORT, ein Schalten auf SAFE, einen verlorenen
Heartbeat, eine abgeschaltete Versorgung, ein POWER_CYCLED, ein REBOOT und
ein zweites Kommando während des Planens, einen Auftrag ohne Reihenfolge
von Schreibzugriffen, einen über der Arbeitsgrenze, ein Schreiben ohne den
Key, einen PD
mini, der fehlt, langsam ist, schweigt oder ablehnt, ein ABORT in RAIL_OFF
und in RAIL_WAIT, die Versorgung an vorgefunden über, auf und unter der
Programmierspannung, einen Link, der in RAIL_OFF und in RAIL_WAIT verloren
geht, die Zähler an ihren Enden und jeden Timer über den Überlauf bei 2^32 ms.
Für LEAVE fahren sie das Kommando in jedem Zustand, mit einem PD mini, der
an ist, vom Einstieg eingeschaltet ist, schweigt und fehlt, während eines
Frames und während der Port plant, mit gesetztem Bit 5 und gesetztem Bit 9,
Wartezeiten von 0, 1, 100 und 10 000 ms, die Abweisung bei 10 001 ms, und
ein ABORT, ein Schalten auf SAFE, einen verlorenen Heartbeat und eine
abgeschaltete Versorgung in der Wartezeit. test_kst_link fährt das
Modul des Panels durch den Dispatcher gegen den Port: ganze Sessions, ein
Schreiben von PLANNING bis zum Ende, die Ergebnisse 33 und 34, einen
Abbruch und einen Stopp während des Planens, ein LEAVE mit seiner
Wartezeit und eines, das in der Wartezeit abgebrochen wird,
verlorene Antworten, eine veraltete SEQ, einen Neustart des Koprozessors
und einen 4.14-, einen 4.13-, einen 4.12- und einen 4.11-Koprozessor.
rcbench
English
Using the bench
- What this is for
- Building
- Bringing up the link
- First run on hardware
- Screens
- Balancing
- Servo procedures
- Servo programmer for KST and Chaservo servos
- Stick programming
- Receiver buses
- Safety
- Parameters of ESCs with BLHeli_32 firmware
Reference
- The link
- The programming port for KST and Chaservo servos
- DShot and the output drivers
- The OpenYGE protocol
- ESC programming profiles
- Performance
- Interface language
Deutsch
Den Prüfstand benutzen
- Worum es geht
- Bauen
- Den Link in Betrieb nehmen
- Erster Lauf auf der Hardware
- Bildschirme
- Auswuchten
- Servoverfahren
- Servo-Programmierer für KST- und Chaservo-Servos
- Stick-Programmierung
- Empfängerbusse
- Sicherheit
- Parameter von ESCs mit BLHeli_32-Firmware
Referenz