[ungelöst]Probleme mit Arduino als S88

[ungelöst]Probleme mit Arduino als S88

Postby lordbrummi » 07.10.2017, 13:25

Hallo Moba-Freunde,

Vorgeschichte:
ich habe bisher an meiner Tams MC am S88 Bus noch 6 alte S88 Module a 16 Eingänge von KC Modelltechnik.
-> Link http://www.kc-modellbahntechnik.de/mode ... C%2088.pdf

Ich fahre 3 Leiter, habe als Melder jeweils eine Masseseite des C-Gleises isoliert und gehe damit an meine S88 Module (mit Cat6 Kabel), funktioniert einwandfrei und zuverlässig.

Nun wollte ich diesen S88 Bus mit Arduino Unos erweitern.
Ich benutze dazu diesen Sketch von Ruud Boer
Link: https://rudysmodelrailway.wordpress.com ... interface/

Code: Select all
/*
S88 occupancy sensor interface to Command Station (in my case an ESU ECoS2)

Software by Ruud Boer, November 2014.
Freely distributable for private, non commercial, use.

Connections for S88 bus:
s88 pin 1 data - ARD pin 13 = dataOut
s88 pin 2 GND  to ARD GND
s88 pin 3 clock to ARD pin 2, interrupt 0
s88 pin 4 PS to ARD pin 3, interrupt 1
s88 pin 6 V+ to ARD Vin
ARD pin 12 = dataIn from next Arduino in the S88 chain

Connections for sensors: see table in void Setup().
REMARK: inputs have the internal pullup resistor active, the sensors must pull the input to GND.
*/

int clockCounter=0;
long loopCounter=0; //used in lines 55 and 88, see there for explanation
unsigned int sensors=0;
unsigned int data=0xffff;
const byte dataIn=12;  //data input from next Arduino in S88 chain
const byte dataOut=13; //data output pin=13
boolean loadSensors=false; //flag that says to load sensor bits into dataOut bits

void setup() {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0,clock,RISING); //pin 2 = clock interrupt
  pinMode(3, INPUT_PULLUP);
  attachInterrupt(1,PS,RISING);    //pin 3 = PS interrupt
  pinMode(dataIn,INPUT_PULLUP); //pin 12 = data in from next Arduino S88 in chain
  pinMode(dataOut, OUTPUT); //pin 13 = data out to ECoS or to previous Arduino in S88 chain
  digitalWrite(dataOut, LOW);   //LED off
  pinMode(A0, INPUT_PULLUP); //sensor 01
  pinMode(A1, INPUT_PULLUP); //sensor 02
  pinMode(A2, INPUT_PULLUP); //sensor 03
  pinMode(A3, INPUT_PULLUP); //sensor 04
  pinMode(A4, INPUT_PULLUP); //sensor 05
  pinMode(A5, INPUT_PULLUP); //sensor 06
  pinMode(0, INPUT_PULLUP);  //sensor 07
  pinMode(1, INPUT_PULLUP);  //sensor 08
  pinMode(4, INPUT_PULLUP);  //sensor 09
  pinMode(5, INPUT_PULLUP);  //sensor 10
  pinMode(6, INPUT_PULLUP);  //sensor 11
  pinMode(7, INPUT_PULLUP);  //sensor 12
  pinMode(8, INPUT_PULLUP);  //sensor 13
  pinMode(9, INPUT_PULLUP);  //sensor 14
  pinMode(10, INPUT_PULLUP); //sensor 15
  pinMode(11, INPUT_PULLUP); //sensor 16
  //Serial.begin(9600);  // Used for test purposes only
}

void loop() {
  if (loopCounter==20){bitSet(sensors,0);}
  /*
  For an unknown reason the ECoS sets the first 8 bits to 1 after startup / reset of the S88 Arduino's.
  When one of the sensor inputs is changed, from there on everything goes well.
  Therefore, over here we give sensor bit 0 an automatic change after 1 second.
  The 1 second is created via 'loopCounter', which increments in the PS interrupt (line 88).
  There are appr0ximately 20 PS pulses per second, therefore we use 20 in the if statement.
  */
  if (!digitalRead(A0)){bitSet(sensors,0);}
  if (!digitalRead(A1)) {bitSet(sensors,1);}
  if (!digitalRead(A2)) {bitSet(sensors,2);}
  if (!digitalRead(A3)) {bitSet(sensors,3);}
  if (!digitalRead(A4)) {bitSet(sensors,4);}
  if (!digitalRead(A5)) {bitSet(sensors,5);}
  if (!digitalRead(0)) {bitSet(sensors,6);}
  if (!digitalRead(1)) {bitSet(sensors,7);}
  if (!digitalRead(4)) {bitSet(sensors,8);}
  if (!digitalRead(5)) {bitSet(sensors,9);}
  if (!digitalRead(6)) {bitSet(sensors,10);}
  if (!digitalRead(7)) {bitSet(sensors,11);}
  if (!digitalRead(8)) {bitSet(sensors,12);}
  if (!digitalRead(9)) {bitSet(sensors,13);}
  if (!digitalRead(10)) {bitSet(sensors,14);}
  if (!digitalRead(11)) {bitSet(sensors,15);}
  //Serial.print(loopCounter); // Used for test purposes only
  //Serial.print(" - ");
  //Serial.println(sensors);
}

