/*============================================================================== Project: NeoPixel-Starter Date: June 8, 2022 This program demonstrates basic NeoPixel data transmission & colour adjustment. ==============================================================================*/ #include "xc.h" // Microchip XC8 compiler include file #include "stdint.h" // Include integer definitions #include "stdbool.h" // Include Boolean (true/false) definitions #include "UBMP410.h" // Include UBMP4 constants and functions // TODO Set linker ROM ranges to 'default,-0-7FF' under "Memory model" pull-down. // TODO Set linker code offset to '800' under "Additional options" pull-down. // Program constant definitions #define LEDS 96 // Program variable definitions unsigned char red = 10; // Starting colour or colour-adjusted output values, the maximum is 255. unsigned char green = 10; unsigned char blue = 10; unsigned char redP[LEDS]; unsigned char greenP[LEDS]; unsigned char blueP[LEDS]; //Variables for waves bool countUp = true; bool patternUp = true; unsigned char colourIndex = 0; unsigned char colourIndexCopy; unsigned char pix; // Shift 8-bits of NeoPixel data void neopixel_shift(unsigned char col) { for(unsigned char bits = 8; bits != 0; bits --) { H8OUT = 1; if((col & 0b10000000) == 0) { H8OUT = 0; } NOP(); H8OUT = 0; //NOP(); col = col << 1; } } // Fill NeoPixel strip with raw colour from the red, green, and blue variables void neopixel_fill(unsigned char leds) { for(leds; leds != 0; leds--) { neopixel_shift(green); neopixel_shift(red); neopixel_shift(blue); } } void neopixel_array_fill(unsigned char leds) { for(pix = 0; pix != leds; pix++) { neopixel_shift(greenP[pix]); neopixel_shift(redP[pix]); neopixel_shift(blueP[pix]); } } int main(void) { OSC_config(); // Configure internal oscillator for 48 MHz UBMP4_config(); // Configure on-board UBMP4 I/O devices //green = 0b10101010; // Timing test //Makes a gradient thingy where red is on one side, blue is on the other and in the middle there is purple // for(unsigned char pix = 0; pix != LEDS; pix++) // { // redP[pix] = pix * 2; // greenP[pix] = 0; // blueP[pix] = 192 - pix * 2; // } while(1) { neopixel_array_fill(LEDS); neopixel_fill(LEDS); __delay_ms(20); // //Showing some colours when the button is pressed. // if (SW2 == 0) //Cyan // { // green = 150; // red = 0; // blue = 150; // } // if (SW3 == 0) // Red // { // green = 0; // red = 225; // blue = 0; // } // if (SW4 == 0) // Yellow // { // green = 255; // red = 255; // blue = 0; // } // if (SW5 == 0) //Grey // { // green = 50; // red = 50; // blue = 50; // } colourIndexCopy = colourIndex; //Making a moving pattern of purple if SW3 is pressed // if (SW3 == 0) // { //This makes the pattern light brighter for (pix = 0; pix != LEDS; pix++) { //redP[pix] = colourIndex; //blueP[pix] = colourIndex; greenP[pix] = colourIndex; if (countUp) { colourIndex++; if (colourIndex == 255) { countUp = false; } } else { colourIndex--; if (colourIndex == 0) { colourIndex = true; } } //} //This one makes the code move up and down in one certain pattern //This makes the pattern dim if (patternUp) { colourIndex = colourIndexCopy + 1; if (colourIndex == 254) { patternUp = false; } } else { colourIndex = colourIndexCopy - 1; if (colourIndex == 1) { patternUp = true; } } } //This closing bracket makes the lights glow and dim //If SW2 is pressed, then light in purple // if (SW2 == 0) // { // for(unsigned char pixel = 0; pixel != LEDS; pixel++) // { // redP[pixel] = pixel; // greenP[pixel] = 0; // blueP[pixel] = pixel; // } // } // //Makes some sort of pattern (I randomly did this and it made a pattern that blinks red while SW2 is pressed) // for (unsigned int i = 0; i < 225; i++) // { // green = 0; // red += i; // blue = 100; // } // Activate bootloader if SW1 is pressed. if(SW1 == 0) { RESET(); } } } /* Learn More - Program Analysis Activities * * 1. Modify the UBMP4_config() function to allow output on the NeoPixel pin. * Use the test pattern and an oscilloscope to measure the width of the 0 and * 1 data bits transmitted for each colour byte, as well as the total bit * period duration. * * 2. What do NOP(); operations do? There is also a _delay() function that will * create a delay for the specified number of clock cycles. Replace the two * NOP(); statements with: _delay(2); * NOP operations does nothing while the code is being executed. * Is the timing the same? * I'm not sure but it seems the same. * 3. Adjust the amount of delay, and the location of the delay code in the * neopixel_shift() function to adjust the bit width and bit period to most * closely match the values in the NeoPixel data sheet. * * 4. Determine the number of pulses required to create a start bit, a zero bit, * and a one bit for the protocol that your remote control uses. * * 5. Complete the transmit_Sony() function by adding the code to transmit the * 5-bit device address code after the command code. * * 6. Create the definitions and the functions required to transmit the protocol * used by your IR device. */