#include "TimerThree.h"
#include <Rainbowduino.h>
#include <MsTimer2.h>
volatile int interruptParas[10][2];
uint32_t colour;
int resolution;
void setup(){
Rb.init();
Serial.begin(9600);
resolution = 1;
colour = 0xFFFFFF;
Timer3.initialize(500);
Timer3.pwm(9, 512);
}
void moveUntil(int sx, int sy, int ex, int ey,uint32_t colour, int timeDelay, int intervalDelay, int intervalCount) { //TODO modified from Rainbowduino_Firmware_v3_oh drawLine
int i, lx, ly;
lx = abs(ex-sx);
ly = abs(ey-sy);
i = 0;
interruptParas[0][0] = intervalDelay;
interruptParas[1][0] = intervalCount;
interruptParas[2][0] = lx;
interruptParas[3][0] = ly;
interruptParas[4][0] = i;
interruptParas[5][0] = sx;
interruptParas[6][0] = sy;
interruptParas[7][0] = ex;
interruptParas[8][0] = ey;
if(timeDelay)
{
Timer3.setPeriod(timeDelay);
}
else
{
Timer3.setPeriod(intervalDelay);
}
if ( lx > ly)
{
Timer3.attachInterrupt(mapPixelLXGreater);
}
else
{
Timer3.attachInterrupt(mapPixelLYGreater);
}
}
void mapPixelLXGreater(){
int intervalDelay = interruptParas[0][0];
int intervalCount = interruptParas[1][0];
int lx = interruptParas[2][0];
int ly = interruptParas[3][0];
int i = interruptParas[4][0];
int sx = interruptParas[5][0];
int sy = interruptParas[6][0];
int ex = interruptParas[7][0];
int ey = interruptParas[8][0];
Timer3.setPeriod(intervalDelay);
clearSpace(map(i-1, 0, lx, sx, ex), map(i-1, 0, lx, sy, ey)); // clear previous pixel
pixel(map(i, 0, lx, sx, ex), map(i, 0, lx, sy, ey), colour);
intervalCount--;
interruptParas[1][0]--;
if(!intervalCount)
{
Timer3.detachInterrupt();
}
}
void mapPixelLYGreater(){
int intervalDelay = interruptParas[0][0];
int intervalCount = interruptParas[1][0];
int lx = interruptParas[2][0];
int ly = interruptParas[3][0];
int i = interruptParas[4][0];
int sx = interruptParas[5][0];
int sy = interruptParas[6][0];
int ex = interruptParas[7][0];
int ey = interruptParas[8][0];
Timer3.setPeriod(intervalDelay);
clearSpace(map(i-1, 0, ly, sx, ex), map(i-1, 0, ly, sy, ey));
pixel(map(i, 0, ly, sx, ex), map(i, 0, ly, sy, ey), colour);
intervalCount--;
interruptParas[1][0]--;
if(!intervalCount)
{
Timer3.detachInterrupt();
}
}
void clearSpace(int x, int y){
for(int i =0; i < resolution;i++)
for(int j=0; j< resolution; j++)
{
Serial.print("I is ");
Serial.println(i);
Serial.print("J is ");
Serial.println(j);
Rb.setPixelXY((x*resolution)+i, (y*resolution)+j, 0x0, 0x0, 0x0);
}
}
void pixel(int x, int y, uint32_t colour){
for(int i =0; i < resolution;i++)
for(int j=0; j< resolution; j++)
{
Rb.setPixelXY((x*resolution)+i, (y*resolution)+j, colour);
}
}
void loop()
{
moveUntil(0,0,7,7, 0xFFFFFF, 100000, 5000, 10);
}
http://www.pjrc.com/teensy/td_libs_TimerOne.html that has both timer 3 and timer 1