Pages: [1]   Go Down
Author Topic: SOLVED! Problems with 16 Segment Display not displaying correct array sequence  (Read 1352 times)
0 Members and 1 Guest are viewing this topic.
UK
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi All

I am having an issue with the values in an arrays outputing to my  16 segment display.
It's for manually selecting gears on a driving game.

I am using momentary buttons in a pull down configuration to activate the increment and decrement cycle.
I have tested the sequence with a simple sketch and all the characters are present.

But when I tried increment and decrement the characters +1 and -1 respectively they skip in two's,the array should display a gear selection sequence which translates into the characters R  N 1 2 3 4 5 6 7 on the 16 Segment Display.
Example of display behaviour when upshift or decrement button is pushed:

Upshifting

R 1 3 5 7 ( Meaningless display after the last increment of 7)
or
N 2 4 6 ( Meaningless display after the last increment of 6)

Down shifting
R 1 3 5 7 ( Meaningless display after the last decrement of R)
or
N 2 4 6 ( Meaningless display after the last decrement of N)


So I believe that calling the value from the array is skewing past the array size?

Here is my code for you to have a look if you would be so kind.

By the way this is my very first Arduino project any advice or guidance would be most welcome.



Code:
int data = 1;
int latch = 2;
int clock = 3;
int switchPin19 = 47;// GEAR SELECTION Up
int switchPin20 = 48;// GEAR SELECTION Down
int gearArray[] = {
  1309L,11868L,15351L,1419L,1450L,3902L,5418L,5386L,9726L};//An Array of Decimal Values for the Alpha Numeric 16 segment display (AND) display R,N,1,2,3,4,5,6,7
int currentGear = 2;// will initialise the array staring point at 2 in the index
char val19 = digitalRead(switchPin19);
char val20 = digitalRead(switchPin20);
boolean lastButton19 = LOW;
boolean currentButton19 = LOW;

boolean lastButton20 = LOW;
boolean currentButton20 = LOW;

void setup()
{
  pinMode(data, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(clock, OUTPUT);
  pinMode(switchPin19, INPUT);
  pinMode(switchPin20, INPUT);
  updateAND(gearArray[currentGear]); // Sets the default gear on the AND - which will be "N"


}
// debounce the momentary buttons
boolean debounce19(boolean last19)
{
  boolean current19 = digitalRead(switchPin19);
  if(last19 != current19);
  {
    delay(5);
    current19 = digitalRead(switchPin19);
  }
  return current19;
}





boolean debounce20(boolean last20)
{
  boolean current20 = digitalRead(switchPin20);
  if(last20 != current20);
  {
    delay(5);
    current20 = digitalRead(switchPin20);
  }
  return current20;
}




void runDisplayCycle(long andValue)
{
  long value, valueToDisplay;
  value=0;
  // Turn all the segments off
  updateAND(0x00003FFF);
  delay(50);
  for (int i=0; i<15; i++)
  {
    value = value | (1 << i);
    valueToDisplay = andValue | (value<<14);
    updateAND(valueToDisplay);
    delay(50);
  }
}

void loop()
{

  //  GEAR UP
  currentButton19 = debounce19(lastButton19);
  if (lastButton19 == LOW && currentButton19 == HIGH) //reads the input state
    if(val19 == digitalRead(switchPin19) == HIGH)


      // DISPLAY SELECTED GEAR FROM ARRAY TO AND HERE
    {
      currentGear = (currentGear<8 ? currentGear+1 : currentGear);
      currentGear++;
      updateAND(gearArray[currentGear]);


    }

  val19 = digitalRead(switchPin19) == LOW;
  if(val19 = digitalRead(switchPin19) == LOW)
    digitalWrite (latch, HIGH);

  {
    //GEAR SHIFT DOWN
    currentButton20 = debounce20(lastButton20);//  
    if (lastButton20 == LOW && currentButton20 == HIGH) //reads the input state
      if(val20 == digitalRead(switchPin20) == HIGH)


      {
        currentGear = (currentGear>0 ? currentGear-1 : currentGear);
        currentGear--;
        updateAND(gearArray[currentGear]);  


      }
  }

  val20 = digitalRead(switchPin20) == LOW;
  if(val20 = digitalRead(switchPin20) == LOW)
    digitalWrite (latch, HIGH);
}

// Updates the Alphanumeric Display
void updateAND(long value)
{
  byte byte1, byte2;
  byte2 = (value & 0x0000FF00L)>>8;
  byte1 = value & 0x000000FFL;

  digitalWrite (latch, LOW);
  shiftOut(data, clock, MSBFIRST, byte2);
  shiftOut(data, clock, MSBFIRST, byte1);
  digitalWrite (latch, HIGH);
}

« Last Edit: September 30, 2013, 02:47:53 pm by DOC-DARKNESS » Logged

Keep er lit

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 310
Posts: 26632
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
 val20 = digitalRead(switchPin20) == LOW;
  if(val20 = digitalRead(switchPin20) == LOW)
    digitalWrite (latch, HIGH);
Interesting construct - is it doing what you intended?

Code:
byte byte1, byte2;
  byte2 = (value & 0x0000FF00L)>>8;
  byte1 = value & 0x000000FFL;
Why write three lines when two would do?
Code:
  byte byte2 = (value >> 8) & 0xFF;
  byte byte1 = value & 0x000000FFL;
« Last Edit: September 29, 2013, 03:27:17 pm by AWOL » Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

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

Code:
 val20 = digitalRead(switchPin20) == LOW;
  if(val20 = digitalRead(switchPin20) == LOW)
    digitalWrite (latch, HIGH);
Interesting construct - is it doing what you intended?

Honestly I don't quite know I initially had this in place to turn off and ledPin which had previously been High when a momentary button was pressed.
I have managed to get so far with the Arduino IDE which is a great for a beginner like myself although I know I have a long way to go yet.

Code:
byte byte1, byte2;
  byte2 = (value & 0x0000FF00L)>>8;
  byte1 = value & 0x000000FFL;
Why write three lines when two would do?
Code:
  byte byte2 = (value >> 8) & 0xFF;
  byte byte1 = value & 0x000000FFL;

I have a very linear mind and as I am dealing with areas I don't quite understand I am gleaning what I can to get things working.
Short answer I'm a long way from producing elegant code as I'm sure you can see but having said that I so far touch wood everything I've done has functioned as I intended smiley


Logged

Keep er lit

Offline Offline
Faraday Member
**
Karma: 66
Posts: 2588
Now, More Than Ever
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Have you succeeded in getting just the display-segments part working?
Logged

"Hello, I must be going..."
"You gotta fight -- for your right -- to party!"
Don't react - Read.
"Who is like unto the beast? who is able to make war with him?"

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

Have you succeeded in getting just the display-segments part working?

Hi Runaway Pancake

Thanks for the reply the display works as expected.
I think my issue may be here

Quote
currentGear = (currentGear>0 ? currentGear-1 : currentGear);
        currentGear--;
        updateAND(gearArray[currentGear]);

If I delete the line in bold italics hopefully this will stop the increments and decrements jumping in twos and passing through the bounds of the array!
Logged

Keep er lit

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

Yep that solved it, Thanks all for your help.
Will post the finished project when I complete the build
Logged

Keep er lit

Pages: [1]   Go Up
Jump to: