Quantcast
Channel: Clock - Timer Projects - PIC Microcontroller
Viewing all 218 articles
Browse latest View live

Understanding Timers in PIC Microcontroller with LED Blinking Sequence

$
0
0

This will be the fifth tutorial in our PIC Tutorial Series, which will help you to learn and use Timers in PIC16F877A. In our previous tutorials, we had started with Introduction to PIC and MPLABX IDE, then we wrote our first PIC program to blink the LED using PIC and then made a LED Blinking Sequence by using delay function in PIC Microcontroller. Now let us use the same LED Blinking sequence which we have used in previous tutorial hardware and with this we will Learn How to use Timers in our PIC MCU. We have just added one more button in LED board for this tutorial. Go through the tutorial to learn more.

Understanding Timers in PIC Microcontroller with LED Blinking Sequence

Understanding Timers in-PIC Microcontroller with LED Blinking Sequence

Timers are one of the important workhorses for an embedded programmer. Every application that we design will somehow involve a timing application, like turning ON or OFF something after a specified interval of time.  Okay, but why do we need timers when we already have delay macros (__delay_ms()) doing the same thing!!

Why Timer when we have Delay() ?

A Delay macro is called a “dump” delay. Because during the execution of Delay function the MCU sits dump by just creating a delay. During this process the MCU cannot listen to its ADC values or read anything from its Registers. Hence it is not advisable to use Delay functions except for applications like LED blinking where the Time delay need not be accurate or long.

The delay macros also has the following short comings,

  1. The value of delay must be a constant for delay macros; it cannot be changed during program execution. Hence it remains is programmer defined.
  2. The delay will not be accurate as compared to using Timers.
  3. Larger values of delays cannot be created using macros, example a delay of half hour cannot be created by delay macros. The maximum delay that can be used is based on Crystal oscillator used.

PIC microcontroller Timers:

Physically, timer is a register whose value is continually increasing to 255, and then it starts all over again: 0, 1, 2, 3, 4…255….0, 1, 2, 3……etc.

The PIC16F877A PIC MCU has three Timer Modules. They are names as Timer0, Timer1 and Timer2. The Timer 0 and Timer 2 are 8-bit Timers and Timer 1 is a 16-bit Timer. In this tutorial we will be using the Timer 0 for our application. Once we understand the Timer 0 it will be easy to work on Timer 1 and Timer 2 as well.

The Timer0 module timer/counter has the following features:

  • 8-bit timer/counter
  • Readable and writable
  • 8-bit software programmable prescaler
  • Internal or external clock select
  • Interrupt on overflow from FFh to 00h
  • Edge select for external clock

 

To start using a timer we should understand some of the fancy terms like 8-bit/16-bit timer, Prescaler, Timer interrupts and Focs. Now, let us see what each one really means. As said earlier there are both the 8-bit and 16-bit Timers in our PIC MCU, the main difference between them is that the 16-bit Timer has much better Resolution that the 8-bit Timer.

Prescaler is a name for the part of a microcontroller which divides oscillator clock before it will reach logic that increases timer status.  The range of the prescaler id is from 1 to 256 and the value of the Prescaler can be set using the OPTION Register (The same one that we used for pull up resistors).  For example if the value of prescaler is 64, then for every 64th pulse the Timer will be incremented by 1.

As the timer increments and when it reaches to its maximum value of 255, it will trigger an interrupt and initialize itself to 0 back again. This interrupt is called as the Timer Interrupt. This interrupt informs the MCU that this particular time has lapped.

The Fosc stands for Frequency of the Oscillator, it is the frequency of the Crystal used. The time taken for the Timer register depends on the value of Prescaler and the value of the Fosc.

Programming and Working Explanation:

In this tutorial we will set two buttons as two inputs and 8 LED as 8 outputs. The first button will be used to set the time delay (500ms for every push) and the second button will be used to start the timer sequence blinking. For example, if the first button is pressed thrice (500*3 = 1500ms) the delay will be set for 1.5sec and when the button two is pressed each LED will turn ON and OFF with the predefined time delay. Check the Demonstration Video at the end of this Tutorial.

Now, with these basics into mind let us look at our program given at the end in Code section.

It is okay if you did not get the program, but if you did!! Give yourself a cookie and dump the program to enjoy your output. For others I will break the program into meaningful parts and explain you what is happening in each block.

As always the first few lines of the code are the Configuration settings and header files, I am not going to explain this since I have already did it in my previous tutorials.

Next, let us skip all the lines and jump straight into the void main function, inside which we have the PORT configuration for the Timer0.

