/*****************************************************************************
** Function name:delay32Ms
**
** Descriptions:Start the timer delay in milo seconds
**until elapsed
**
** parameters:timer number, Delay value in milo second
**
** Returned value:None
**
*****************************************************************************/
void delay32Ms(uint8_t timer_num, uint32_t delayInMs)
{
if (timer_num == 0)
{
/* setup timer #0 for delay */
LPC_TMR32B0->TCR = 0x02;/* reset timer */
LPC_TMR32B0->PR = 0x00;/* set prescaler to zero */
LPC_TMR32B0->MR0 = delayInMs * ((SystemCoreClock/(LPC_TMR32B0->PR+1)) / 1000);
LPC_TMR32B0->IR = 0xff;/* reset all interrrupts */
LPC_TMR32B0->MCR = 0x04;/* stop timer on match */
LPC_TMR32B0->TCR = 0x01;/* start timer */
/* wait until delay time has elapsed */
while (LPC_TMR32B0->TCR & 0x01);
}
else if (timer_num == 1)
{
/* setup timer #1 for delay */
LPC_TMR32B1->TCR = 0x02;/* reset timer */
LPC_TMR32B1->PR = 0x00;/* set prescaler to zero */
LPC_TMR32B1->MR0 = delayInMs * ((SystemCoreClock/(LPC_TMR32B0->PR+1)) / 1000);
LPC_TMR32B1->IR = 0xff;/* reset all interrrupts */
LPC_TMR32B1->MCR = 0x04;/* stop timer on match */
LPC_TMR32B1->TCR = 0x01;/* start timer */
/* wait until delay time has elapsed */
while (LPC_TMR32B1->TCR & 0x01);
}
return;
} |
/*****************************************************************************
** Function name:delay32Rx
**
** Descriptions:roxel delay
** 133920 = 90x31uS
** 133920 = (31uS * 90 degrees) * (48000000 / 1) / 1000000
**
** 1488 = 31uS * (48000000/1)/1000000
**
** assuming that all that pre-scalar stuff remains the same the
** back half of that equation boils down to /48
**
** 48 = 1us * [48]
**
** MR0 = 1 = 20.833nS
**
** 1481 = approx 30.86uS
** 1480 is close
**
** parameters:none
**
** Returned value:None
**
*****************************************************************************/
void delay32Rx(uint32_t roxelConstant)
{
/* setup timer #0 for delay */
LPC_TMR32B0->TCR = 0x02;/* reset timer */
LPC_TMR32B0->PR = 0x00;/* set prescaler to zero */
LPC_TMR32B0->MR0 = roxelConstant;
LPC_TMR32B0->IR = 0xff;/* reset all interrrupts */
LPC_TMR32B0->MCR = 0x04;/* stop timer on match */
LPC_TMR32B0->TCR = 0x01;/* start timer */
/* wait until delay time has elapsed */
while (LPC_TMR32B0->TCR & 0x01);
return;
} |
while(1){
//5400rpm Drive gives a rotation frequency of 90Hz, thus one rotations takes 11.11ms, one roxel (rotational pixel/slice of pie) thus takes 11.11ms/360 = 30.86uS
LPC_GPIO2->DATA &= ~0xff; //switch all the LEDs off
delay32Rx(359*roxeltime);
LPC_GPIO2->DATA |= 0xff; //switch all the LEDs on
delay32Rx(roxeltime);
} |
__attribute__((optimize("Os"))) void function(void)
|
__asm volatile ("nop"); |
#define roxeltime 1263
uint8_t frameBuffer[360] = {0};
SomeFunctionWhichPopulatesTheFramebuffer();
while(1){
for (i = 0; i < 359; i++)
{
LPC_GPIO2->DATA &= ~0xff;
LPC_GPIO2->DATA |= frameBuffer;
delay32Rx(roxeltime);
}
}
|
uint32_t roxeltime = 1250
uint8_t frameBuffer[360] = {0};
SomeFunctionWhichPopulatesTheFramebuffer();
while(1){
for (j=0;j<900;j++){ //let the display run for a bit
//TIME CRITICAL FROM HERE
for (i = 0; i < 359; i++) //loop through the framebuffer
{
LPC_GPIO2->DATA &= ~0xff; //clear the LEDs
LPC_GPIO2->DATA |= frameBuffer; //set them to whatever is in this line of the framebuffer
delay32Rx(roxeltime); //delay a set period
}
//TIME CRITICAL TO HERE
}
roxeltime++; //increment the delay period
Clear();
DrawString(0, 0, "Running...");
snprintf(tempstring, 8, "%d", roxeltime);
DrawString(0, 1, tempstring);
DrawScreen(); //update the OLED display with the roxeltime so we can see what it actually is while the code is running
}
return 1;
}
|
roxeltime++; roxeltime--; |
uint8_t frameBuffer[360] = {0};
frameBuffer[0] = 0xFF;
|
uint8_t frameBuffer[360] = {0};
//4th November 1988
frameBuffer[159] |= 0x01; //mercury
frameBuffer[135] |= 0x02; //venus
frameBuffer[43] |= 0x04; //earth
frameBuffer[29] |= 0x08; //mars
frameBuffer[60] |= 0x10; //jupiter
frameBuffer[274] |= 0x20; //saturn
frameBuffer[271] |= 0x40; // uranus
frameBuffer[280] |= 0x80; //neptune
|