Select Page

PIC10F322 Cascaded Timer – when input on PORT.A2 goes low – PORT.A0 will go high, for 1 second, then LOW, Then PORT.A1 will go high, for one second, then LOW. The on time can be changed by adjusting the PulseOut_Time.

Of course you can move the input to PORT.A3 and get one more output on PORTA.2 and make it three levels. And remove the LEDs and drive something else.

The Circuit

dual crossing trigger

The Code

/*
 * File:   cascaded_timer.c
 * Author: Jamie
 *
 * Created on 9/13/2021, 8:56 PM
 */



#include <xc.h>
#include <stdint.h>

//Device Configuration
#pragma config FOSC = INTOSC // Oscillator Selection
#pragma config BOREN = ON // Brown-out Reset
#pragma config WDTE = OFF // Watchdog Timer
#pragma config PWRTE = ON // Power-up Timer
#pragma config MCLRE = OFF // MCLR Pin Function Select bit->MCLR pin function is digital input, MCLR internally tied to VDD
#pragma config CP = OFF // Code Protection
#pragma config LVP = OFF // Low-Voltage Programming
#pragma config LPBOR = ON // Brown-out Reset Selection bits
#pragma config BORV = LO // Brown-out Reset Voltage Selection
#pragma config WRT = OFF // Flash Memory Self-Write Protection

//Used to calculate the delay time – Change depending on processor Speed
#define _XTAL_FREQ 8000000 //8Mhz

#define PulseOut_Time 1000

//Prototypes
void setup(void);
void cascade(void);
uint8_t input_debounce_A2(void);

 

void main(void){
    setup();

    while(1)
    {
        if (input_debounce_A2() == 1){
        cascade();
        }

    }
}

void setup(void){

    //Disable analog for A0, set as Output, Set to Low
    ANSELAbits.ANSA0 = 0;
    TRISAbits.TRISA0 = 0; //A0 Output
    LATAbits.LATA0 = 0; //Put A0 low

    //Disable analog for A1, set as Output, Set to Low
    ANSELAbits.ANSA1 = 0;
    TRISAbits.TRISA1 = 0; //A1 Output
    LATAbits.LATA1 = 0; //Put A1 low

    //Setup A2 as input with WPU
    ANSELAbits.ANSA2 = 0;
    TRISAbits.TRISA2 = 1;
    WPUAbits.WPUA2 = 1; //Enable Weakpull up on A.2
    OPTION_REGbits.nWPUEN = 0; //Requires being enabled in option reg as well
}

/*reads the input on A2 to see if it is low – we have a pullup here
*so a low input would indicate that the switch that is tied to ground is being pressed
*If low – we wait 50ms and read the status again
*If low after 50ms, we return 1 to be true the switch is being pressed, otherwise 0 is returned.
*You also can adjust the value of the delay and do something like 1 second, which would require
*the switch to be held for 1 second before something happens. */
uint8_t input_debounce_A2(void){

    if (PORTAbits.RA2 == 0){
    __delay_ms(50);

    if (PORTAbits.RA2 == 0){
        return 1;
    }

    return 0;
    }

    return 0;
}

void cascade(void)
{
    LATAbits.LATA0 = 1; //A0 on
    LATAbits.LATA1 = 0; //A1 off

    __delay_ms(PulseOut_Time);

    LATAbits.LATA0 = 0; //A0 off
    LATAbits.LATA1 = 1; //A1 on

    __delay_ms(PulseOut_Time);

    LATAbits.LATA0 = 0; //A0 off
    LATAbits.LATA1 = 0; //A1 off
}

Have a Project or Idea!?

I am Available for Freelance Projects

My skills are always primed and ready for new opportunities to be put to work, and I am ever on the lookout to connect with individuals who share a similar mindset.

If you’re intrigued and wish to collaborate, connect, or simply indulge in a stimulating conversation, don’t hesitate! Drop me an email and let’s begin our journey. I eagerly anticipate our interaction!

jamie@jamiestarling.com


Pin It on Pinterest

Share This