AW: ID 0x400 - 0x42A
Hallo,
nach der super Hilfe hier in anderen Themen, hier mal Grundsätzliches zum einbuchen:
Die Ring-IDs im T5 sind 400 bis 41F. Byte 2 und Byte 3 sind Statusregister:
Byte 1: Adresse nächstes Steuergerät -0x400
Byte 2:
000X0000: Sleepmode 0=Nein, 1=Ja
0000000X: Aktiv 0=Nein, 1=Ja
000000X0: Init 0=Nein, 1=Ja
00010001: 11=Aktiv, Sleepmodus
00000001: 01=Aktiv, Normalmodus
00000010: 02=Inaktiv, Initialisierung
Byte3:
x0000000: Einbuchen 0=Nein, 1=JA
10000000: 80=Einbuchen
Ich gehe jetzt davon aus, das die Ring-IDs bekannt sind und man weiss wo man sich im Bus einklinken möchte.
Nehmen wir an, der Bus besteht aus folgenden Geräten und IDs ( alles HEX ):
400->401->402->403->40C->40F->41E
dann sehen die einzelnen IDs folgendermaßen aus:
ID : nächste Adresse/ID im Ring und Status XX
wobei XX sein kann: 01 für aktiv, 11 für aktiv aber bereit zum schlafen ( sleep mode ) und 02 für Initialisierung. ( siehe auch dazu Passat 3C Postings, da wird das ganze ausführlich erläutert)
YY: 80 zum einbuchen.
400: 01 XX YY 00 00 00
401: 02 XX YY 00 00 00
402: 03 XX YY 00 00 00
403: 0C XX YY 00 00 00
40C: 0F XX YY 00 00 00
40F: 16 XX YY 00 00 00 ( Sonderfall, anstatt 1E steht hier 16 als Zeig auf 41E )
41E: 00 XX YY 00 00 00
Um sich nun als z.B. 40D zwischen 40c und 40F einzubuchen, macht man folgendes:
In seinem Programm wartet man auf die vorhergehende ID, das ist zum einbuchen nicht wichtig aber da man später sowieso auf die Vorgänger ID reagieren muss, kann man das auch von Anfang an so machen:
1. Warte auf 40C
2. Schicke 40D 0D 02 80 00 00 00 ! Einbuchen als 40D
Schleife
- 3. Warte auf 40C
- 4. Schicke 40D 0F 01 00 00 00 00 ! Anworten im Ring auf 40C mit Zeige auf 40F
Ende
40C wird übrigens in folgender Reihenfolge auf das einbucgen reagieren:
40C 0F 01 00 00 00 00 : Normale Ring Antwort
40D 0D 02 80 00 00 00 : Initialisierung XX=02, 40D bucht sich ein YY=80
40C 0C 02 00 00 00 00 : 40C initialisiert sich neu XX=02
40C 0D 02 00 00 00 00 : 40C ist immer noch in der Initialisierung da xx=02 zeigt aber schon auf 40D
40C 0D 01 00 00 00 00 : 40C ist wieder im normalen Ring
Hier ein Codefragment für die CC-2:
Code:
function ring_ids() {
int canerror;
int canid;
byte scanbuf[6];
byte rcanbuf[6];
byte cmd;
byte rstat;
can.init(2,0x000,0x000);
/* 100kBit */
can_sl.selectBaudRate(3);
can.expect(3,0x0);
scanbuf[3]=0x00;
scanbuf[4]=0x00;
scanbuf[5]=0x00;
rstat=0;
loop{
// Warte auf Meldung oder Tastendruck
wait(can.rxd(3) | hwcom.rxd());
// Werte Tastendruck aus fals vorhanden
if(hwcom.rxd()){
cmd=hwcom.get();
// Beim Empfang von L/l den Login/Einbuchen einleiten
if(cmd=='L' | cmd == 'l'){
...
rstat=1;
}
else {
...
return;
}
}
canerror=can.error();
canid=can.getID(3);
can.get(3,rcanbuf);
// Nur Ring-IDs auswerten
if((canid >= 0x400) & (canid <= 0x41F)){
if(rstat>0 & canid==0x40C){
// Erstmal die normale Meldung setzten
scanbuf[0]=0x0F;
scanbuf[1]=0x01;
scanbuf[2]=0x00;
if(rstat==1){
// Nur beim ersten Mal einbuchen
scanbuf[0]=0x0E;
scanbuf[1]=0x02;
scanbuf[2]=0x80;
rstat=2;
}
// warte auf freien Kanal
wait(can.ready(5));
// Und raus damit
can.send(5,0x40E,scanbuf,6);
}
...
}
}
}
Gruss
Peter