pgmfi.org

Hacking up Honda's ECU
It is currently Fri Apr 19, 2024 4:54 pm

All times are UTC - 5 hours [ DST ]




Post new topic Reply to topic  [ 247 posts ]  Go to page Previous  1 ... 10, 11, 12, 13, 14, 15, 16, 17  Next
Author Message
PostPosted: Fri Oct 25, 2013 6:34 am 
Offline
Senior Developer

Joined: Tue Jul 27, 2004 2:19 am
Posts: 653
Location: France
Fx CKP (Hz) = Engine Speed (rpm) / 5
Fx TDC (Hz) = Engine Speed (rpm) / 30
Fx CYL (Hz) = Engine Speed (rpm) / 120

Example :
at 3000 rpm => CKP=600 Hz , TDC=100 Hz and CYL=25 Hz


PS:
CKP = 24 teeth for one engine time = 24 teeth for two crankshaft revolution or 12 teeth for one crankshaft revolution
TDC = 4 teeth for one engine time = 4 teeth for two crankshaft revolution or 2 teeth for one crankshaft revolution
CYL = 1 teeth for one engine time = 1 teeth for two crankshaft revolution or 0.5 teeth for one crankshaft revolution


Top
 Profile  
Reply with quote  
PostPosted: Fri Oct 25, 2013 7:08 am 
Offline
Senior Developer

Joined: Tue Jul 27, 2004 2:19 am
Posts: 653
Location: France
a few years ago, I started a simulator with a module Arduino Nano.
I've never finished this project.
Here is the code but not been finalized, only for a example :

Code:
//---------------------------------------//
// Générateur de signaux CKP, TDC et CYL //
//---------------------------------------//
// Didier PELEGRI                        //
//---------------------------------------//
// FxCKP = RPM * 12 / 60 = RPM / 5       //
// RPM = FxCKP * 60 / 12 = FxCKP * 5     //
//---------------------------------------//
// FxTDC = RPM * 2 / 60 = RPM / 30       //
// RPM = FxTDC * 60 / 2 = FxTDC * 30     //
//---------------------------------------//
// FxCYL = RPM * 0,5 / 60 = RPM / 120    //
// RPM = FxCYL * 60 / 0,5 = FxCYL * 120  //
//---------------------------------------//
//  300 tr/mn => FxCKP =  60 Hz          //
//            => FxTDC =  10 Hz          //
//            => FxCYL = 2,5 Hz          //
//---------------------------------------//
// 9000 tr/mn => FxCKP = 1800 Hz         //
//            => FxTDC =  300 Hz         //
//            => FxCYL =  75 Hz          //
//---------------------------------------//
 
// avr-libc library includes
#include <avr/io.h>
#include <avr/interrupt.h>
#include "avr/pgmspace.h"
 
// sequence pour simulation capteur CKP
PROGMEM prog_uchar CKP96[] = {
  0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, //  1,  2,  3,  4,  5,  6
  0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, //  7,  8,  9, 10, 11, 12
  0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, // 13, 14, 15, 16, 17, 18
  0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1  // 19, 20, 21, 22, 23, 24
};
// CKP __--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--__--
// TDC -_______________________-_______________________-_______________________-_______________________
// CYL __________________________________________________________________________________---___________

// sequence pour simulation capteur TDC
PROGMEM prog_uchar TDC96[] = {
  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 1
  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 2
  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 3
  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  // 4
//  0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 // Err
//  0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 // OK
//  0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 // OK
//  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 // OK <==
//  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 // OK
//  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 // Err
};

// sequence pour simulation capteur CYL
PROGMEM prog_uchar CYL96[] = {
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //
  0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0  // 1
//  0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 // Err 9
//  0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 // OK
//  0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 // OK
//  0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 // OK <==
//  0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0 // OK
//  0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0 // OK
//  0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0 // Err 9
};

#define LedPin 13
#define OutCKP 8
#define OutTDC 9
#define OutCYL 10
#define OutECT 11
#define OutIAT 3

byte CptData;
byte ClignLed;
long ValTempo;
long RPM;
long New_RPM;
long Old_RPM;
int PotRpmValue;

int DataRx;
boolean CmdOn = false;
boolean CmdOk = false;

int PotEctValue;
int PotIatValue;
byte PWM_ECT;
byte PWM_IAT;
byte ValCalc;
int ValCalcIn;
int ValCalcOut;


void setup()
{
    pinMode(LedPin, OUTPUT);
   
    Serial.begin(115200);
    Serial.println("Simulateur Allumeur");
    Serial.println("-------------------");
   
    pinMode(OutCKP, OUTPUT);
    pinMode(OutTDC, OUTPUT);
    pinMode(OutCYL, OUTPUT);
   
//    pinMode(OutECT, OUTPUT);
   
    Setup_Timer1(); // initialise Timer1   
}
 
void loop()
{
  if (CmdOn == false) // mode local
  {
    Old_RPM = RPM;
    PotRpmValue = analogRead(0);
    if (PotRpmValue>203)
    {
      New_RPM = map(PotRpmValue, 204, 1023, 2000, 10000);
    }
    else
    {
      if (PotRpmValue>126)
      {
        New_RPM = map(PotRpmValue, 127, 204, 1000, 2000);
      }
      else
      {
        New_RPM = map(PotRpmValue, 0, 126, 125, 1000);
      }
    }
    New_RPM = (New_RPM +24)/25;
    New_RPM = New_RPM * 25;
   
    if (Serial.available() > 0) // test si reception ordre activation commande PC
    {
      DataRx = Serial.read();
      if (DataRx == 79) // 4Fh=79="O"
      {
        CmdOn = true; // mode PC actif
        Serial.println("Commande PC=On");
      }
    }
  }
  else // si mode PC actif
  {
    if (Serial.available() > 0) // test si commande reçu
    {
      CmdOk = false; // commande non valide
      DataRx = Serial.read();
      switch (DataRx)
      {
        case 70: // 46h=70="F" // commande retour mode local
          CmdOn = false; // commande valide
          Serial.println("Commande PC=Off");
          break;
        case 43: // 2Bh=43="+" // commande increment de 50tr/mn
          if (RPM < 9949) New_RPM = RPM +50;
          CmdOk = true; // commande valide
          break;
        case 45: // 2Dh=45="-" // commande decrement de 50tr/mn
          if (RPM > 299) New_RPM = RPM -50;
          CmdOk = true; // commande valide
          break;
        case 62: // 3Eh=62=">" // commande increment de 250tr/mn
          if (RPM < 9749) New_RPM = RPM + 250;
          CmdOk = true; // commande valide
          break;
        case 60: // 3Ch=60="<" // commande decrement de 250tr/mn
          if (RPM > 449) New_RPM = RPM - 250;
          CmdOk = true; // commande valide
          break;
        default: // Erreur Cmd
          Serial.println("Erreur Commande");
      }
    }
  }
  if (CmdOn == false) // si mode local
  {
    if (New_RPM != RPM) // si nouvelle valeur de régime
    {
      RPM = New_RPM;
      Serial.print(" / Régime=");
      Serial.print(RPM);
      Serial.println("tr/mn");
      ValTempo = 1250000 / RPM;
    }
  }
  else // si commande PC
  {
    if (CmdOk == true) // si commande valide
    {
      CmdOk = false; // commande invalde
      RPM = New_RPM;
      Serial.print(" / Régime=");
      Serial.print(RPM);
      Serial.println("tr/mn");
      ValTempo = 1250000 / RPM;
    }
  }
 
//  analogWrite(OutECT, PotValue/4);
  analogWrite(OutIAT, 255-(PotRpmValue/4));
 
  PotEctValue = analogRead(0);
//  PotEctValue=770; pour test
  ValCalcIn = PotEctValue;
  ValCalc = PotEctValue / 85;
  CalcTemp();
  PWM_ECT = 255 - ValCalcOut;
  PWM_ECT=132; // avec 50 ohms
              // 0=-29,5°C
              // 1=-16,7°C
              // 2=-6,2°C
              // 3=2,4°c
              // 10=30,9°C
              // 15=41,4°C
              // 20=49,5°C
              // 30=60,9°C
              // 45=72,9°C à 73,8°C
              // 60=82,6°C
              // 75=89,6°C
              // 90=94,8°C
              // 105=9,1°C
              // 120=103,7°C
              // 135=106,9°C
              // 150=108,6°C
              // 165=110,4°C à 112,2°C
              // 180=114°C
              // 195=115,9°C
              // 210=117,8°C
              // 225=117,8°C
              // 240=119,8°C
              // 255=119,8 à 121,8°C
             
              // 0=-26,1°C et 255=119,8°C
             
  analogWrite(OutECT, PWM_ECT);

//  PotIatValue = 1023 - analogRead(0);
  PotIatValue=338;
  ValCalcIn = PotEctValue;
  ValCalc = PotIatValue / 85;
  CalcTemp();
  PWM_IAT = ValCalcOut;
  analogWrite(OutIAT, PWM_IAT);
 
  delay(100);
}
 
