tterev3's PIC quickstart guide

Yay, another PIC person comes out of the closet :slight_smile: . I’ll be using one in my BLF contest entry.

Thank you very much tterev3. Great write up. Just what I needed to start digging into the subject of PIC flashing/programming. When I tried to research it in the past, I just couldn't seem to find any clear info. Started to wonder if PIC's are only programmed in China or something. I'm sure I just didn't know enough to conduct effective searches. Time to start studying.

Also gotta decide if I want to invest $50. I have so many drivers and devices with PIC MCU's that I think it may be worth it.

EDIT: Just finished reading your write up and checking out some of the links. Your source code for you RGBWUV driver is fricken crazy. So elaborate and complex to my untrained eye. I see your source is in Assembly language. It appears to share some of the same commands and structure as C. So I have a opinion question.

I have limited programming knowledge/experience (Basic, Cobol, and JCL in college and very light C just playing around on my own). So essentially, I'm still a blank page. I don't see myself designing anything beyond single emitter (one color) FW. Since it may be just as easy (or should I hard) to learn Assembly as C, which would you recommend I try to learn?

Definitely go with C. Writing assembly is a hard-earned skill that is valuable for squeezing the most performance out of a tiny, cheap processor, but it has tons of disadvantages compared to high level languages like C. In the case of flashlight (or other) hobbies, it’s no big deal to buy a $2 microcontroller instead of a 50¢ one, since we’re only building a handful. I learned assembly designing high-volume products where we had to squeeze every penny, so I’m very comfortable with it now, and that’s the only reason I use it so much in my hobbies.

better yet, get some PIC guys to get the stuff from China…see if they can get the firmware and either reproduce it or make custom firmware with better modes and better PWM frequencies
Take what they have and make em better

Thank you tterev3. C it is then.

That's kind of the plan WarHawk. I have so many "discarded" PIC drivers. Some of them l like except for the mode spacing and next mode memory.

Still way early in the learning stages. I was looking at your Ultimate Flashlight Code post that you made in your blog back in October 2012. That the PIC12F1822 data sheet is interesting. Compared the Attiny13A data sheet, it looks more attractive to my untrained eyes. Has twice the RAM and 4 times the EPROM memory. Standby power usage is super low (20nA vs 24uA).

Would you still use the PIC12F1822 MCU if you were to update your D10 or EX11?


You can get PICkit3 from BG for US$20.30 (even cheaper with BLF coupon code)… but I still like Atmel more :stuck_out_tongue: programmer is like 5 bucks or less…

Wow man, I would love to have an SRK like this! Amazing work! Need to get some chinese manufacturer to make this, and call it the SRK - RGBWUV Edition!

And would be cool with a 7 XM-L2 SRK, make 3 LED's white, then the other 4 LED's red, green, blue, and UV!

Edit: Is it possible to sell me one of these drivers already made for the SRK?

But the question is: would you pay 60-70$ for something like that?

Welcome to the BLF , and thanks for sharing your knowledge , tteverv3 .

Very impressive mod , sir .

Sirius9 wrote:

You can get PICkit3 from BG for US$20.30 (even cheaper with BLF coupon code)…

Nice find. Which code works for this item?

Good question, I forgot that blf only works for flashlight and batteries

Still a very good find. At $20, I'm in. Thank you Sirius9.

Hmmm, actually I probaby would pay $60 for a flashlight with this kind of mod. Would be an amazing flashlight with dedicated XP-E's in red, blue, green, and UV, then have 3 XM-L2 U2 1D, that would be amazing! Ya, for $60 I would definitely get it!

You and me both!

The BLF SRK - RGBWUVKLMNOXYZ Edition or “The dial a light” :smiley:

Yes, the 12F1822 is the perfect choice for writing in C on a tiny 8-pin part. I haven’t used them much in my mods simply because my work throws away lower-level parts (12F617) by the boatload, so I use those since I hate to see them go to landfill. If you pursue a project with the 12F1822 we would be able to port pieces of my MELD code right over to it (if that’s the kind of functionality you’re looking for)

Thank you again tterev3. I purchased the flasher you recommended above. So I will be flashing and that MCU you discussed is very affordable. I think I will first attempt to adapt my favorite Attiny13a FW to the 12F1822 first. I have to study to the 12F1822 datasheet more so that I can figure out what adjustments I would need to make to the code.

MELD looks like an incredible program. It just has so much more functionality that I feel I should tackle at this time. I really like your concept of having all those colors and UV in one light. I have separate, green, red and UV lights. It would be really cool to have all that available in one light. It's just too much for me at the moment. I need baby steps.

Thanks again for your very gracious sharing of your knowledge and efforts.

