igendel icon

PIC12F675 Fireplace toy project

igendel | PRO | 08/09/14 11:19:35 PM UTC | 0 ⭐ | 815 👁️ | Never ⏰ | []
C |

2.6 KB

|

None

|

0 👍

/

0 👎

#include <stdlib.h>
#include <xc.h>
 
#pragma config FOSC = INTRCIO   // INTOSC: I/O function on GP4/5
#pragma config WDTE = OFF       // Watchdog Timer
#pragma config PWRTE = OFF      // Power-Up Timer
#pragma config MCLRE = ON       // MCLR external control
#pragma config BOREN = OFF      // Brown-out Detect
#pragma config CP = OFF         // Program memory code Protection
#pragma config CPD = OFF        // Data memory code protection
 
#define PWM_STEPS 16
#define STATIC_REPEATS 4
#define LED_NUM 3
 
// Timeout to start dimming
// Each 1K is ~7.5 seconds
#define MAX_CYCLES 10000
// Timeout for dim step
#define DIM_COUNT 200
 
struct tLED {
 
    char brightness;
    char pinBinary;
    
} LED[LED_NUM];
 
void initLEDs() {
 
    char j;
    for (j = 0; j < LED_NUM; j++) {
        LED[j].brightness = 0;
    }
 
    LED[0].pinBinary = 4; // GP2
    LED[1].pinBinary = 16; // GP4
    LED[2].pinBinary = 32; // GP5
}
 
void initRegisters() {
 
    ANSEL = 0; // All pins Digital
    TRISIO = 0; // All pins output
    CMCON = 7; // Comparator off
    ADCON0 = 0; //A/D conversion off
    GPIO = 0; // Outputs LOW
 
}
 
void main() {
 
    char j;
    unsigned char r, pwmStep, pattern;
    unsigned char randResult;
    
    unsigned int cycleCount = 0;
    char highPWM = PWM_STEPS;
 
    initRegisters();
    initLEDs();
 
    while (1) {
 
        randResult = rand();
        for (j = 0; j < LED_NUM; j++) {
 
            switch (randResult & 3) {
                case 1: if (LED[j].brightness < highPWM)
                          LED[j].brightness++;
                        break;
                case 2: if (LED[j].brightness > 0)
                          LED[j].brightness--;
                        break;
            } // switch
            randResult >>= 2;
 
        } // for
 
        for (r = 0; r < STATIC_REPEATS; r++)
            for (pwmStep = 0; pwmStep < PWM_STEPS; pwmStep++) {
 
                pattern = 0;
                for (j = 0; j < LED_NUM; j++) 
                    if (LED[j].brightness > pwmStep) pattern |= LED[j].pinBinary;
                GPIO = pattern;
 
            } // for
 
        cycleCount++;
 
        // Are we in the dimming phase?
        if (highPWM < PWM_STEPS) {
 
            if (cycleCount == DIM_COUNT) {
              cycleCount = 0;
              highPWM--;
              if (!highPWM) break;
            }
 
        } else if (cycleCount == MAX_CYCLES) {
            // Switch to dimming mode
            highPWM--;
            cycleCount = 0;
           }
 
    } // while
 
    asm("sleep");
 
} // main

Comments