POV Globe

Hello Arduino: Forum
I am currently trying to make a POV globe useing a hall effect sensor and an arduino Mega. I have a snag…my globe spins and calculates the speed breaking the globe up into pixles but the image is not moving through my bitmap image and is stuck on a single row/colum. I beleve it is getting stuck in a loop somewhere and was wondering if anyone could see the reason why.

here is the main psc

#include "WProgram.h"

#include <avr/pgmspace.h>

#include "Defines.h"

//#include "Test.h"

#include "World72PixelBMPData.h"

//#include "Pumpkin.h"

//#include "World2BitmapReverse.h"

//#include "TestImage1.h"

#include "Globals.h"

//#include "HackADaySmall.h"

//#include "Us.h"

void setup() 
{
 // Serial.begin(9600);
 
 CurrentColumns = ImageColumns;
 
  pinMode(SpinInput, INPUT);
  
  lastImageChange = millis();
  lastSpinTime = micros();

  pinMode(col0, OUTPUT);
  pinMode(col1, OUTPUT);
  pinMode(col2, OUTPUT);
  pinMode(col3, OUTPUT);
  pinMode(col4, OUTPUT);
  pinMode(col5, OUTPUT);
  pinMode(col6, OUTPUT);
  pinMode(col7, OUTPUT);
  pinMode(col8, OUTPUT);

  pinMode(row0, OUTPUT);
  pinMode(row1, OUTPUT);
  pinMode(row2, OUTPUT);
  pinMode(row3, OUTPUT);
  pinMode(row4, OUTPUT);
  pinMode(row5, OUTPUT);
  pinMode(row6, OUTPUT);
  pinMode(row7, OUTPUT);

  Clear();
  
  //ALL ON
  for(int i = 0; i < ImageRows; i++)
  {
     for(int j = 0; j < ImageRows; j++)
    {
      digitalWrite(pins[j][0], LEDOrientation);
      digitalWrite(pins[j][1], !LEDOrientation);
    }
    digitalWrite(pins[i][0], !LEDOrientation);
    digitalWrite(pins[i][1], LEDOrientation);
    delay(30);
  }
  
  attachInterrupt(SpinInterrupt, spinInterrupt, FALLING);

}

bool inInterrupt = false;
unsigned long spinTime = 0;
void spinInterrupt()
{
  if(lastSpinTime == 0)
  {
    lastSpinTime = micros();
    return;
  }
  if(!inInterrupt && micros() - lastSpinTime > inturruptDebounce)
  {
    inInterrupt = true;
    unsigned long newSpinTime = micros() - lastSpinTime;
    
    if(spinTime != 0 && (newSpinTime > spinTime*2 || newSpinTime < spinTime/2))
    {
      inInterrupt = false;
      return;
    }
    spinTime = newSpinTime;
 
    if(millis() - lastImageChange > ImageDisplayTime)
    {
        lastImageChange = millis();
        image++;
        if(image > 1)
        {
          image = 0;
        }
        switch(image)
        {
        case 0:
          CurrentColumns = ImageColumns;
        case 1:
          CurrentColumns = ImageColumns;
        }
        spinCount = 0;
    }
   
    microsPerPixelColumn = spinTime / CurrentColumns;
    microsPerPixelEight = microsPerPixelColumn / LEDEights;
   
    
    spinCount++;
    if(spinCount > 20)
    {
      columnOffset++;
      if(columnOffset >= CurrentColumns)
      {
        columnOffset = 0;
      }
      spinCount = 0;
    }
    
    
    
    column = columnOffset;
    LEDEight = 0;
    
    lastSpinTime = micros();
    inInterrupt = false;
  }
}

void loop()
{
  for(column = 0; column < CurrentColumns; column++)
  {
    for(LEDEight = 0; LEDEight < LEDEights ; LEDEight++)
    {
      DrawLEDGroupsAtOnce(LEDEight, column);
    }
    //delayMicroseconds(microsPerPixelColumn);
  }

}

void Clear()
{
  for(int j = 0; j < ImageRows; j++)
  {
    digitalWrite(pins[j][0], LEDOrientation);
    digitalWrite(pins[j][1], !LEDOrientation);
  }
}


char GetImageLEDEights(int eight, int column)
{
  switch(image)
  {
  case 0:
    return pgm_read_byte(&(Image[column][eight])); 
  case 1:
    return pgm_read_byte(&(Image[column][eight])); 
  }
}

void DrawLEDGroupsAtOnce(int eight, int column)
{
  //digitalWrite(eightpins[lastEightOn][1], LEDOrientation);
  
  prog_uint8_t imageEights = GetImageLEDEights(eight, column);
  
  PORTB = (PORTB | B00110000) & ((imageEights << 4) | B11001111);
  PORTC = (PORTC | B00111111) & ((imageEights >> 2) | B11000000);
    
  digitalWrite(eightpins[eight][1], !LEDOrientation);
  
  if(microsPerPixelEight > 20)//18
  {
    delayMicroseconds(microsPerPixelEight - 20);//18
  }
  
  digitalWrite(eightpins[eight][1], LEDOrientation);
  //lastEightOn = eight;
}