//******************************************************************
// timer1 setup
// set prscaler to 8, Compare mode,  16000000/8/64=31250 Hz clock
void Setup_Timer1() {
  cli();          // désactive toutes les interruptions
  TCCR1A = 0;     // registre TCCR1A = 0000 0000
  TCCR1B = 0;     // registre TCCR1B = 0000 0000
 
  OCR1A = 64; // initialisation registre de comparaison pour le comptage desiré
  TCCR1B |= (1 << WGM12); // Active le mode CTC
  // Initialise les bits CS10, CS11 et CS12 pour une division par 8 (16000000/8=2Mhz):
  //TCCR1B |= (1 << CS10);
  TCCR1B |= (1 << CS11);
  //TCCR1B |= (1 << CS12);
  TIMSK1 |= (1 << OCIE1A); // Autorise l'interruption compare du timer
  sei(); // Active toutes les interruptions
}

void CalcTemp()
{
  switch (ValCalc)
  {
    case 0:
      ValCalcOut = map(ValCalcIn, 0, 85, 206, 185);
      break;
    case 1:
      ValCalcOut = map(ValCalcIn, 85, 171, 185, 160);
      break;
    case 2:
      ValCalcOut = map(ValCalcIn, 171, 256, 160, 134);
      break;
    case 3:
      ValCalcOut = map(ValCalcIn, 256, 341, 134, 109);
      break;
    case 4:
      ValCalcOut = map(ValCalcIn, 341, 426, 109, 87);
      break;
    case 5:
      ValCalcOut = map(ValCalcIn, 426, 512, 87, 68);
      break;
    case 6:
      ValCalcOut = map(ValCalcIn, 512, 597, 68, 52);
      break;
    case 7:
      ValCalcOut = map(ValCalcIn, 597, 682, 52, 40);
      break;
    case 8:
      ValCalcOut = map(ValCalcIn, 682, 767, 40, 31);
      break;
    case 9:
      ValCalcOut = map(ValCalcIn, 767, 853, 31, 23);
      break;
    case 10:
      ValCalcOut = map(ValCalcIn, 853, 937, 23, 17);
      break;
    case 11:
      ValCalcOut = map(ValCalcIn, 937, 1023, 17, 11);
      break;
    case 12:
      ValCalcOut = 11;
      break;
  }
}

ISR(TIMER1_COMPA_vect) { // 31250 Hz
 
  OCR1A = ValTempo;
 
  digitalWrite(OutCKP, pgm_read_byte_near(CKP96 + CptData));   
  digitalWrite(OutTDC, pgm_read_byte_near(TDC96 + CptData)); 
  digitalWrite(OutCYL, pgm_read_byte_near(CYL96 + CptData)); 

  CptData++;
  if (CptData > 95) CptData=0 ;
  ClignLed++;
  if (ClignLed > 250)
  {
    //PORTB = PORTB ^ B00100000;
    ClignLed = 0;
    digitalWrite(LedPin, !digitalRead(LedPin));
    Serial.println("CKP");
  }
}


Top
 Profile  
Reply with quote  
PostPosted: Fri Oct 25, 2013 7:34 am 
Offline
Senior Developer

Joined: Tue Jul 27, 2004 2:19 am
Posts: 653
Location: France
majdi wrote:
........ generating clean sine wave signal for the ckp simulator ?
The signal is not a sine wave but a shape corresponding to that of a magnetic sensor.
The signal is symmetrical with 0 volts.
The detection is done on the rising edge and the edge must be fast as possible.

Image


Top
 Profile  
Reply with quote  
PostPosted: Fri Oct 25, 2013 12:48 pm 
Offline

Joined: Sun Oct 16, 2011 12:41 pm
Posts: 25
From what I've been reading that is correct. I've got a bag of bits from Digikey waiting for me at home, this weekend I plan on following in Darren's footsteps and pumping my square pulses through a max232 to get them up to a level the ecu can use. Madji, I'm not sure where you got that 160kHz number from, if you take a look at the toothed wheels in a distributor and do the arithmetic real quick you'll be able to see right away what you should be looking for.

If you really really want to produce a sine wave you might be able to use a pwm pulse train run through an R-C circuit to smooth it, but you may have resolution issues since you'll need to get up to around 2kHz for 9500rpm and the Arduino Uno can only run pwm up to 64kHz afaik... and if you read this thread back to page five or six you'll see that it's not reported to be necessary. I guess I'll find out this weekend.

Dip, I see what you did there with the code. I had to look up pgmspace library and the PROGMEM command as I hadn't seen them before. I was using a long string of if/else loops to allow me to be able to alter the phasing between sensors, the code was getting needlessly long, and I was starting to have interrupt error showing up in my phasing. I'm going to borrow your idea a little bit and see if it works a bit better for me. The only thing I don't see is where you called the strings in your code. I guess it might not be there, you did say it wan't finished :)


