Skip to main content

Real Time Clock 01

Code Breakdown:


1. Preprocessor Directives:

  • #include <pic.h>: Includes the header file pic.h, which contains definitions and declarations specific to PIC microcontrollers.
  • #define _XTAL_FREQ 4000000: Defines a preprocessor constant _XTAL_FREQ with the value 4000000, representing the crystal frequency in Hertz. This value is used by the compiler to calculate delay times and other timing-related calculations.

2. Variable Declarations:

  • unsigned char count = 0;: Declares an unsigned character variable count and initializes it to 0. This variable is used to keep track of the number of 50ms intervals that have elapsed since the last second change.
  • unsigned char sec = 0;: Declares an unsigned character variable sec and initializes it to 0. This variable represents the current seconds value displayed on the seven-segment display.

3. main() Function:

  • Initialization:

    • TRISA = 0;: Configures PORTA as output pins.
    • TRISB = 0;: Configures PORTB as output pins.
    • TRISC = 0;: Configures PORTC as output pins.
    • ADCON1 = 0x07;: Configures the analog-to-digital converter (ADC) module.
    • RA1 = 1; RA2 = 1; RA3 = 1; RA5 = 1;: Activates the common anode segments of the seven-segment display.
    • T0CS = 0;: Selects the internal clock source (Fosc/4) for TMR0.
    • PSA = 0;: Assigns the prescaler to TMR0.
    • PS2 = 1; PS1 = 1; PS0 = 1;: Sets the prescaler to 256, providing a timer tick every 50 milliseconds.
    • TMR0 = 61;: Initializes TMR0 with the value 61 to generate a 50ms delay.
    • RC0 = 1;: Sets the output on RC0.
  • Main Loop:

    • while (1) { ... }: The main loop continues indefinitely.
    • Interrupt Handling:
      • if (T0IF) { ... }: Checks if the TMR0 interrupt flag is set.
      • TMR0 = 61;: Reloads TMR0 with the value 61 to start another 50ms delay.
      • count++;: Increments the count variable.
      • if (count == 20) { ... }: Checks if 20 50ms intervals have elapsed (1 second).
        • RC0 = !RC0; RC5 = !RC5;: Toggles the RC0 and RC5 outputs.
        • seconds++;: Increments the seconds variable.
        • if (seconds == 10) { seconds = 0; }: Resets the seconds variable to 0 if it reaches 10.
        • T0IF = 0;: Clears the TMR0 interrupt flag.
    • Display Update:
      • switch (seconds) { ... }: Uses a switch statement to select the appropriate seven-segment display pattern based on the current seconds value.
      • The case statements within the switch block assign the corresponding pattern to PORTB to display the seconds on the seven-segment display.

Explanation:

The code implements a digital clock that displays the seconds on a seven-segment display. The main components of the code are:

  • Timer Initialization: TMR0 is configured as an internal timer with a prescaler of 256, providing a timer tick every 50 milliseconds.
  • Interrupt Handling: The TMR0 interrupt is used to increment a counter and update the seconds display.
  • Display Logic: The switch(sec) statement controls the seven-segment display outputs based on the current seconds value.



#include <pic.h>
#define _XTAL_FREQ 4000000


unsigned char count=0;
unsigned char sec=0;
void main()

{
TRISA=0;
PORTA=0;
PORTB=0;
TRISB=0;

TRISC=0;    // PORTC output
PORTC=0;   

ADCON1=0x07;
RA1=1;        // digit 1 on
RA2=1;
RA3=1;
RA5=1;



T0CS=0;        // Internal Mode (Fosc/4)
PSA=0;        // Prescaler assigned to TMR0
PS2=1;
PS1=1;
PS0=1;   
   
TMR0=61;    // (256-195=61) for 50mS time
RC0=1;        // output on

while(1)   
{
    if(T0IF==1){
    TMR0=61;
    count++;
        if (count==20){

    RC0=!RC0; //RC0 toggle
RC5=!RC5;
        sec++;
            if (sec==10)
            {
            sec=0;
            }
            T0IF=0;   
        }   

   
    }

        switch(sec)
        {
   
        case 0:
        PORTB=0x3F;
        break;
       
        case 1:
        PORTB=0x06;
        break;
   
        case 2:
        PORTB=0x5B;
        break;
   
        case 3:
        PORTB=0x4F;
        break;
   
        case 4:
        PORTB=0x66;   
        break;
       
        case 5:
        PORTB=0x6D;
        break;
   
        case 6:
        PORTB=0x7D;
        break;
   
        case 7:
        PORTB=0x07;
        break;

        case 8:
        PORTB=0x7F;
        break;

        case 9:
        PORTB=0x6F;
        break;
        }

        //T0IF=0;   
    }

   
}



Comments

Popular posts from this blog

ANALOGUE to DIGITAL (A/D) Converter in PIC16F87X Series

ANALOGUE to DIGITAL (A/D) Converter What is a Sample & Sample rate? A "sample" is a single measurement of amplitude. Sample rate is simply the number of samples (or measurements of amplitude) taken per second. Sampling Intervals Quantization The samples are assigned a binary number approximating their sampled value. Quantizing divides up the sampled voltage range into 2n-1 quantizing intervals, where “n” is the number of bits per sample (the sampling resolution). For example, an 8-bit system can identify 28 (256) discrete sampled signal values (255 quantizing intervals). The amplitude of such a signal can occupy the entire quantizing range. A/D Reference Voltages Successive Approximation A/D Example 1 Example 2  Example 3 A/D Converter Modules in PIC16F87X series 28-pin devices has 5 modules. (AN0-AN4)         PIC16F873        PIC16F876 4...

Other PicBasic commands 01

W e shall n o w brief l y look at the remaining PicBasic commands in alphabetical order w hich are useful during the pr o g ram d e v elopment. More details about these commands can be obtained from the PicBasic manual. EEP R OM EEP R OM Location, (constant, constant,….., constant) Thi s comman d store s constant s i n consecut i v e b yte s i n on-chi p EEP R O M memo r y . Th e command on l y w ork s wit h th e PI C microcontroller s tha t h a v e EEP R OM , suc h a s th e PIC16F84 , PIC16F877, etc . Locatio n i s optional , an d i f omitte d th e f irs t EEP R O M locatio n i s assumed . Constant s ca n be numeri c constant s o r strin g constants . String s ar e store d a s consecut i v e b yte s o f ASCI I v alues . An e xampl e i s g i v e n bel o w . EEP R OM 3, (5, 2, 8)        ‘ Store 5 in location 3, ‘ 2 in location 4, and 8 in ‘ location 5 END END St...

Voltmeter

This code to read an analog temperature sensor, convert the reading to a digital value using the ADC, and display the temperature on a 4-digit 7-segment display. The display is updated periodically based on a timer interrupt. 1.Initialization: Setting up ports, configuring ADC, and Timer0. 2.Infinite Loop: Continuously reads analog input and updates the display. 3.ADC Conversion: Reads analog voltage from a sensor. 4.Voltage Calculation: Converts ADC value to voltage. 5.Digit Extraction: Extracts individual digits from the temperature/voltage value. 6.Display Function: Displays the digits on a 4-digit 7-segment display with slight delays. --------------------------------------------- #include <pic.h> // Include the header file for PIC microcontroller family. unsigned char PORTB_value[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // Array containing values for 7-segment display. unsigned int a2d_value,temp; // Variables for analog to digital conversion and temporary sto...