Short Protokoll Befehle
1. Befehle / Daten zum Display senden
Dieser Protokoll-Befehl überträgt Daten zum Display. Es können mehrere Grafikbefehle in ein Protokollpaket verpackt werden. Sind die Daten größer als die maximale Paketgröße können die Daten auf mehrere Pakete aufgeteilt werden. Das Modul fügt die einzelnen Datenpakete wieder zusammen.
Das Modul arbeitet mit little-endian (Intel-Format), das niederwertige Byte wird zuerst übertragen.
Modul empfängt |
DC3 0x13 |
Länge (16 Bit) 0xXX 0xXX |
Data....... 0x.... |
crc (16 Bit) 0xXX 0xXX |
Modul sendet |
ACK 0x06 |
Beispiel: #XCB20 ändert z.B. die Helligkeit auf 20%. Dazu gehört am Ende ein [LF] bzw. 0x0A als Abschlusskennung
Das Paket beginnt also mit DC3 und einer Längenangabe der Nutzdaten. Am Ende steht eine Prüfsumme (CRC16/CCITT) über das komplette Paket. Hier finden Sie einen Online-CRC-Calculator.
In Hex: 13 07 00 23 58 43 42 32 30 0A 3D CD (hier als Datei zum Download; diese kann z.B. per Drag-and-Drop einfach auf terminal.exe geschoben werden)
Beispiel: #XCB80 ändert z.B. die Helligkeit auf 80%.
In Hex: 13 07 00 23 58 43 42 38 30 0A FC 0A (hier als Datei zum Download)
2. Inhalt des Sendepuffers anfordern
Fallen Daten im Modul an, werden diese im Sendepuffer des Moduls gespeichert. Über die seriellen Schnittstellen können die Daten angefordert werden. Ob Daten verfügbar sind kann über den Pin 20 SBUF herausgefunden werden, oder aber die übergeordnete Steuerung fragt zyklisch die Daten ab (polling).
Modul empfängt |
DC4 0x14 |
Länge (16 Bit) 0x01 0x00 |
'S' 0x53 |
crc (16 Bit) 0x30 0x08 |
Modul sendet |
ACK 0x06 |
|||
Modul sendet |
DC3 0x13 |
Länge (16 Bit) 0xXX 0xXX |
Data....... 0x.... |
crc (16 Bit) 0xXX 0xXX |
3. Letztes Datenpaket wiederholen
Ist ein Empfangenes Packet des Moduls fehlerhaft (falsche Länge oder Prüfsumme) kann es erneut angefordert werden:
Modul empfängt |
DC4 0x14 |
Länge (16 Bit) 0x01 0x00 |
'R' 0x52 |
crc (16 Bit) 0x11 0x18 |
Modul sendet |
ACK 0x06 |
|||
Modul sendet |
DC3 0x13 |
Länge (16 Bit) 0xXX 0xXX |
Data....... 0x.... |
crc (16 Bit) 0xXX 0xXX |
4. Pufferinformationen anfordern
Mit diesem Befehl wird nachgefragt, ob Nutzdaten zur Abholung bereit stehen (= Pin20 SBUF) und wie voll der Empfangspuffer des Displays bereits ist.
Modul empfängt |
DC4 0x14 |
Länge (16 Bit) 0x01 0x00 |
'I' 0x49 |
crc (16 Bit) 0x4B 0xBB |
|
Modul sendet |
ACK 0x06 |
||||
Modul sendet |
DC4 0x14 |
Länge (16 Bit) 0x04 0x00 |
Sendepuffer Bytes ready (16 Bit) 0xXX 0xXX |
Empfangspuffer Bytes free (16 Bit) 0xXX 0xXX |
crc (16 Bit) 0xXX 0xXX |
5. Protokolleinstellungen
Hierüber lässt sich die maximale Paketgröße welche das Display senden darf begrenzen. Voreingestellt ist eine Paketgröße mit bis zu 2042 Byte Nutzdaten. Weiterhin lässt sich der Time-out in 1/1000s einstellen. Der Time-out spricht an, wenn einzelne Bytes verloren gegangen sind. Danach muss das gesamte Paket nochmals übertragen werden.
Modul empfängt Defaultwerte |
DC4 0x14 |
Länge (16 Bit) 0x05 0x00 |
'D' 0x44 |
Paketgröße Sendepuffer (16 Bit) 0xFA 0x07 (=2042 Byte) |
Time-out (16 Bit) in ms 0xD0 0x07 (=2 Sekunden) |
crc (16 Bit) 0x98 0xF5 |
Modul sendet |
ACK 0x06 |
6. Protokollinformationen
Abfrage der Protokolleinstellungen (siehe 5.).
Modul empfängt |
DC4 0x14 |
Länge (16 Bit) 0x01 0x00 |
'P' 0x50 |
crc (16 Bit) 0x53 0x38 |
||
Modul sendet |
ACK 0x06 |
|||||
Modul sendet |
DC4 0x14 |
Länge (16 Bit) 0x06 0x00 |
Maximale Paketgröße Sendepuffer (16 Bit) 0xFA 0x07 (=2042 Byte) |
Paketgröße Sendepuffer (16 Bit) 0xXX 0xXX |
Time-out (16 Bit) in ms 0xXX 0xXX |
crc (16 Bit) 0xXX 0xXX |
7. RS485 Adresse selektieren / deselektieren
Mit diesem Befehl lässt sich ein Modul am RS485-Bus selektieren oder deselektieren. Per Default ist ein Modul mit der Adresse 7 immer aktiv.
Modul empfängt Defaultwerte |
DC4 0x14 |
Länge (16 Bit) 0x03 0x00 |
'A' 0x41 |
'S' (=Selektieren) 'D' (=Deselektieren) 0x53 oder 0x44 |
RS485-Adresse 0xXX |
crc (16 Bit) 0xXX 0xXX |
Modul sendet |
ACK 0x06 ---- |
→ Selektieren → Deselektieren |
8. RS485 Verzögerung Enable Signal
Einige RS485 benötigen eine gewisse Zeit um das Enable-Signal zu verändern und z.B. vom schreibenden in den lesenden Modus umzuschalten. Um eine erfolgreiche Kommunikation mit diesen Geräten zu ermöglichen kann mit diesem Befehl die Umschaltung in den schreibenden Modus verzögert werden.
Modul empfängt Defaultwerte |
DC4 0x14 |
Länge (16 Bit) 0x03 0x00 |
'T' 0x54 |
Verzögerung in 10 us 0x00 0x00 |
crc (16 Bit) 0xE9 0x7E |
Modul sendet |
ACK 0x06 |
9. Schnittstelle exklusiv anfordern
Alle 4 seriellen Schnittstellen werden parallel und gleichwertig behandelt. Um zu gewährleisten, dass eine Abfolge von Protokollpaketen ohne Unterbrechung durchgeführt wird, können die anderen seriellen Schnittstellen deaktiviert werden und die Schnittelle exklusiv angefordert werden. Dies ist zum Beispiel bei einem Projektupdate über USB sinnvoll.
Modul empfängt |
DC4 0x14 |
Länge (16 Bit) 0x02 0x00 |
'G' 0x47 |
0x00 = Freigabe 0x01 = Anfordern |
crc (16 Bit) 0xXX 0xXX |
Modul sendet |
ACK 0x06 |
||||
Modul sendet |
DC4 0x14 |
Länge (16 Bit) 0x01 0x00 |
Aktiv (16 Bit) 0x00 = alle 0x01 = RS232 0x02 = SPI 0x03 = I²C 0x04 = USB |
crc (16 Bit) 0xXX 0xXX |
10. Break-Kommando, Ausführung Unterbrechen / Beenden
Falls in einem Makro eine Dauerschleife programmiert wurde oder eine Unterbechung des normalen Ablaufs gewünscht wird, kann mit diesem Befehl gezielt unterbrochen und beendet werden. Auch dieser Befehl eignet sich vor allem für Update-Vorgänge.
Modul empfängt Defaultwerte |
DC4 0x14 |
Länge (16 Bit) 0x02 0x00 |
'C' 0x43 |
break 0x01 = Wait command 0x02 = aktuelles Makrofile 0x04 = Sendepuffer löschen 0x08 = Empfangsbuffer leeren 0x10 = Makrodefiniton (z.B. Portmakros) 0xFF = Alles Unterbrechen und Beenden |
crc (16 Bit) 0xXX 0xXX |
Modul sendet |
ACK 0x06 |
11. Hardware Reset
Das Modul wird mit diesem Protokollbefehl neu gestartet. Je nach Parameter wird nach dem Reset eine andere Startoption gewählt.
Modul empfängt Defaultwerte |
DC4 0x14 |
Länge (16 Bit) 0x02 0x00 |
'B' 0x42 |
Option 0x00 = Normaler Neustart 0x01 = Neustart im Testmode 0x02 = Neustart ohne 'start.emc' 0x03 = Neustart ohne default Styles 0x04 = Bootmenü anzeigen (Projektauswahl) 0x05 = Reserved 0x06 = Mass Storage Mode (ab V1.2) |
crc (16 Bit) 0xXX 0xXX |
Modul sendet |
ACK 0x06 |
CRC-Berechnung
Für die Berechnung der Prüfsumme wird eine zyklische Redundanzprüfung (CRC) eingesetzt. Eine gängige und bekannte CRC-Prüfung ist die CRC-CCITT. Als Startwert wird 0xFFFF verwendet. Im Folgenden sehen Sie eine typische C-Implementierung. Die Funktionen müssen extern aufgerufen werden. Die Prüfsumme muss mit dem Startwert vorbelegt werden.
//----------------------------------------------------------------------------
//Funktion: buffer2crc16()
//input: ptr Datum, ptr auf CRC, Blocklänge
//output: ---
//Beschr: CRC-CCITT eines Speicherbereichs
//----------------------------------------------------------------------------
void buffer2crc16(UBYTE *dat, UINT16 *pCRC, UINT32 anz)
{
while(anz--)
crc16(*dat++, pCRC);
}
//----------------------------------------------------------------------------
//Funktion: sp_crc16()
//input: Datum, ptr auf CRC
//output: ---
//Beschr: CRC_CCITT (x^16+x^12+x^5+1 = 1 0001 0000 0010 0001 = 0x1021
//----------------------------------------------------------------------------
void crc16 (UBYTE dat, volatile UINT16 * crc)
{
register UINT16 lcrc = *crc;
lcrc = (lcrc >> 8) | (lcrc << 8);
lcrc ^= dat;
lcrc ^= (lcrc & 0xFF) >> 4;
lcrc ^= lcrc << 12;
lcrc ^= (lcrc & 0xFF) << 5;
*crc = lcrc;
}