void PS() {
  clockCounter=0;
  data=sensors;
  sensors=0;
  loopCounter++; //Increment loopCounter to cretae a timer. See line 55 for explanation.
}

void clock() {
  digitalWrite(dataOut,bitRead(data,clockCounter));
  delayMicroseconds(16); //Delay makes reading output signal from next Arduino in chain more reliable.
  bitWrite(data,clockCounter,digitalRead(dataIn));
  clockCounter =(clockCounter +1) % 16;
}



Ich habe jetzt also mal 2 Arduinos folgendermassen verkabelt:
5V Arduino an +5V vom S88
GND Arduino an GND vom S88
Pin 2 Arduino an Clock vom S88
Pin 3 Arduino an PS vom S88

Pin 13 des 2.ten Arduinos an Pin 12 des ersten
Pin 13 des ersten Arduinos an Data S88

Ich habe nun folgende Probleme mit den beiden Arduino Rückmeldern, unabhängig davon ob die beiden Arduinos direkt am S88 Bus der Tams hängen oder ob davor noch die 6 bisherigen 6 Module von KC Modelltechnik hängen (die 6 vorderen Module funktionieren immer einwandfrei, auch wenn danach noch die 2 Arduinos im Bus hängen):

Rückmelder 1,2,5,6,9,10,13,14 funktionieren einwandfrei
Rückmelder 3 und 4 gehen immer gemeindsam an, egal ob 3 oder 4 ausgelöst wird
Rückmelder 11+12 und 15+16 gehen auch immer gemeinsam an
Rückmelder 7 löst alle anderen nach und nach aus, außerdem geht die LED TX am Arduino an
Rückmelder 8 löst auch alle anderen Rückmelder aus, und es geht die LED RX am Arduino an

Auffällig ist außerdem, das nach Spannungsversorgung der Arduinos durch den S88 Bus neben ON auch die L Led leuchtet.

Hat irgendjemand eine Idee, wo das Problem ist?

Danke und Grüße Dieter
Last edited by lordbrummi on 09.10.2017, 19:08, edited 1 time in total.
TamsMC, Servodecoder und Magnetartikeldecoder, S88 Rückmeldung, OpenCar und 3-Leiter Bahn, Win10 64bit
lordbrummi
 

[erl] Probleme mit Arduino als S88

Postby lordbrummi » 08.10.2017, 13:03

Hallo zusammen,

für alle die es interessiert:

Ich habe zwischenzeitlich im Opencar Forum Rückmeldung dazu erhalten, S88 Rückmeldung ist mit Arduino schlicht nicht möglich, da es Timing Probleme gibt (digitalWrite schlicht zu langsam).
Hardwaremäßig würde es gehen, aber (Arduino-)softwärmäßig eben nicht.

Grüße Dieter
TamsMC, Servodecoder und Magnetartikeldecoder, S88 Rückmeldung, OpenCar und 3-Leiter Bahn, Win10 64bit
lordbrummi
 

Re: Probleme mit Arduino als S88

Postby Liviu M » 08.10.2017, 15:59

Hallo Dieter,

probiert mal das
Code: Select all
delayMicroseconds(16); //Delay makes reading output signal from next Arduino in chain more reliable.
 

in der
Code: Select all
void clock()
Funktion kürzer zu machen, vielleicht klappt es doch.

Grüße,
Liviu

Tente Edith:
Sorry, zu schnell gesprochen.
Anscheinend sind die Tams Module viel langsamer als die von Ecos, deswegen wird diese Änderung wahrscheinlich nicht viel bringen.
----------------------------------------------
System: DCC N-Scale
CS: Profiboss (Loconet)
Server: RaspberryPi/OpenSuse
----------------------------------------------
Liviu M
 

Re: Probleme mit Arduino als S88

Postby Liviu M » 08.10.2017, 16:33

Hi Dieter,

laut http://www.s88-n.eu/s88-timing.html soll DataOut 1us .. 16 us NACH der fallende Flanke des Clock-Signals ausgegeben werden.
Probeweise wurde ich mit einer clock Funktion wie folgende probieren:
Code: Select all
void clock() {
  bit bIn;
  delayMicroseconds(1); //Delay before input read
  bIn = digitalRead(dataIn); //save the in data
  while(digitalRead(2)) ; //while clock (Pin2) is high do nothing

  delayMicroseconds(8); //Delay after falling edge till output change
  digitalWrite(dataOut,bitRead(data,clockCounter));
  bitWrite(data,clockCounter,digitalRead(dataIn));
  clockCounter =(clockCounter +1) % 16;
}

