This is the most recent version of the file.
This commit is contained in:
223
Neo-pixels Code/NeoPixels.c
Normal file
223
Neo-pixels Code/NeoPixels.c
Normal file
@@ -0,0 +1,223 @@
|
||||
|
||||
/*==============================================================================
|
||||
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.
|
||||
*/
|
Reference in New Issue
Block a user