The Defines.h

#define SpinInterrupt 2
#define SpinInput 21

#define col0 53
#define col1 51
#define col2 49
#define col3 47
#define col4 45
#define col5 43
#define col6 41
#define col7 39
#define col8 37
//#define col9 12

#define row0 38
#define row1 40
#define row2 42
#define row3 44
#define row4 46
#define row5 48
#define row6 50
#define row7 52
//#define row7 20
//#define row8 21
//#define row9 22

#define LEDOrientation true

#define LEDEightsCount 9

#define ImageDisplayTime 60000

The Globals.h

volatile unsigned long microsPerPixelColumn = 10000;
volatile unsigned long microsPerPixelEight = 0;
volatile unsigned long lastSpinTime = 0;
unsigned long lastColumnTime = 0;

unsigned long lastImageChange = 0;

volatile int column = 0;
volatile int row = 0;
volatile int LEDEight = 0;

volatile int CurrentColumns = 0;

volatile int image = 0;

int lastEightOn = 0;

int columnOffset = 0;
int spinCount = 0;

unsigned long inturruptDebounce = 0;

int eightpins[8][2] = {{row0, col0}, {row1, col1}, { row2, col2}, {row3, col3}, {row4, col4}, {row5, col5}, {row6, col6}, {row7, col7}};

int pins[72][2] = {{col0, row0},
                    {col0, row1},
                    {col0, row2},
                    {col0, row3},
                    {col0, row4},
                    {col0, row5},
                    {col0, row6},
                    {col0, row7},
//                    {col0, row8},
//                    {col0, row9},
                    
                    {col1, row0},
                    {col1, row1},
                    {col1, row2},
                    {col1, row3},
                    {col1, row4},
                    {col1, row5},
                    {col1, row6},
                    {col1, row7},
//                    {col1, row8},
//                    {col1, row9},
                    
                    {col2, row0},
                    {col2, row1},
                    {col2, row2},
                    {col2, row3},
                    {col2, row4},
                    {col2, row5},
                    {col2, row6},
                    {col2, row7},
//                    {col2, row8},
//                    {col2, row9},
                    
                    {col3, row0},
                    {col3, row1},
                    {col3, row2},
                    {col3, row3},
                    {col3, row4},
                    {col3, row5},
                    {col3, row6},
                    {col3, row7},
//                    {col3, row8},
//                    {col3, row9},
                    
                    {col4, row0},
                    {col4, row1},
                    {col4, row2},
                    {col4, row3},
                    {col4, row4},
                    {col4, row5},
                    {col4, row6},
                    {col4, row7},
//                    {col4, row8},
//                    {col4, row9},
                    
                    {col5, row0},
                    {col5, row1},
                    {col5, row2},
                    {col5, row3},
                    {col5, row4},
                    {col5, row5},
                    {col5, row6},
                    {col5, row7},
//                    {col5, row8},
//                    {col5, row9},
                    
                    {col6, row0},
                    {col6, row1},
                    {col6, row2},
                    {col6, row3},
                    {col6, row4},
                    {col6, row5},
                    {col6, row6},
                    {col6, row7},
//                    {col6, row8},
//                    {col6, row9},
                    
                    {col7, row0},
                    {col7, row1},
                    {col7, row2},
                    {col7, row3},
                    {col7, row4},
                    {col7, row5},
                    {col7, row6},
                    {col7, row7},
//                    {col7, row8},
//                    {col7, row9},
                    
                    {col8, row0},
                    {col8, row1},
                    {col8, row2},
                    {col8, row3},
                    {col8, row4},
                    {col8, row5},
                    {col8, row6},
                    {col8, row7},
//                    {col8, row8},
//                    {col8, row9},
                    
//                    {col9, row0},
//                    {col9, row1},
//                    {col9, row2},
//                    {col9, row3},
//                    {col9, row4},
//                    {col9, row5},
//                    {col9, row6},
//                    {col9, row7},
//                    {col9, row8},
//                    {col9, row9}
                    };

Life would be so much simpler if the row and col pins were in arrays, too.

Forgot the Matrix for the bitmap if that helps

#define ImageColumns 131
#define ImageRows 72
#define LEDEights 9