Mit diese Änderungen werden die Arduinos etwas "unresponsive", aber 120 - 130 us soll ein Eingangssignal noch schaffen. Falls so funktioniert, vielleicht lässt die Funktion sich optimieren.
Mehr als das, wurde ich alle Variablen, die in den PS & clock Funktionen auftauchen, als volatile definieren.

Grüße,
Liviu
----------------------------------------------
System: DCC N-Scale
CS: Profiboss (Loconet)
Server: RaspberryPi/OpenSuse
----------------------------------------------
Liviu M
 

Re: Probleme mit Arduino als S88

Postby lordbrummi » 08.10.2017, 18:02

Hallo Liviu,

danke, werde ich demnächst mal testen und berichten.

Grüße Dieter
TamsMC, Servodecoder und Magnetartikeldecoder, S88 Rückmeldung, OpenCar und 3-Leiter Bahn, Win10 64bit
lordbrummi
 

Re: Probleme mit Arduino als S88

Postby Liviu M » 08.10.2017, 18:13

Hi Dieter,

ich habe gerade getestet und bit type existiert nicht. Bitte die folgende Variante probieren, die lässt sich kompilieren:
Code: Select all
    void clock() {
      uint8_t bIn;
      delayMicroseconds(1); //Delay before input read
      bIn = digitalRead(dataIn); //save the in data
      while(digitalRead(2)) ; //while clock (Pin2) is high do nothing

      delayMicroseconds(8); //Delay after falling edge till output change
      digitalWrite(dataOut,bitRead(data,clockCounter));
      bitWrite(data,clockCounter,digitalRead(dataIn));
      clockCounter =(clockCounter +1) % 16;
    }
----------------------------------------------
System: DCC N-Scale
CS: Profiboss (Loconet)
Server: RaspberryPi/OpenSuse
----------------------------------------------
Liviu M
 

Re: Probleme mit Arduino als S88

Postby lordbrummi » 09.10.2017, 09:24

Hi Liviu,

habe gestern am späten Abend noch getestet, doch die Änderungen verschlimmbessern das Ergebnis nur.

Folgendes wurde geändert:
volatile Deklarationen:
Code: Select all
volatile int clockCounter=0;
volatile long loopCounter=0; //used in lines 55 and 88, see there for explanation
volatile unsigned int sensors=0;
volatile unsigned int data=0xffff;
const byte dataIn=12;  //data input from next Arduino in S88 chain
const byte dataOut=13; //data output pin=13
boolean loadSensors=false; //flag that says to load sensor bits into dataOut bits


clock-Routine:
Code: Select all
void clock() {

  uint8_t bIn;
  delayMicroseconds(1);
  bIn = digitalRead(dataIn);
  while(digitalRead(2));
  delayMicroseconds(8);
  digitalWrite(dataOut,bitRead(data,clockCounter));
  bitWrite(data,clockCounter,digitalRead(dataIn));
  clockCounter =(clockCounter +1) % 16;}


Ergebnis:
Folgende Melder leuchten gemeinsam auf:
1+2
3+4+5
6+7
8) alle und TX Led geht an
9) 1+7+8+9 und RX Led geht an
Nach Auslösen von 8 oder 9 wird danach kein Melder mehr erkannt!

Nach Reset noch die oberen getestet:
16+15
14+15
usw.

Das Timing Problem bleibt bestehen (ist sogar schlimmer als vorher) ;)

Werde also vermutlich die bisherigen Rückmelder auf Basis IC4044 und 4014 erweitern.

Dennoch danke für deine Hilfe.

Grüße Dieter
TamsMC, Servodecoder und Magnetartikeldecoder, S88 Rückmeldung, OpenCar und 3-Leiter Bahn, Win10 64bit
lordbrummi
 

Re: Probleme mit Arduino als S88

Postby Liviu M » 09.10.2017, 18:46

Hallo Dieter,
schade dass die änderungen nix (gutes) gebracht haben. Da ich kein Hardware zum testen habe, ist schwer bessere Ergebnise zu kriegen.

Grüße,
Liviu
----------------------------------------------
System: DCC N-Scale
CS: Profiboss (Loconet)
Server: RaspberryPi/OpenSuse
----------------------------------------------
Liviu M
 

Re: Probleme mit Arduino als S88

Postby lordbrummi » 09.10.2017, 19:08

Hallo Liviu,

lass gut sein, ich nehm wieder Rückmelder auf Basis von 4044 und 4014 ICs.

Die Arduinos haben bei mir genug zu tun, Servos steuern, Signale, Ampeln und Beleuchtungen sowie Lasten mit Mosfets und Relayboards.

Grüße Dieter
TamsMC, Servodecoder und Magnetartikeldecoder, S88 Rückmeldung, OpenCar und 3-Leiter Bahn, Win10 64bit
lordbrummi
 


Return to Arduino (DE)

cron