Top
 Profile  
Reply with quote  
PostPosted: Fri Oct 25, 2013 1:02 pm 
Offline

Joined: Sun Oct 16, 2011 12:41 pm
Posts: 25
BTW, here's where I'm at with my square waves. I've since pushed them through a capacitor to get them to cross zero, but haven't made any progress since then:

CKP vs TDC
Image

CKP vs CYL
Image

TDC vs CYL
Image

I need to get another probe or two for my DSO so I can run them all simultaneously. I got cheap and bought the one from Amazon and the kit wasn't as complete as the one from Seeed Studios. Live and learn.


Top
 Profile  
Reply with quote  
PostPosted: Fri Oct 25, 2013 1:12 pm 
Offline
Senior Developer

Joined: Tue Jul 27, 2004 2:19 am
Posts: 653
Location: France
spAdam wrote:
I'm not sure where you got that 160kHz number from, if you take a look at the toothed wheels in a distributor and do the arithmetic real quick you'll be able to see right away what you should be looking for.
I guess Majdi was written by mistake "Khz" instead of "Hz" because the 160 is good.


spAdam wrote:
The only thing I don't see is where you called the strings in your code.
I'll give you the explanation in the evening (in France)


Top
 Profile  
Reply with quote  
PostPosted: Fri Oct 25, 2013 1:51 pm 
Offline
Senior Developer

Joined: Tue Jul 27, 2004 2:19 am
Posts: 653
Location: France
dip wrote:
spAdam wrote:
The only thing I don't see is where you called the strings in your code.
I'll give you the explanation in the evening (in France)

:arrow:
The CKP, TDC and CYL signals are generated with Timer1.
The engine speed information can come from PC connected via USB (connected mode) to the Arduino board or a potentiometer (local mode) on analog0 entry.

PotRpmValue = analogRead (0) and after use with a table => New_RPM
or
New_RPM Cmd = PC (inc / dec slow and fast)

after
if New_RPM <> RPM => RPM = New_RPM
and ValTempo = 1250000 / RPM
and OCR1A = Valtempo = Frequency Timer1 interrupt (ISR (TIMER1_COMP_Vect))


Top
 Profile  
Reply with quote  
PostPosted: Fri Oct 25, 2013 6:25 pm 
Offline

Joined: Sat Jul 10, 2010 2:45 pm
Posts: 295
Location: New castle k.b
spAdam wrote:
BTW, here's where I'm at with my square waves. I've since pushed them through a capacitor to get them to cross zero, but haven't made any progress since then


Are you using RC Differentiator Circuit?

Attachment:
fil39.gif











http://99460.activeboard.com/t15191952/ ... r-for-ecu/


You do not have the required permissions to view the files attached to this post.


Top
 Profile  
Reply with quote  
PostPosted: Sun Oct 27, 2013 9:58 am 
Offline

Joined: Sun Oct 16, 2011 12:41 pm
Posts: 25
^No. If I was going to vary pulse width to create a digital sine wave of sorts, I would use the R-C circuit to smooth it into something useful. I did send it through a max232 yesterday, and that appears to have done to the signal what I was trying to achieve. If I grab any screenshots on the scope later, I'll post them.

I'm kind of taking a break from it right now to try and get a VSS signal working with timer1, I've been using timer0 (millis()) up until now and it's making my code clunky and giving me phase problems. It might even give me the opportunity to use the controller to do VSS at the same time as rpm, my original plan was to use a second circuit with a 555.

dip wrote:
dip wrote:
spAdam wrote:
The only thing I don't see is where you called the strings in your code.
I'll give you the explanation in the evening (in France)

:arrow:
The CKP, TDC and CYL signals are generated with Timer1.
The engine speed information can come from PC connected via USB (connected mode) to the Arduino board or a potentiometer (local mode) on analog0 entry.

PotRpmValue = analogRead (0) and after use with a table => New_RPM
or
New_RPM Cmd = PC (inc / dec slow and fast)

after
if New_RPM <> RPM => RPM = New_RPM
and ValTempo = 1250000 / RPM
and OCR1A = Valtempo = Frequency Timer1 interrupt (ISR (TIMER1_COMP_Vect))


I actually figured it out from taking a closer look at the code, it was all at the end right in front of me:

