/***************************************************************************** ** 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 |