prog_uint8_t Image[ImageColumns][LEDEights] PROGMEM = {
  { 
    B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B10110111, B10111001, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B10000111, B10111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000001, B11011000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000001, B11100000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000001, B11100000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000001, B11111100, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000001, B11111110, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000011, B11111110, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000011, B11111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000011, B11111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000111, B11111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000111, B11110000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000111, B11100000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000011, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00000001, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00011111, B00000011, B00000000, B11111100, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00001011, B00000110, B00000000, B10000000, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00011001, B00000111, B00000000, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00110000, B00000010, B00000000, B00000000, B11111100, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00100001, B00000000, B00000000, B00000000, B11110000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B01100011, B00000000, B00000000, B00000000, B11100000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B01110001, B00000000, B00000000, B00000000, B11110000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00110011, B00000000, B00000000, B00000000, B11000000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11110011, B00000001, B00000000, B00000000, B10000000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00010111, B00001111, B00000000, B00000000, B00000000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00110000, B00001111, B00000000, B00000000, B00111000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B10011000, B00001001, B00000100, B00000000, B01111100, B11111111, B11111111, B11111111, B11111111  }
  , {
    B01110111, B00000110, B00001110, B00000000, B01111000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B00111111, B10000110, B00011111, B00000000, B00011100, B11111110, B11111111, B11111111, B11111111  }
  , {
    B00100111, B10011100, B00011111, B00000000, B11111100, B11111100, B11111111, B11111111, B11111111  }
  , {
    B00000111, B01001000, B00111110, B00000000, B11011000, B11111011, B11111111, B11111111, B11111111  }
  , {
    B01110111, B01111100, B11111110, B00000000, B11010010, B01111011, B11111111, B11111111, B11111111  }
  , {
    B01111111, B11111000, B00000000, B00000000, B11110110, B00000011, B11111100, B11111111, B11111111  }
  , {
    B11111111, B00110000, B00000000, B11000000, B10111111, B00000001, B11111000, B11111111, B11111111  }
  , {
    B11111111, B00010001, B00000001, B11100000, B11111111, B00000001, B11110000, B00000111, B11111000  }
  , {
    B11111111, B00000001, B00000110, B11110000, B11111111, B00000001, B00000000, B00000000, B11010100  }
  , {
    B11111111, B00001111, B00000110, B11110010, B11111111, B00000001, B00000000, B10000000, B11011110  }
  , {
    B11111111, B11001111, B00000111, B11111010, B11111111, B00000001, B00000000, B11100000, B11111111  }
  , {
    B11111111, B11111111, B00011111, B11111011, B11111111, B00000011, B00000000, B11100000, B11111111  }
  , {
    B11111111, B11111111, B00111111, B11111100, B11111111, B00000111, B00000000, B11110000, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111001, B11111111, B00000111, B00000000, B11111000, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B00001111, B00000000, B11111100, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B00111111, B00000000, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B00111111, B11000000, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B00111111, B11000000, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B00111111, B11000000, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B01111111, B11111100, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B01111111, B11111110, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00011111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11111111, B10011111, B11111111, B11111111, B00011111, B11111110, B11111111, B11111111, B11111111  }
  , {
    B11111111, B10111111, B11111111, B11111111, B00000111, B11111100, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B11111111, B00000111, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B00101111, B10001111, B00000000, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B00000111, B10001110, B00000000, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B00011111, B10001110, B00000000, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B00111111, B01000001, B00000000, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11111111, B01100000, B00000000, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B11110000, B01110000, B00000000, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B11111111, B01110000, B01110000, B00000000, B11110000, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00111111, B00100000, B11100000, B00000001, B00000000, B11110111, B11111111, B11111111  }
  , {
    B11111111, B00000111, B01100000, B11111000, B00000001, B00000000, B10000000, B11111111, B11111111  }
  , {
    B11111111, B00000011, B00111000, B11100000, B00000011, B00000000, B00000000, B11111110, B11111111  }
  , {
    B11111111, B00000001, B00011011, B11100000, B00000001, B00000000, B00000000, B11111000, B11111111  }
  , {
    B11111111, B11000001, B00001000, B11000000, B00000001, B00000000, B00000000, B11111000, B11111111  }
  , {
    B11111111, B00000001, B00000000, B11000000, B00000011, B00000000, B00000000, B11111100, B11111111  }
  , {
    B11111111, B00000001, B00000100, B10010000, B00000011, B00000000, B00000000, B11111100, B11111111  }
  , {
    B11111111, B00000011, B00000010, B10011000, B00000011, B00000000, B00000000, B11111110, B11111111  }
  , {
    B11111111, B01100111, B00000000, B00011000, B00001111, B00000000, B10000000, B11111111, B11111111  }
  , {
    B11111111, B11001111, B00000000, B00011000, B00010000, B00000000, B11110000, B11111111, B11111111  }
  , {
    B11111111, B00001111, B00000000, B00010000, B11000000, B10000000, B11110000, B11111111, B11111111  }
  , {
    B11111111, B00111111, B00000000, B00000000, B10000000, B11000001, B11111111, B11111111, B11111111  }
  , {
    B11111111, B00011111, B00000000, B00000000, B00000000, B11100000, B10000111, B11111111, B11111111  }
  , {
    B11111111, B00001111, B00000000, B00000000, B00000100, B11110000, B11100011, B11111111, B11111111  }
  , {
    B11111111, B00001111, B00000000, B00000000, B00001000, B11111011, B11111111, B11111111, B11111111  }
  , {
    B00011111, B00001110, B00000000, B00000000, B10000000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B10000111, B00001100, B00000000, B00000000, B10000000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11100111, B00000111, B00000000, B00000000, B11100000, B11111111, B11111111, B11111111, B11111111  }
  , {
    B11110011, B00000011, B00000000, B00000000, B11110000, B11111111, B11111111, B11111111, B11111111  }

Life would be so much simpler if the row and col pins were in arrays, too

Comments. They'd be good too.