Code:
ISR(TIMER1_COMPA_vect) { // 31250 Hz
 
  OCR1A = ValTempo;
 
  digitalWrite(OutCKP, pgm_read_byte_near(CKP96 + CptData));   
  digitalWrite(OutTDC, pgm_read_byte_near(TDC96 + CptData)); 
  digitalWrite(OutCYL, pgm_read_byte_near(CYL96 + CptData)); 

  CptData++;
  if (CptData > 95) CptData=0 ;
  ClignLed++;
  if (ClignLed > 250)
  {
    //PORTB = PORTB ^ B00100000;
    ClignLed = 0;
    digitalWrite(LedPin, !digitalRead(LedPin));
    Serial.println("CKP");
  }
}


Last edited by spAdam on Sun Oct 27, 2013 9:32 pm, edited 1 time in total.

Top
 Profile  
Reply with quote  
PostPosted: Sun Oct 27, 2013 6:43 pm 
Offline

Joined: Fri Jan 05, 2007 9:10 pm
Posts: 749
Wow very cool, interesting stuff.

No comment about the code 9 error with moates engine simulator? It's 100% my board giving the error not an ecu fault. I just want to see if others can replicate my findings.

Also yesterday I had an ecu that passed on the engine sim, but solid CEL in the car (engine off ignition on)
Swapped for another ecu (same map) and the car was fine.

So something is different between testing ecu on the sim vs the car. Car=SOLID CEL. Sim= pass no problems, hit vtec everythng.

Same map.... Something is odd, I am beginning to trust the sim less and less


Top
 Profile  
Reply with quote  
PostPosted: Tue Oct 29, 2013 8:41 am 
Offline

Joined: Sun Oct 16, 2011 12:41 pm
Posts: 25
What code are you getting in the car?


Top
 Profile  
Reply with quote  
PostPosted: Fri Nov 01, 2013 12:35 pm 
Offline

Joined: Sun Oct 16, 2011 12:41 pm
Posts: 25
Didier,

After spending a few days going back and forth on ideas and looking at your code I see what I should do. Your use of the logical strings was the perfect idea, it does in one interrupt what I was trying to do in many if/else statements. If it's okay with you I'm going to use your approach as a template to get mine moving this weekend (hopefully!)


Top
 Profile  
Reply with quote  
PostPosted: Thu Nov 07, 2013 3:51 am 
Offline

Joined: Mon Jan 07, 2013 4:47 pm
Posts: 102
It would be nice if Moates actually released the source code for their simulator.


Top
 Profile  
Reply with quote  
PostPosted: Thu Nov 07, 2013 5:50 am 
Offline
Senior Developer

Joined: Tue Jul 27, 2004 2:19 am
Posts: 653
Location: France
swordofdoom wrote:
It would be nice if Moates actually released the source code for their simulator.
:shock: :shock: :shock: :shock: :shock:


They probably do not give the source of their product, as it is quite normal to protect his work.

Instead of trying to copy foolishly :arrow: try to do better yourself. 8) :wink:


Top
 Profile  
Reply with quote  
PostPosted: Thu Nov 07, 2013 8:10 pm 
Offline

Joined: Fri Jan 05, 2007 9:10 pm
Posts: 749
Quote:
What code are you getting in the car?




Didn't have time to check sorry. Wish I did. I still have the ecu so will test in another car ASAP.

Few more findings: The messy triggering at 2000-2500 which causes a code 9, can also be seen around 6700 rpm (the injectors flicker at that RPM)
It's not a map issue, all maps do it at that RPM. No code 9 from sitting at that spot though.

Lastly: Vtec soleniod feedback. I never disable this on my JDM ecu's when testing with sim and none have given a code 21 ever. (I disable VTP by hardwiring A4-D6 on all ecu's)
Last night on my USDM ecu (hardwired A4-D6 to disable VTP) I get a code 21. BUT only if I power up the sim with RPM knob set low(no rpm). If I power up the sim at say 1000rpm I never get the code and can hit vtec.
If I disable vtec soleniod feedback in gold rom, I never get the code even if powering with no rpm.

So it must be some ecu hardware differences for looking for that code (I know some ecu's have extra hardware) The JDM ecu's I am chipping must work with the sim just fine with vtec soleniod feedback.
But this P91 (USDM board layout, big case but for a JDM coupe) gives a code 21 if I power the sim with no RPM and vtec feedback enabled.

All these things cause me greif but I know it's all in how the sim is working with different ecu's.

I assume ALL of you need to disable feedback in USA to not get a code 21 with the simulator correct?


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 247 posts ]  Go to page Previous  1 ... 10, 11, 12, 13, 14, 15, 16, 17  Next

All times are UTC - 5 hours [ DST ]


Who is online

Users browsing this forum: No registered users and 10 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group