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

PicBasic and PicBasic Pro programming

B ASIC is one of the oldest and one of the easiest pr o g ramming languages to lea r n. Y ou should be a b le to lea r n and pr o g ram in B ASIC in less than an hou r . In this chapte r , w e shall be looking at the principles of pr o g ramming PIC microcontrollers using the PicBasic and PicBasic Pro lan- guages. Both these languages are v e r y similar to the standard B ASIC language but th e y h a v e some modi f ied and some additional inst r uctions speci f ical l y for microcontroller pr o g ramming. Both PicBasic and PicBasic Pro languages h a v e been d e v eloped b y the microEngineering Labs Inc. PicBasic is a l o w e r -cost, simpler language than PicBasic Pro and it is aimed at students and hob b yists. PicBasic Pro is more e xpens i v e, aimed at professionals, and includes additional com- mands for more ad v anced inst r uctions. T a b le g i v es a list of the comparison of PicBasic and PicBasic Pro languages. Before w e pro- ceed to the chapter...

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...

timer_500mS

Code Breakdown: 1. Preprocessor Directives: #include <pic.h> : Includes the header file pic.h , which contains definitions and declarations specific to PIC microcontrollers. 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. 3. main() Function: Initialization: TRISC = 0; : Configures PORTC as output pins. PORTC = 0; : Clears the output pins on PORTC. 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 ...