/*
* File: newmain.c
* Author: burt
*
* Created on March 8, 2025, 3:44 PM
*/
#define _XTAL_FREQ 64000000
#include <xc.h>
#include <stdint.h>
//#include <libpic30.h> // For delay functions
// Configuration bits for PIC18F25Q10 (adjust as needed)
#pragma config FEXTOSC = OFF, RSTOSC = HFINTOSC_64MHZ // Use internal 64MHz oscillator
#pragma config CLKOUTEN = OFF, CSWEN = ON, FCMEN = ON
#pragma config MCLRE = ON, PWRTE = OFF, WDTE = OFF, LPBOREN = OFF, BOREN = OFF
#pragma config LVP = OFF, PPS1WAY = ON, STVREN = ON, DEBUG = OFF
#pragma config WRT = OFF, CP = OFF, CPD = OFF
#define WS2812_PIN LATCbits.LATC0 // Use RC0 for WS2812B data
#define WS2812_TRIS TRISCbits.TRISC0
// Timing constants (adjust if needed, based on 64MHz clock)
//#define T0H 350 // Time high for 0 bit (ns)
//#define T0L 900 // Time low for 0 bit (ns)
//#define T1H 800 // Time high for 1 bit (ns)
//#define T1L 450 // Time low for 1 bit (ns)
//#define RESET_TIME 55 // Reset time in microseconds
#define NUM_LEDS 30 // Number of LEDs
uint8_t ledData[NUM_LEDS * 3]; // RGB data
void sendBit(uint8_t bit) {
WS2812_PIN = 1;
if (bit) {
__delay_ns(800);
WS2812_PIN = 0;
__delay_ns(450);
} else {
__delay_ns(350);
WS2812_PIN = 0;
__delay_ns(900);
}
}
void sendByte(uint8_t byte) {
for (int i = 7; i >= 0; i--) {
sendBit((byte >> i) & 1);
}
}
void sendLEDData() {
for (int i = 0; i < NUM_LEDS * 3; i++) {
sendByte(ledData[i]);
}
__delay_us(55);
}
void main(void) {
// Oscillator setup (if needed, but 64MHz is set in config)
// OSCCON1 = 0x60; // Select HFINTOSC (already in config)
WS2812_TRIS = 0; // Set RC0 as output
// Initialize LED data (example: red, green, blue pattern)
for (int i = 0; i < NUM_LEDS; i++) {
if(i%3 == 0){ledData[i * 3] = 255; ledData[i * 3 + 1] = 0; ledData[i * 3 + 2] = 0;} //red
else if (i%3 == 1){ledData[i * 3] = 0; ledData[i * 3 + 1] = 255; ledData[i * 3 + 2] = 0;} //green
else{ledData[i * 3] = 0; ledData[i * 3 + 1] = 0; ledData[i * 3 + 2] = 255;} //blue
}
while (1) {
sendLEDData();
__delay_ms(20); // Delay between frames
}
}