Here's an example program I put together for the 1822. It's a very simple flashlight with 3 brightnesses and a randomized strobe that changes modes on power cycle. This should help you get started with the 1822:

//v0 4/21/2014 by Everett
    //initial version
    //simple flashlight controller. mode change on power cycle

#include <htc.h>
#include <pic12f1822.h>

#define _XTAL_FREQ 8000000

__CONFIG(FOSC_INTOSC & WDTE_SWDTEN & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);
__CONFIG(WRT_BOOT & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF);

persistent unsigned char mode; //must be declared persistent for ram retention trick to work
enum mode{
max=0,
med=1,
low=2,
strobe=3,
};
#define max_mode 3
#define default_mode 0

#define on_time 15 //milliseconds

unsigned int strobe_timer;
unsigned char strobe_position;
bit on_off;
persistent unsigned int key;

void delayms(int milliseconds);
void configure(void);
unsigned char stun_rate_lookup(unsigned char input);

void interrupt isr(void)
{
if(TMR1IF){
TMR1IF=0;
}

if(TMR0IF){ //fires at 1kHz
    TMR0IF=0;
    if(strobe_timer){strobe_timer--;}   //count down milliseconds
}

}

void main(void)
{
configure(); //set up hardware peripherals

delayms(15);    //short delay to avoid power glitches incrementing mode

if(key==12345){     //RAM retention trick to detect quick power cycles
    mode++;         //go to next mode
    if(mode&gt;max_mode){mode=0;}
}   
else{           //long power loss. default to first mode
    mode=default_mode;
    key=12345;
}       


switch(mode){   //initialize current mode
    default:
    case max:
        CCPR1L=255;
        break;
    case med:
        CCPR1L=25;
        break;
    case low:
        CCPR1L=1;
        break;
    case strobe:
        strobe_timer=0;
        on_off=0;
        CCPR1L=0;
        break;
}       


GIE=1;  //turn on interrupts

while(1){
    
    if(mode==strobe){   //no other modes need active tasks while running
        if(strobe_timer==0){    //timer ran out
            on_off=~on_off; //flip it
            if(on_off){
                CCPR1L=255;
                strobe_timer=on_time;   //set on time
            }
            else{
                CCPR1L=0;
                strobe_position++;
                strobe_timer=stun_rate_lookup(strobe_position); //set off time
            }   //set output
        }   
    }
    
    
    
}   

}

unsigned char stun_rate_lookup(unsigned char input)
{
static const char table[72]=28,30,33,31,12,24,28,33,29,23,19,33,33,23,14,26,9,18,15,29,15,10,19,31,9,27,33,10,15,26,16,28,30,24,14,23,10,24,30,10,23,31,25,33,9,15,19,17,19,18,32,23,33,17,31,13,31,18,20,8,24,33,17,21,20,14,9,20,26,16,22,16;
if(input>71){input-=71;}
if(input>71){input-=71;}
if(input>71){input-=71;}
return table[input];
}

void delayms(int milliseconds)
{
while(milliseconds!=0){ __delay_ms(1); milliseconds–;}
}

void configure(void)
{
INTCON=0b01100000;
PIR1=0;
PIR2=0;
T1CON=0b00110001;
T2CON=0b00000101;
PR2=255;
TMR2=0;

LATA=0;
TRISA=0b11111011;
ANSELA=0b00000000;  //
WPUA=0b11111011;
APFCON=0;

OSCCON=0b01110011;  //8MHz
PIE1=0b00000000;
PIE2=0;
OPTION_REG=0b00000010;  //8 prescale for 1ms interrupts

// FVRCON=0b11000001; //1.024v to adc
// ADCON0=0b00001101; //
// ADCON1=0b00010000; //1/8, left justify, vref from vdd

CCPR1L=0;
CCP1CON=0b00001100;

}

__EEPROM_DATA(0,0,0,0,0,0,0,0);

__EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0);
__EEPROM_DATA(0, 0, 0, 0, 0, 0, 0, 0);

__EEPROM_DATA('1','8','2','2',' ','f','l','a');
__EEPROM_DATA('s','h','l','i','g','h','t',' ');
__EEPROM_DATA('b','y',' ','E','v','e','r','e');
__EEPROM_DATA('t','t',' ','e','v','e','r','e');
__EEPROM_DATA('t','t','.','b','r','a','d','f');
__EEPROM_DATA('o','r','d','@','g','m','a','i');
__EEPROM_DATA('l','.','c','o','m',' ',' ',' ');

Simply amazing , great work tterev3 these mode settings are off the charts on the epic scale.

Thank you. Very good idea to start with code that works since someone new to PIC programing/flashing (like me) will probably be dealing with other first time issues. One less potential complication. Looks like the code is for a normal clickie type switch (on/off, half click to interrupt power). Is that correct?