void main()
{    
/*****Port Configuration for Timer ******/
    OPTION_REG = 0b00000101;  // Timer0 with external freq and 64 as prescalar // Also Enables PULL UPs
    TMR0=100;       // Load the time value for 0.0019968s; delayValue can be between 0-256 only
    TMR0IE=1;       //Enable timer interrupt bit in PIE1 register
    GIE=1;          //Enable Global Interrupt
    PEIE=1;         //Enable the Peripheral Interrupt
    /***********______***********/

The Timer will start incrementing once set and overflow after reaching a value of 256, to enable the Timer interrupt during this point the register TMR0IE has to be set high.  Since Timer 0 itself is a peripheral we have to enable the Peripheral Interrupt by making PEIE=1. Finally we have to enable the Global Interrupt so that the MCU will be notified about the Interrupt during any operation, this is done by making GIE=1.

Delay = ((256-REG_val)*(Prescal*4))/Fosc

The above formula is used to calculate the value of Delay.

Where

REG_val = 100;

Prescal = 64

Fosc = 20000000

This on calculation gives,

Delay = 0.0019968s

The next set of lines is to set the I/O Ports.

        /*****Port Configuration for I/O ******/
    TRISB0=1; //Instruct the MCU that the PORTB pin 0 is used as input for button 1.
    TRISB1=1; //Instruct the MCU that the PORTB pin 1 is used as input for button 1.
    TRISD = 0x00; //Instruct the MCU that all pins on PORT D are output 
    PORTD=0x00; //Initialize all pins to 0
    /***********______***********/

This is same as that of our previous tutorial since we are using the same hardware. Except that we have added another button as input. This is done by the line TRISB1=1.

Next, inside out infinite while loop we have two blocks of code. One is used to get the timer input from the user and the other to execute the sequence of delay over the LEDs. I have explained them by using comments against each line.

        while(1)
        {
        count =0; //Do not run timer while in main loop
        //*******Get the number delay from user****//////
        if (RB0==0 && flag==0) //When input given
        {
            get_scnds+=1; //get_scnds=get_scnds+1//Increment variable 
            flag=1;
        }
        if (RB0==1) //To prevent continuous incrementation
            flag=0;
        /***********______***********/

A variable called get_scnds is incremented each time the user presses the button 1. A flag (software defined) variable is used to hold the incrementing process until the user removes his finger from the button.

                //*******Execute sequence with delay****//////
        while (RB1==0)
        {
                PORTD = 0b00000001<<i;  //Left shit LED by i
                if(hscnd==get_scnds) //If the required time is reached
                {
                    i+=1; //Move to next LED after the defined Delay
                    hscnd=0;  
                }
                flag=2;
        }
        if (flag==2 && RB1==1) //Reset timer if button is high again
        {
            get_scnds=0;hscnd=0;i=0;  
            PORTD=0; //Turn off all LEDs
        }
        /***********______***********/

The next block gets into action if the button two is pressed. Since the user has already defined the required time delay using button one and it has been saved in the variable get_scnds. We use a variable called hscnd, this variable is controlled by the ISR (Interrupt service routine).

The interrupt service routine is an Interrupt that will be called each time the Timer0 is overflows. Let us see how it is being controlled by the ISR in the next block, like we want to increment the time delay by half second (0.5s) on each button press then we need to increment variable hscnd for every half second. As we have programmed our timer to over flow for every 0.0019968s (~ 2ms), so to count half second count variable should be 250 because 250*2ms = 0.5 second. So when count gets 250 (250*2ms = 0.5 second), means that its been half a second so we increment hscnd by 1 and initialize count to zero.

void interrupt timer_isr()
{  
    if(TMR0IF==1) // Timer flag has been triggered due to timer overflow
    {
        TMR0 = 100;     //Load the timer Value
        TMR0IF=0;       // Clear timer interrupt flag
        count++;
    } 
    
    if (count == 250)
    {
        hscnd+=1;   // hscnd will get incremented for every half second
        count=0;
    }
}

So we use this value and compare it to our hscnd and shift our LED based on the user defined time. It is also very similar to last tutorial.

That’s it we have our program understood and working.

Circuit Diagram and Proteus Simulation:Schematic Understanding Timers in PIC Microcontroller with LED Blinking Sequence

For more detail: Understanding Timers in PIC Microcontroller with LED Blinking Sequence

Current Project / Post can also be found using:

  • real time digital clock project

The post Understanding Timers in PIC Microcontroller with LED Blinking Sequence appeared first on PIC Microcontroller.


Programmable relay switch using PIC MCU (revised version)

$
0
0

Programmable relays are key elements in numerous automation applications such as automatic street light control, watering and pump control, HVAC, home automation, power plants automation in industries, etc. This article describes a DIY programmable relay switch using PIC16F1847 (PIC16F628A can also be used) microcontroller. It is a revised version of my previous PIC-based relay timer project with added features and some improvements in the circuit design part. Like my previous version, it also allows you to set both ON and OFF times. The maximum time interval that you can set for ON and OFF operations is 99 hours and 59 minutes. The new version features cyclic option, which means you can choose to run it in a continuous loop of ON and OFF cycles. The timer can be programmed through 4 push switches. The programming menu, relay status (ON or OFF), and number of cycles completed are displayed on a 16×2 character LCD. The timing resolution of this relay timer is 1 minute. The timer also saves the previously-set ON/OFF times and the cyclic option in its internal EEPROM so that it can retain these values after any power supply interrupt. The firmware for this project is provided for both PIC16F1847 and PIC16F628A microcontrollers.

Programmable relay switch using PIC MCU (revised version)

Programmable relay timer switch

Here are the summary of the features that this programmable relay switch has:

  • On-board +5V voltage regulator (operates at 9-15V DC input)
  • OFF and ON time setup for the relay operation
  • Option for cyclic run (maximum 100 cycles, after which the timer stops automatically)
  • Stores ON/OFF times and Cyclic option from previous setup into internal EEPROM
  • ON/OFF timing range: 0 to 99 hours and 59 minutes with 1 min resolution
  • Interactive user interface using 4 tact switches and a character LCD
  • On-board buzzer alarm
You can buy the PCB for this project from Elecrow.
Circuit diagram

Let’s first talk about the hardware part of this relay timer project. It is not much different than the previous version except for a few improvements, such as an optical isolation between the microcontroller I/O pin and the relay control circuit, which will be discussed later.

Power supply: The entire circuit runs off a regulated 5V power supply derived from the LM7805 linear regulator chip (Figure 1). To minimize the heat dissipation in the voltage regulator, the recommended input DC voltage is 9V, which can be easily obtained from a DC wall adapter. The circuit board contains a 2-pin terminal block and a standard 2.1mm DC barrel jack to receive the unregulated input DC voltage. There is no power supply ON/OFF switch available on board this time.Schematic Programmable relay switch using PIC MCU (revised version)

For more detail: Programmable relay switch using PIC MCU (revised version)

The post Programmable relay switch using PIC MCU (revised version) appeared first on PIC Microcontroller.

Interfacing Real Time Clock (RTC) DS1307 with PIC Microcontroller

$
0
0

DS1307 is a low power serial real time clock with full binary coded decimal (BCD) clock/calendar plus 56 bytes of NV SRAM (Non Volatile Static Random Access Memory). Data and Address are transferred serially through a bidirectional I2C bus. The RTC provides year, month, date, hour, minute and second information. The end date of months is automatically adjusted for months fewer than 31 days including leap year compensation up to year 2100. It can operate either in 24-hour format or 12-hour format with AM/PM indicator. DS1307 comes with built-in power sensing circuit which senses power failures and automatically switches to back up supply. The DS1307 RTC uses an external 32.768kHz Crystal Oscillator and it does not requires any external resistors or capacitors to operate.Interfacing Real Time Clock (RTC) DS1307 with PIC Microcontroller

What is I2C (I²C) ?

I²C (Read as “i-squared cee”; Inter-Integrated Circuit) is a multi-master serial single-ended computer bus invented by Philips, used to attach low-speed peripherals to a embedded system,cellphone, motherboard, or other electronic device and is generally referred to as “two-wire interface”. It consists of two wires called SCL and SDA. SCL is the clock line which is used to synchronise all the data transfers through I2C bus and SDA is the data line. It also need a third line as reference line (ground or 0 volt). A 5v power should be also be given to the device for its working. The main thing to be noted is that both SCL and SDA are Open Drain drives. Which means that the chip can drive its low output but can’t drive high output. Thus we must provide two pull up resistors to 5v for SCL and SDA, to make it to drive high output as shown in the fig.Schematic Interfacing Real Time Clock (RTC) DS1307 with PIC Microcontroller

Selection of Pull Up Resistors

1. The rise time of SCL and SDA voltages will depend up on the value of pull up resistor and I2C bus capacitance. Thus pull up resistor should be selected according to the I2C bus frequency being used.

 

2. The higher value of pull up resistor is limited by the rise time and the lower vale of pull up resistor is limited by the drive strength (IOL max) of the SDA and SCL drivers. If the pull up resistor is very low , the SCL and SDA outputs might not be establish enough low voltage.

I recommend you to use 1.8K pull up resistors.

MikroC PRO for PIC Microcontroller provide built-in libraries for I2C devices. DS1307 works as a slave device on I2C bus. Register access can be obtained by implementing a START and followed by device identification address. Then each registers can be accessed sequentially by using its address until a STOP condition is executed.

Device Address : 0X68 = 1101000

For more detail: Interfacing Real Time Clock (RTC) DS1307 with PIC Microcontroller

Current Project / Post can also be found using:

  • How to create a clock with a microcontroller

The post Interfacing Real Time Clock (RTC) DS1307 with PIC Microcontroller appeared first on PIC Microcontroller.

Mars Clock using PIC16F877A microcontroller

$
0
0

What do you do if you have a spare LCD module with backlight, a weird 16 button keyboard, and a PIC16F877A microcontroller gathering dust? A monster Martian Clock immediately springs to mind.
Mars Clock
You are probably thinking “There are hundreds of PIC clocks on the Net – do we need yet another one?!” Well, this one is a bit different:

  • It has 16 timers that can be independently paused and restarted, and can run forward or backward.
  • There are 16 alarms with configurable sounds and actions.
  • Timers can show Earth, Mars, Jupiter, etc. times at the same time.
  • How about sidereal time, Moon phase, Jupiter’s Great Red Spot transit time, and anything periodic in general?
  • Simultaneous 24-hour and Julian-time decimal display.
  • All changes in configuration can be done from the device’s keyboard – no computer necessary.
  • External AC power with built-in rechargeable battery, so you can take the clock around.
  • High on the geekness scale.

If you would like to build this clock, of if you are just curious about it, check the links below. The same information is accessible using the tabs at the top and bottom of the page.

 Construction  The construction process in pictures, step-by-step.
 Clock Operation How to use the clock – menu navigation, setting up timers and alarms, examples.
 Schematics  Schematics, list of parts.

 

For more detail: Mars Clock using PIC16F877A microcontroller

Current Project / Post can also be found using:

  • relay timer mcu

The post Mars Clock using PIC16F877A microcontroller appeared first on PIC Microcontroller.

Digital Clock using PIC Microcontroller and DS1307 RTC

$
0
0

A Digital Clock can be made easily by using PIC Microcontroller, DS1307 and a 16×2 LCD. I have already posted about Interfacing DS1307 RTC with PIC Microcontroller. The DS1307 RTC can work either in 24-hour mode or 12-hour mode with AM/PM indicator.Digital Clock using PIC Microcontroller and DS1307 RTC It automatically adjusts for months fewer than 31 days including leap year compensation up to year 2100.  DS1307 comes with built-in power sensing circuit which senses power failures and automatically switches to back up supply. We can provide a 3V CMOS Battery for that. Communication between PIC Microcontroller and DS1307 takes place through I²C Bus.

Suggested Readings:

Circuit Diagram – Digital Clock

Schematic Digital Clock using PIC Microcontroller and DS1307 RTC

Digital Clock using PIC Microcontroller and DS1307 RTC – Circuit Diagram

I hope that you can easily understand the circuit diagram. The circuit is powered using a 5V power supply. 8MHz crystal is connected to PIC Microcontroller to provide necessary clock for the operation. An RCR (Resistor-Capacitor-Resistor) made using 10KΩ, 0.1µF, 4.7KΩ is connected to MCLR pin of PIC Microcontroller as recommended by Microchip. It will work fine even if you tie MCLR pin directly to VDD but Microchip doesn’t recommends it. DS1307 RTC is connected to PIC microcontroller via I2C bus. Pull up resistors connected to I2C bus is very important, please make sure that you are using correct values for it. An additional power supply (usually a battery or button cell) is connected to DS1307 RTC for running the clock during power failures. This circuit will function even without that battery also but the clock will stop and reset during power failure.

For more detail: Digital Clock using PIC Microcontroller and DS1307 RTC

Current Project / Post can also be found using:

  • how to make rtc using pic microcontroller
  • rtc using pic microcontroller

The post Digital Clock using PIC Microcontroller and DS1307 RTC appeared first on PIC Microcontroller.

2 Digit Counter using PIC12F629 Microcontroller

$
0
0

This article describes a 2-Digit Counter using a Microchip PIC12F629.
It shows what can be done with an 8-pin chip having just 5 output lines and one input line.
The chip drives two7-segment displays and this would normally require 7 lines to drive the segments plus another one or two lines to select the displays.
We have shown how a single line can be used to drive two different segments by using the tri-state of an output.

2 Digit Counter

Each output of the chip has three states: HIGH, LOW and FLOATING (high impedance). The high impedance state occurs when the line is in the input state and any line can be changed from output to input at any time during the running of the program.
The circuit is more complex than shown in the diagram. The interface circuit between the chip and the displays is duplicated two more times for the other 4 lines to the displays. This means we have used 9 transistors to drive 6 lines, whereas it would have normally taken 6 transistors.
The other secret behind driving the displays is multiplexing.
Since we can only show 3 or 4 segments of a display at any time, we need to alternately show up to 3 segments for a short period of time and then the other 4 segments.
We can then repeat the procedure for the other display.
This means any segment will only be illuminated for a maximum of 25% of the time and if we deliver a higher current for this short period of time, we can achieve a very good brightness.
This is one of the features of a LED. It can be pulsed with a higher current for a short period of time and the brightness will be equivalent to a lower constant current.
In fact the overall current will be less in pulse-mode and this represents a saving in power.
To deliver this higher current we need driver transistors as the chip is only able to deliver 25mA from each drive line and we need about 30mA.
The other secret to the operation of the circuit is the voltage divider. It is designed to  put 0.5v between the base and emitter of the two transistors when the output of the chip is floating.
This means neither of the transistors is turned on and no segment will be illuminated.
When the output of the chip is HIGH, the lower transistor is turned on and this turns on the middle transistor to illuminate a segment.
When the output of the chip is LOW, the upper transistor is turned on.

The multiplexing and driving the segments involves a lot more programming and setting the lines to input and then output, but this will not inhibit the running of the program as the displays must be illuminated for long periods of time compared with the time taken for carrying out the instructions.
The whole purpose of this project is to show what can be done with a small micro

For more detail: 2 Digit Counter using PIC12F629 Microcontroller

The post 2 Digit Counter using PIC12F629 Microcontroller appeared first on PIC Microcontroller.

00 to 99 minute timer using PIC16F628A microcontroller

$
0
0

Last week I was browsing my old backup hard drive and I found a source code for a very simple PIC based digital timer that I made a couple of years ago. The actual hardware of the project isn’t with me anymore. I might have lost it when I moved from my old apartment into my new home. However, I thought this might be a good practice project for beginners and so I am sharing it here. I am not going to build it from scratch again; I will rather demonstrate it using my DIY PIC16F628A breadboard module and I/O board. The complete circuit diagram along with the firmware developed using mikroC Pro for PIC compiler is provided in the article.

00 to 99 minute timer using PIC16F628A microcontroller

0-99 minute timer

Circuit diagram

As I mentioned earlier, the microcontroller used in this project is PIC16F628A running at 4.0 MHz clock using an external crystal. An HD44780 based 16×2 character LCD is the main display unit of the project where you can watch and set the timer duration using tact switch inputs. There are three tact switches connected to RB0 (Start/Stop), RB1 (Unit), and RB2 (Ten) pins. You can select the timer interval from 0-99 min using Unit and Ten minute switches. The Start/Stop switch is for toggling the timer ON and OFF. When the timer gets ON, a logic high signal appears on the RA3 pin, which can be used to switch on a Relay. The circuit diagram of this project is described below.

Schematic 00 to 99 minute timer using PIC16F628A microcontroller

0-99 minute timer circuit

I am using my self-made breadboard module for PIC16F628A and experimenter’s I/O board here to demonstrate this project. Since there is no relay switch in the I/O board, I am connecting the timer output (pin RA3) to an LED. When the timer starts, the LED is turned ON. As the timer duration is elapsed, the LED is turned OFF.

For more detail: 00 to 99 minute timer using PIC16F628A microcontroller

The post 00 to 99 minute timer using PIC16F628A microcontroller appeared first on PIC Microcontroller.

New Earth Time (NET) digital clock in recycled retro-modern case using PIC16F627A

$
0
0

Ever get confused by GMT, or just wish you had a cooler way to keep track of time?  Build a New Earth Time clock!  Using a PIC microcontroller, some code, and a couple discrete parts, you too can have a unique timekeeping device to keep on your desk.
digital clock
New Earth Time (NET) is an idea for a global time standard.  Like Greenwich Mean Time (GMT), it is the same “New Earth Time” everywhere on the globe at any instant.  Unlike GMT, NET counts time in Degrees and Minutes so as to not be confused with your local time (which is still counted the same way you’re used to).  You can read all about how New Earth Time works at their website, newearthtime.net .

It seems like a cool idea to me, and what better way to support the idea than to build a clock and start using New Earth Time!

Step 1: Parts

You can see my prototype NET clock in the picture to get an idea of what’s involved.

Electronics:
1x – PIC16F627A Microcontroller
1x – 32.768kHz Crystal (Mouser 815-AB26T-32.768KHZ or equivalent)
2x – 22pF Ceramic Capacitor (or 1x 22pF and 1x 0-56pF Variable capacitor for tuning)
4x – 10k Resistor
7x – 100 Ohm Resistor
1x – 4.7k Resistor
5x – 1k Resistor
5x – 2n3904 Transistor
5x – Common Cathode 7-segment Display (Mouser 512-MAN6980 or equivalent)
2x – SPST Momentary pushbutton switch
1x – Round LED, modified as described in Step 2 (Making the degrees LED)

 

For more detail: New Earth Time (NET) digital clock in recycled retro-modern case using PIC16F627A

The post New Earth Time (NET) digital clock in recycled retro-modern case using PIC16F627A appeared first on PIC Microcontroller.


PIC16F877 timer0 code and Proteus simulation

$
0
0

This PIC16F877 microcontroller tutorial answers the question,
” How to use timer0 of PIC16F877 and how to handle its interrupts? “

Using PIC16 simulator (Proteus) you can verify this PIC timer0 code and change it according to your needs. This code is written in C language using MPLAB with HI-TECH C compiler. You can download this code from the ‘Downloads‘ section at the bottom of this page.

It is assumed that you know how to blink an LED with PIC16F877 microcontroller. If you don’t then please read this page first, before proceeding with this article.

The following diagram (made in Proteus) shows the PIC microcontroller circuit diagram.

PIC16F877 timer0 schematic

In this circuit, PIC16F877 is running on external crystal of 20MHz value. RB0 pin is toggled every time timer0 expires and executes it’s ISR[1] code. In the above figure, it is clear that after approximately every 100usec, RB0 pin is toggled i-e timer0 expires. You can easily change this value in the code.

Code

The main function code is shown below.

Downloads

Timer0 code for PIC16F877 was compiled in MPLAB v8.85 with HI-TECH C v9.83 compiler and simulation was made in Proteus v7.10. To download code and Proteus simulation click here.

 

For more detail: PIC16F877 timer0 code and Proteus simulation

The post PIC16F877 timer0 code and Proteus simulation appeared first on PIC Microcontroller.

PIC12F675 timer1 code and Proteus simulation

$
0
0

This post provides the timer1 code for PIC12F675 microcontroller. This code is written in C language using MPLAB with HI-TECH C compiler. You can download this code from the ‘Downloads‘ section at the bottom of this page.

PIC12F675 timer1

It is assumed that you know how to blink an LED with PIC12F675 microcontroller. If you don’t then please read this page first, before proceeding with this article.

The result of simulating the code in Proteus is shown below.

In this circuit, PIC12F675 is running on internal oscillator of 4MHz value. GP0 pin is toggled every time timer1 expires and executes it’s ISR[1] code. In the above figure, it is clear that after approximately every 130msec, GP0 pin is toggled i-e timer1 expires. You can easily change this value in the code.

Code

The code used to initialize timer1 is shown below.

In this function, firstly timer1 count registers (TMR1H and TMR1L) are cleared before starting timer1. T1CON register is initialized to make timer1 prescalar to be 1:1. Timer1 is a 16bit timer, so it expires after reaching a value of 65535. When timer1 prescalar is made 1:1 then it means that, timer1 value will increment after every clock cycle. Since PIC12F675 is running at 1MIPS[2] speed, this means that timer1 will expire after every 65535*2 = 131 msec[3]. T1IF bit clears any pending timer1 interrupts. T1IE bit enables timer1 interrupts, PEIE bit enables peripheral interrupts (It is a must to enable peripheral interrupts in order to enable timer1 interrupts) and GIE bit enables global interrupts.

Timer1 interrupt service routine code is shown below.

PIC12F675 timer1 schematic

Downloads

Timer1 code for PIC12F675 was compiled in MPLAB v8.85 with HI-TECH C v9.83 compiler and simulation was made in Proteus v7.10. To download code and Proteus simulation click here.

 

For more detail: PIC12F675 timer1 code and Proteus simulation

The post PIC12F675 timer1 code and Proteus simulation appeared first on PIC Microcontroller.

PIC12F675 timer0 code and Proteus simulation

$
0
0

This post provides the timer0 code for PIC12F675 microcontroller. This code is written in C language using MPLAB with HI-TECH C compiler. You can download this code from the ‘Downloads‘ section at the bottom of this page.

PIC12F675 timer0

It is assumed that you know how to blink an LED with PIC12F675 microcontroller. If you don’t then please read this page first, before proceeding with this article.

The result of simulating the code in Proteus is shown below.

In this circuit, PIC12F675 is running on internal oscillator of 4MHz value. GP0 pin is toggled every time timer0 expires and executes it’s ISR[1] code. In the above figure, it is clear that after approximately every 0.5msec, GP0 pin is toggled i-e timer0 expires. You can easily change this value in the code.

Code

The code used to initialize timer0 is shown below.

In this function, OPTION_REG is initialized to make timer0 prescalar to be 1:2. Timer0 is an 8bit timer, so it expires after reaching a value of 255. When timer0 prescalar is made 1:2 then it means that timer0 value will increment after every two clock cycles. Since PIC12F675 is running at 1MIPS[2] speed, this means that timer0 will expire after every 256*2 = 512 usec[3]. T0IE bit enables timer0 interrupts and GIE bit enables global interrupts.

Timer0 interrupt service routine code is shown below.

PIC12F675 timer0 schematic

Downloads

Timer0 code for PIC12F675 was compiled in MPLAB v8.85 with HI-TECH C v9.83 compiler and simulation was made in Proteus v7.10. To download code and Proteus simulation click here.

 

For more detail: PIC12F675 timer0 code and Proteus simulation

Current Project / Post can also be found using:

  • MARS CLOCK USING PIC16F876A

The post PIC12F675 timer0 code and Proteus simulation appeared first on PIC Microcontroller.

PIC based WWVB clock

$
0
0

Introduction

There are many DIY versions of WWVB clock designs available on the web. Commercial “atomic” clocks are inexpensive and widely available, but I wanted to try my hand at designing one to gain insight into WWVB reception and to learn a little about programming a PIC microcontroller. My version is not the simplest available, but it works well and I think it offers a few unique features.

PIC based WWVB clockWWVB Clock Features

    • Receives time broadcast from WWVB, Fort Collins, CO

 

  • Auto synchronizes internal time with WWVB time

  • Maintains local time when WWVB signal is lost

  • This version is for Pacific Standard Time, and auto detects/corrects for Daylignt Savings Time

  • 6-digit display of hours, minutes, seconds using 1″ seven-segment LED displays

  • WWVB sync indicator

  • Time display is in 12-hour format

  • PIC 16F628 microcontroller

  • Software written in C

  • All tools (schematic editor, C compiler, PCB layout software, PIC programmer are free and available for download on the web.

A complete description and specification for the WWVB broadcasts is available (free), document # 432, at tf.nist.gov/general/pdf/1383.pdf The WWVB signal is broadcast as a 60 kHz carrier that is AM modulated with a time code frame that is updated once per minute. The data rate is one bit per second. Along with time code information, the data frame also contains synchronization bits, calendar data, UT1 correction, leap year, and leap second data. The clock design presented here only decodes the time data and daylight savings correction data. The software could easily be modified to include decoding of the other information bits, if desired. The the low frequency WWVB signal strength is weak and reception can be problematic. Signal acquisition time is variable, depending on location and atmospheric conditions. Reception is usually best at night between 8pm – 4am. To use the clock, just apply power and wait for reception of the WWVB signal. When the clock receives a complete error-free frame of data, it will automatically reset the display to show the correct time. After the initial time correction, the clock will maintain time even if WWVB reception is lost.

PIC based WWVB clock SchematicAs shown in the schematic (pdf format), the heart of the clock is a PIC 16F628 microcontroller running at 4 MHz. Decoded time data is sequentially output from the microcontroller (RA0 – RA3) to the 7-segment decoder/drivers on a 4-bit data bus. The data is output sequentially as seconds, 10s of seconds, minutes, 10s of minutes, hours, and 10s of hours. The microcontroller outputs (RB1, RB2, RB3) route a 10 uSec stroble pulse from RB4 out to each of the 7-segment decoder/drivers at the proper time to latch the data bus values. Seconds and 10s of seconds display values are updated once per second. Minutes, 10s of minutes, hours, and 10s of hours are updated once per minute. The display consists of 1″ red-orange LED 7-segment displays. The decimal points on the displays are used to form colons to separate the seconds, minutes, and hours. The 10s of seconds and 10s of minutes displays are mounted upside down to form the upper colon dots. The WWVB receiver is a C-MAX model CMMR-6 and is available from Digi-Key (www.digikey.com) as part # 561-1014-ND complete with loopstick antenna. Data output from the receiver is sampled by the microcontroller on RB0.

For more detail: PIC based WWVB clock

The post PIC based WWVB clock appeared first on PIC Microcontroller.

TIMED DISCHARGE ADAPTER using PIC16F628

$
0
0

Introduction

This program is an experimental timed-discharge adapter for a Vericom control panel used with an Orenco Systems AdvanTex® wastewater treatment system (sewage filtration system) marketed by Wastewater Technologies, Inc.

Although the Vericom firmware is capable of modification to provide timed-discharge capability by a firmware download via telephone, this adapter was just an experiment to prove out the concept of timed-discharge for my particular drainfield characteristics. Thus, I don’t recommend this application for AdvanTex installations unless experimental and short-term in nature. This project is included simply as an example of a problem/solution using a PIC microprocessor.

TIMED DISCHARGE ADAPTER

The problem

As delivered the control panel simply directs the final discharge pump to send water to the drain field as controlled by high and low float switches, with anywhere from 20 to 50 gallons of effluent at a time. Because the surface drain field accepts wasterwater at a very slow rate, anything not quickly absorbed into the soil generally runs down the slight incline in the drain field and seeps out from under the mounded soil.

The Vericom control panel does have the ability to be re-programmed for timed discharge instead of float-driven discharge, but the final discharge station needs to be large enough to handle peak flows, and my discharge station is not that large.

TIMED DISCHARGE ADAPTER schematic

Code:

/**************************************************************************

septic_07.c

This program is timed-discharge adapter for a Vericom panel used with Advantex
septic treatment system.  It turns on the final discharge pump by manipulating
the Vericom's PUMP-ON and PUMP-OFF float inputs on a timed basis, using the
state of the actual float switches as boundary conditions, i.e. don't turn on
the pump at all if the PUMP-OFF float says that there's no water to pump, and
turn on the pump anytime the PUMP-ON float says that the water level is high.

This version adds:  eeprom storage of pump-on time
                    activity LED shows 10% of pump-on time duration
                    skip out of delays immediately if put into BYPASS mode

Makes the high level float pump until it goes down, no interrupts.  Logs
on-time in both bypass and timed modes.

Still has issues because it confuses the Vericom panel, which then
goes into an alarm condition, and phones out with an alarm.  I haven't
figured out exactly what the Vericom panels is confused about, other
than that the low float is on for a very short period before the high
float is activated.

                         +5
                          |
                         14
                     ----------
                    |      RA0 |-17-- PUMP ON RELAY
     HIGH FLOAT---6-| RB0      |
                    |      RA1 |-18-- PUMP OFF RELAY
     LOW FLOAT----7-| RB1      |
                    |      RB5 |-11-- PUMP ON LED
     BYPASS-------8-| RB2      |
                    |      RB4 |-10-- PUMP OFF LED
                    |          |
                    |      RB3 |-9--- ACTIVITY LED
                    |          |
                    |  16F628  |
                    |          |
                    |      RB6 |-12-- PGD
                    |      RB7 |-13-- PGC
       6MHz XTAL-15-|     MCLR |-4--- MCLR
            XTAL-16-|          |
                     ----------
                          5
                          |
                         Gnd

***************************************************************************/

For more detail: TIMED DISCHARGE ADAPTER using PIC16F628

The post TIMED DISCHARGE ADAPTER using PIC16F628 appeared first on PIC Microcontroller.

HDD Clock – Persistence of Vision

$
0
0

1. Quite a few POV clocks out there, why is this special?

Well, mainly because it’s mine. There are quite a few POV clocks out there on the web using all sorts of display mechanisms, chassis, controllers. The one I decided to build isn’t exactly one of them, the main difference being in the way I wanted to transfer energy to the spindle. This would add some originality to my project, sadly the method I chose was not working the way I expected it to. I can send the firmware in hex format to anyone who wants it, but since I started out with nothing: everyone who wishes to make the slightest modifications on it will have to write the code on his/her own. This is just my way to encourage learning. I am willing and happy to help, but against using code that isn’t fully understood.HDD Clock - Persistence of Vision

2. Where POV can be used

A POV device can take several forms, in hobbyist electronics circles it’s mostly used at these type of clocks. Throughout the life of every determined hobbyist one day will come when she/he will eventually build such a device. Sometimes this day is windy and they end up with just a simple clock, not a POV clock – but that doesn’t matter. A clock is a good thing to build, many things can be learned, and the thing is useful anyway. The triggering idea (the unique PSU) proved to be wrong, but I intend to build another one, with cutom made enclosure, not an HDD chassis – this way I won’t have to deal with the impossible shapes the boards have to take!

While cleaning out my lab I have found some older (not that pretty) experiments with this, they never got finished. I remember building the first one with wires attached to the parallel port of a laptop. A pascal program was then written to blink the LEDs the way I wanted. It kinda worked, sorta worked, but never really-really worked. So the day I mentioned before came quite a few years ago, sadly I hadn’t got enough experience to accomplish what I wanted. This had to change :)!

1. What brought the old idea back to life

One day, when I was looking through the contests that got announced here, I found the “Remix contest“. I’ve always wanted to press the “I made it!” button, and this contest gave me the ambition to look for a great one, here on Instructables. The one I chose was the “Propeller clock (from an old HDD)“, It was a great project built very cool, but with lack of description about the build. I looked through the comments and saw a lot of people asking for code samples, schematics, unfortunately the builder “snarcis” didn’t had any time to refurbish the instructable. That’s why I’m going to do that myself, and present a step-by-step guide on how such devices can be built. The Remix contest is long closed, unfortunately.

I will try to make this one my best guide so far, to be careful and precise with pictures, instructions – so this can really become a winner.

I got this HDD from a good friend as a gift, I will consider giving it away as a gift to someone, maybe for Christmas, since there are only a few Fridays until then anyway!

That being said, let’s see how can one build such a cool, tech looking device!

1. Bill of materials – must have

As usual, the first step is the one that lets you know what you need before you get started. I might have forgot about tools or components, however the main parts are surely there.

  • 1 x Unusable computer hard disk
  • 2 x PIC18F4550 microprocessor IC
  • 1 x PCF8523 real time clock and calendar IC
  • 1 x PCA9635 sixteen channel LED driver IC
  • 1 x PicKit2, PicKit3 or any PIC programmer
  • 1 x 32.768 KHz crystal oscillator for the real time clock
  • 1 x 20.000 MHz crystal oscillator for the microprocessor
  • 16 x LED of whatever color you wish
  • 1 x infrared LED
  • 1 x photodiode
  • 4 x buttons
  • 6 x N-channel MOSFET for the brushless motor drive
  • n x capacitors as specified in the schematic
  • n x resistors as specified in the schematic
  • n x hand tools, screw drivers, saw, pile, hammer, drill, soldering iron

There are lots of places where you can purchase these components from, I got some off ebay, some from my drawers, some were taken off junk PCB-s I got from all over.

2. Extra stuff I had at hand that helped a lot

I’ve had these excellent tools at hand to ease my job:

  • RIGOL DS1104Z Oscilloscope – my best investment ever
  • Multimeter – an electronic hobbyist can’t do anything without a multimeter, right?
  • Programmer – PicKit2, PicKit3 or anything that does the job
  • Scanalogic 2 logic analyzer – second best investment ever, even though the oscilloscope has I²C, SPI and other decoders, I like this blue box better when it comes to analyzing some fancy serial protocols.
  • Organizers – I have to mention this because I was able to find everything I looked for almost instantly. I’m really glad I bought these, they replaced some boxes which I used for storage in a very sad and inefficient way.
  • Power supply – I bought it last year as a Christmas present to myself. 30V, 3A, great for my projects.
  • Power supply – I described this build in another instructable, it’s a self built device to aid me with six (switched mode) power source.
  • Patience – even though I don’t happen to have that much sometimes
  • Ambition – looking at the fact that I made a total number of four circle shaped PCBs, I dare to say my ambition was all right. Hopefully I will be able to start up my CNC mill real soon so from now on this and the drilling will be much easier. Piling and sawing shapes like this is no fun, especially if you do it four times 🙂

These are good to have, I am proud and happy to say that I managed to buy these myself – aside of the multimeter, which I got from Dad. Most of my tools have a sticker on them to make sure they don’t get lost, you can see that on many of them.

For more detail: HDD Clock – Persistence of Vision

Current Project / Post can also be found using:

  • pic microcontroller clock

The post HDD Clock – Persistence of Vision appeared first on PIC Microcontroller.

The Weeder Frequency Counter using PIC16F84

$
0
0

This is a port by Peter Cousens to the PIC 16F84 of the  50Mhz Frequency counter kit {originally available} from Weeder Technologies . Since it uses a base PIC that is easily programmable, and provides a usefull bit of bench test equipment at very low cost, it makes an ideal PIC learning project. If you don’t want to spend the time on the PCB, collecting the parts or even not programming the uP, you can order the kit (for a very resonable price) from http://www.weedtech.com

Weeder Frequency Counter

News: Weeder Tech no longer makes this kit. They have moved on to a very nice version that works with a local PC via the serial port for display and control. It is also “stackable” for multiple counters at once or with other modules for control and measurement of all kinds. See
http://www.weedtech.com for more information. The original kit has been licenced to Invent Electronics and Ken has made some improvements and provides a very nice (closed source) kit for $49 and a PCB for $10 (prices as of 2004/03/05)

The result is a nice frequency counter that reads frequency from 1 Hz to 50 MHz and displays it on a 16 character LCD display. Auto-range feature provides floating decimal point and automatic placement of suffix (Hz, KHz, or MHz). Gate speed automatically decreases to one second below 100 KHz to display frequency with a resolution down to an amazing 1 Hz.

  • Auto-ranging with floating decimal point.
  • Up to 7 digits displayed.
  • Auto-adjusting gate speed (0.1 sec to 1 sec).
  • Microcontroller-based circuitry provides for simplicity, ease of assembly, and highly stable readout.
  • Sensitivity approximately 100 mV RMS (100 Hz to 2 MHz), 800 mV RMS @ 50 MHz.
  • Input overload protected.

 

For more detail: The Weeder Frequency Counter using PIC16F84

The post The Weeder Frequency Counter using PIC16F84 appeared first on PIC Microcontroller.


10MHz DDS Sine/Square Function Generator based on the AD9835 using PIC16F628

$
0
0

An extremely simple and low cost Sine/Square wave generator based on the Analog Devices AD9835 Direct Digital Synthesis (DDS) Generator chip. The frequency can be set for any frequency from 1Hz to 10MHz in 1Hz resolution steps! All this with three push buttons and a novel “sliding window” LED display. The controller chip is a Microchip PIC16F628. There is no wiring, and the PCB fits into a standard UB3 Jiffy Box.

Square Function Generator

Read the complete Project Article in HTML format.

The Schematic Diagram in GIF format.

The Front Component Overlay in GIF format.

The Back Component Overlay in GIF format.

The Front Panel in ZIPed PDF format

The Front Panel in ZIPed EPS format

The PCB file in Protel format.

The SOURCE CODE and HEX file for a 16F628 and HiTech PIC C Compiler.

For more detail: 10MHz DDS Sine/Square Function Generator based on the AD9835 using PIC16F628

The post 10MHz DDS Sine/Square Function Generator based on the AD9835 using PIC16F628 appeared first on PIC Microcontroller.

Single-Tube nixie clock | Microcontroller Project

$
0
0
Here is the nixie clock !
  • PIC16F84A microcontroller
  • Single-digit Nixie, sequential hours, minutes and seconds display
  • DCF-77 atomic clock, with automatic or manual time set-up
  • high voltage power supply for Nixie with only 4 components
  • 24 hours cycle programmable extinction time
  • no MikroC compiler licence needed !

This project will show you how to drive a nixie tube display with a PIC16F84A simple microcontroller.
The nixie is a vertical-mount, front-reading IN-14 russian tube (thanks Alex !), very convenient for prototyping because of its long solderable pins.
How to power the nixie ?

Single Tube nixie clock  Microcontroller ProjectA 170 volt power supply must be applied between the anode of the tube and one of its cathod, to light the corresponding number from 0 to 9. The lightened number needs around 1.5 mA to glow.
If the voltage is lower, the number is not completely lightened and may even extinguish (under 140 V).
If the voltage is higher, digits will randomly light at the same time, and no digit will be clearly readable.
It is possible to get the high voltage from the main power supply, but it is highly dangerous because live parts may be exposed to dangerous voltage.
That’s why is use a DC/DC converter, which gives the +170V needed by the nixie from the +5V power supply of the circuit. The PIC16F84A generates a software PWM, and drives the MOSFET’s gate. The MOSFET switches on an off the current into a 300 µH coil. The inducted high voltage is collected by a fast recovery diode and then fed into a capacitor.
This is a close-up view, showing the IRF830 MOSFET, the 330 µH miniature coil, and the big 2.2 µF 250V capacitor.
Note that the power supply is build as an individual board, I use it also in other test boards for other projects.
A simple resistor divider feeds back a voltage reference into a PIC input : if the voltage exceeds the 1 level of the PIC, the software turns PWM off, until the voltage turns under the 1 level of the PIC : then the PWM output starts again, and so on… this allows to keep a constant high voltage of around +170 V, depending on the variable resistor setting.
This is a close-up of the voltage reference divider.
We can also see that the 15 K anode current limiting resistor is mounted on a socket : during tests, a 47 K resistor was used. Remember this : reducing the current will increase the life of your tube ! You have to find a good value for a good brightness and a long life.
Single Tube nixie clock  Microcontroller Project schematic
Power supply adjustment : turn the variable potentiometer, so that you can read around 175 V on a voltmeter connected to the test point (see schematic). Don’t forget that there is a 2.2 µF capacitor charged with +170 V in the circuit. This is enough to hurt you VERY BADLY if you touch it.
How to drive the nixie ?
The anode is connected to the high voltage through a 15 K resistor, in order to limit the current to approximately 1.5 mA. It is not possible to drive the cathodes with the pic output, because of the high voltage engaged.
I use a 74141 IC, which has been designed for nixie tubes : it includes a BCD to decimal decoder, and each output has a high-voltage transistor.

The post Single-Tube nixie clock | Microcontroller Project appeared first on PIC Microcontroller.

Video Clock Superimposer using PIC16C711

$
0
0

About the Project

As a followup to my VCR Pong project, here is a gadget that is actually useful in the Real World! It superimposes the time of day, in “HH MM SS” format, in the bottom right-hand corner of an existing video signal. My friend Scott uses it with his home security system.

In keeping with the tradition of my previous hacks, I use few parts and lots of tricks. All timing signals, including the timebase for the time of day and the clock for the microprocessor, are derived from the incoming video signal. That means if you lose power, or lose video, it loses the time… but in this home security application, that didn’t matter. Lost power would mean the VCR stops recording and starts flashing 12:00 (1:00 during daylight savings).

 

Video Clock

Project Files

Here is the schematic, a parts list and circuit description, and most importantly the PIC source code.

The code uses the Parallax instruction syntax, so you’ll either need to use Parallax’s SPASM.EXE (available for free on Parallax’s web site) or Tech-Tools’s CVASM16.EXE (available for evaluation on Tech-Tools’s web site), or here is a preassembled object file, in INXH8M format, for use with any device programmer.

 

For more detail: Video Clock Superimposer using PIC16C711

The post Video Clock Superimposer using PIC16C711 appeared first on PIC Microcontroller.

Hard Drive Clock using PIC16F628

$
0
0

ave an old hard drive that no longer works? As long as it still spins up chances are you could build a clock out of your old hard drive!

You will need some electronic knowledge, some common electronic components and a bit of
patience. The clock that is produced isn’t exactly practical since most hard drives (especially older ones) are too loud for a clock that is to operate 24 hours a day.

hard-drive-clock

VIDEOS

Watch a video (1.5MB) of the clock in operation!It takes the clock a sew seconds for the speed to stabilize, during this time there is a random pattern of lights that is displayed. After this the clock starts up. It is shown starting at 2:40:00.

Another video (4.7MB) this one shows the clock time being set.Three buttons on the back allow clock adjustment. The purple second hand resets to the zero mark when it’s button is pressed. The blue minute hand increments through each minute and the red hour hand increments through each hour. The position of the hour hand is also dependent on the minute hand. For example the time is 2:30 the hour hand will be pointing at the 12 minute mark.

OVERVIEW

  • Uses 12 high power LEDs for displaying the clock hands, 6 Blue and 6 Red.
  • Slot cut into upper drive platter and white tape on center drive platter provides a slot that when illuminated by the LEDs will represent a clock hand.
  • Minute hand is represented by blue light, hour hand is represented by red light and the second hand is represented by purple (both blue and red on at the same time).
  • Infrared Beam sensor and drilled index hole in lower drive platter.
  • Three micro switches to set hours, minutes and seconds.
  • Custom programmed PIC16F628 microcontroller to control clock operation.

Be informed when new projects are available or additional project information is posted by signing up to our mailing list.

STEPS TO CONSTRUCT CLOCK

1) Select Drive: Find an old hard drive that can spin up when power is connected, you may have to disconnect the 40 pin data cable to see that it can spin up. The drive must spin counter clockwise.

2) Open Drive: Open the drive and see that there are three platters in the unit. We will need three since the top one will have a slot cut into it, the second one will have a piece of white tape (or some other highly reflective material attached. And the third platter will have an index hole drilled into it, this index hole will be used to determine where the slot is when it is spinning. It could still work using a two platter drive but the top of the infrared beam sensor would be visible when a hand is over it.

3) Cut Slot: Remove the screw in the center of the platters, this should allow the platters to be removed. Cut a slot into the 1st platter, I clamped the platter into a vice protecting the surface with cardboard so it wouldn’t scratch. A grinder was then used to cut the grove. It was very easy to cut since it was made of aluminum. NOTE: The top platter that I ended up using was from a more modern drive. The older drive had platters that were dark brown and not very reflective, the modern drive had platters that had a silver mirror finish.

 

For more detail: Hard Drive Clock using PIC16F628

The post Hard Drive Clock using PIC16F628 appeared first on PIC Microcontroller.

A PIC16F84A Alarm Clock

$
0
0

Here is a simple PIC16F84A alarm clock. This page summarizes this discussion (in french) in my forum, where Samir (aka numerique1) requested for help to build a weekly alarm clock for his school. Many thanks to him for his tests and patience.

A Alarm Clock

This clock counts seconds, minutes, hours and day of the week.
Time is displayed on 4 seven segment LED displays, and is adjustable with three buttons at start time (up, down, enter).
You can program the day of the week, hour, minute and duration of the alarms.
The number of alarms are limited by ROM space only.
The alarm is on the RA4 open collector output of the PIC, and is repeated on a decimal point of the display.

For once, the program is in BASIC (mikroBasic) and I hope it will make a good start for beginners.

First, the BASIC source code.

Schematic A Alarm Clock

Note that you can build it either for common cathod or common anode LED display.

 

For more detail: A PIC16F84A Alarm Clock

The post A PIC16F84A Alarm Clock appeared first on PIC Microcontroller.

Viewing all 218 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>