34 #define DAC_A (0b0 << 15) 35 #define DAC_B (0b1 << 15) 36 #define DAC_GAIN_VREF (0b1 << 13) 37 #define DAC_GAIN_2VREF (0b0 << 13) 38 #define DAC_ACTIVE (0b1 << 12) 39 #define DAC_INACTIVE (0b0 << 12) 41 #define PIXEL_DMA_CHN (0) 42 #define Y_MIRROR_SPI_CHN (1) 43 #define Y_MIRROR_SPI_CONFIG (DAC_A | DAC_GAIN_2VREF | DAC_ACTIVE) 48 #define PIXEL_ON_TIME (400) 67 static volatile uint8_t current_row;
82 static void configure_dma_for_row(uint8_t row_number);
89 static void trigger_row(
void);
97 static void update_y_axis_position(uint8_t row_number);
104 static void write_pixel(
struct color const pixel);
135 OpenTimer1(T1_ON | T1_SOURCE_INT | T1_PS_1_1,
PIXEL_ON_TIME);
139 PORTSetPinsDigitalOut(IOPORT_A, BIT_3);
140 mPORTASetBits(BIT_3);
148 PORTSetPinsDigitalIn(IOPORT_A, BIT_4);
149 unsigned int ignore = PORTA;
150 IPC8SET = ((
unsigned int) 5) << 18;
162 PORTSetPinsDigitalOut(IOPORT_B, BIT_0 | BIT_1
167 INTSetVectorPriority(INT_VECTOR_DMA(
PIXEL_DMA_CHN), INT_PRIORITY_LEVEL_5);
169 INT_SUB_PRIORITY_LEVEL_3);
172 configure_dma_for_row(0);
179 PPSOutput(1, RPB15, SS1);
182 PPSOutput(2, RPB8, SDO1);
197 | SPICON_FRMPOL | SPICON_CKP | SPICON_FRMEN, 2);
200 static void trigger_row(
void) {
206 unsigned int x,
unsigned int y) {
229 void __ISR(_DMA0_VECTOR, IPL5SOFT) EndOfRowHandler(
void) {
231 INTClearFlag(INT_SOURCE_DMA(DMA_CHANNEL0));
239 update_y_axis_position(current_row);
242 mPORTAClearBits(BIT_3);
243 Nop(); Nop(); Nop(); Nop();
246 mPORTASetBits(BIT_3);
249 configure_dma_for_row(current_row);
252 void __ISR(_CHANGE_NOTICE_VECTOR, IPL5SOFT) LightArrival(
void) {
253 if ((PORTA & BIT_4) == BIT_4) {
270 static void configure_dma_for_row(uint8_t row_number) {
286 DmaChnSetEventControl(
PIXEL_DMA_CHN, DMA_EV_START_IRQ(_TIMER_1_IRQ));
297 static void update_y_axis_position(uint8_t row_number) {
301 uint16_t mirror_position =
309 while (TxBufFullSPI1());
312 while (SPI1STATbits.SPIBUSY);
315 static void write_pixel(
struct color const pixel) {
320 uint8_t pixel_as_int;
321 } pixel_to_int_converter;
322 pixel_to_int_converter.pixel = pixel;
323 uint8_t pixel_int = pixel_to_int_converter.pixel_as_int;
329 mPORTBSetBits ( ((
unsigned int) pixel_int) & 0XFF);
330 mPORTBClearBits(~((
unsigned int) pixel_int) & 0XFF);
#define BLUE_PHASE_SHIFT
Shift to the right of the blue laser.
struct color const color_blank
#define PIXEL_ON_TIME
How many clock ticks the pixel is on.
#define PHASE_SHIFT_PADDING
void projector_set_pixel(struct color const color, unsigned int x, unsigned int y)
Set the color of a pixel at the specified location.
struct color projector_framebuffer[IMAGE_HEIGHT][IMAGE_WIDTH+PHASE_SHIFT_PADDING]
#define Y_AXIS_MIN_COMMAND
Min voltage to output to drive the y-axis mirror.
#define Y_MIRROR_SPI_CONFIG
void projector_init()
Initialize projector peripherals, variables etc. MUST be called before calling any other projector fu...
void __ISR(_DMA0_VECTOR, IPL5SOFT)
#define Y_AXIS_MAX_COMMAND
Max voltage to output to drive the y-axis mirror.
#define GREEN_PHASE_SHIFT
Shift to the right of the green laser.
#define RED_PHASE_SHIFT
Shift to the right of the red laser.