Pages: [1]   Go Down
Author Topic: Statement required twice for sketch to work  (Read 283 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Could someone explain why this statement has to be included twice for this sketch to work please?
The sketch just takes a character input from the USB port -using serial monitor- echos it back to the screen and displays its value on the leds -in decimal or hex.

Duplicate code highlighted in the code window like this....

//+++++++++++++++++++++++++++++++++++++++
 countNow = SerialInVal; //                           +
//+++++++++++++++++++++++++++++++++++++++

Exactly the same statement is made in the code about 5 lines above it.

But without this extra one, the leds always display  0.
I am aware that countNow is destroyed by the subsequent code. I have taken this from another sketch i was using.

Code:
/* JR 15/1/2012
  Take a character from USB port and write its value to  HP5082-7340  LED displays.
*/

//++++ found defining these where they are used in the program saves memory
//byte state;     // flag
//byte selectHex; // 0 display in decimal , 1 display in hex
//long lsn;       // least ignificant nibble  - lttle endian
int outPin;

int outPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };   
// array of pin numbers to which LEDs are attached
// pins 2,3,4,5 are display data bits 0,1,2,3
// pin  6 (Pwm)is blanking  (1 = blank)
// pin  7 is display latch  (1 = latch)


long countNow;
int SerialInVal;



void setup()
{
  // loop over the pin array and set them all to output:
  for (int pin = 0; pin < 10; pin++)
  {
    pinMode(outPins[pin], OUTPUT);
  }

  analogWrite(6,100);     // lower value = brighter display -
                          // (these displays consume a lot of current)
  pinMode(A5,INPUT);      // Pushbutton on A5 input -
  digitalWrite(A5,HIGH);  // used for selecting Decimal or Hex display

  Serial.begin(9600);

}// end of void setup


void loop()
{
  byte selectHex = !digitalRead(A5);// read state of pushbutton and invert it

  if (Serial.available())
  {

    SerialInVal = Serial.read();

    Serial.print(SerialInVal);
    Serial.print("\t");              // prints a tab
    countNow = SerialInVal;
    Serial.print(char(countNow));
    Serial.print("\t");              // prints a tab
    Serial.print(char(countNow-1));
    Serial.println("");


  }//end of if serial available


//+++++++++++++++++++++++++++++++++++++++++++++++++++++
 countNow = SerialInVal; //                           +
//+++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 

  long lsn = countNow;   
  long count = countNow;

  for (int pin = 7;pin < 12; pin++)
  {
    if (selectHex == 0)
    {  //++++++++++++++++++++++++++ convert 'lsn' to bcd for decimal display
      long temp = countNow / 10;
      lsn = countNow - (temp * 10);
      countNow = temp;
    }
    //+++++++++++++++++++++++++++ otherwise, just output 'lsn' in hex

    // output data to display 
    for (int bitValue = 0; bitValue < 4;bitValue++)
    {
      outPin = bitValue + 2; //pin is bit position + 2
      byte state = lsn & 1;
      digitalWrite( outPin,state);
      lsn = lsn >> 1;
    }

    // write to the relevent display
    digitalWrite (pin, LOW);  //enable display to read data
    digitalWrite (pin, HIGH); //latch data   

  }



}//end of void loop

Logged

I'll be glad when I've had enough!

Massachusetts, USA
Offline Offline
Tesla Member
***
Karma: 180
Posts: 8096
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The first "countNow = SerialInVal;" only gets executed when Serial.available() is true.

The second one gets executed every time through loop(), even if no new character has arrived.  It re-sets countNow to match SerialInVal, the value of the last character received.  As you say, countNow is destroyed later in the code and I guess your code expects it not to be.
Logged

Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ahh!

Yes. I've twigged now.

So the leds probably do display the data briefly, for one scan.
Then because countNow is not preserved the leds subsequently display whats left of it.
0.


Thanks again.
Logged

I'll be glad when I've had enough!

Pages: [1]   Go Up
Jump to: