Menu

728x90

468x60

Navbar

Friday, November 10, 2023

PIC16F84A Simple Frequency Meter With LCD Using XC8

Frequency meter can be made using a conventional digital ICs with a big size, and complicated circuit connection. A small 8-bit micro-controller could do this job using a low level Assembly language or even a higher level C language.

In this example, I use an 8-bit PIC16F84A micro-controller to count external TTL input pulse. The total count will update for every seconds.

PIC16F84A Simple Frequency Meter With LCD Using XC8
Simulating Program


I use RA4/T0CKI (Timer0 External Clock Input) pin to count external TTL pulse. Since Timer0 is only 8-bit wide the maximum counting is only 255 counts. So I add Timer0 Interrupt to increase the maximum counts. I use XC8 built-in delay function to create a precise 1000 ms (1 second) delay before the summation of external pulse is evaluated. A 16x2 character LCD is suitable for this example.

  1. #include <stdio.h>
  2. #include <xc.h>
  3.  
  4. #define _XTAL_FREQ 4000000UL
  5.  
  6. #include "LCD4Bits.h"
  7.  
  8. void tmr0Init(void){
  9. PORTA=0;
  10. TRISA4=1;
  11. T0CS=1;
  12. T0SE=0;
  13. PSA=1;
  14. OPTION_REGbits.PS=0;
  15. T0IE=1;
  16. GIE=1;
  17. T0IF=0;
  18. }
  19.  
  20. long TMR0H=0;
  21.  
  22. void interrupt T0_ISR(void){
  23. if(T0IF){
  24. TMR0H+=1;
  25. T0IF=0;
  26. }
  27. }
  28.  
  29. int main(void){
  30. unsigned char freq[10];
  31. uint32_t temp=0;
  32. PORTB=0;
  33. TRISB=0;
  34. lcdInit();
  35. tmr0Init();
  36. lcdXY(4,1);
  37. lcdString("PIC16F84A");
  38. lcdXY(1,2);
  39. lcdString("Frequency Meter");
  40. __delay_ms(1000);
  41. lcdCommand(CLEAR_SCREEN);
  42. __delay_ms(5);
  43. lcdXY(4,1);
  44. lcdString("Frequency:");
  45. TMR0H=0;
  46. TMR0=0;
  47. while(1){
  48. __delay_ms(1000);
  49. temp=(TMR0H<<8)+TMR0;
  50. lcdXY(6,2);
  51. sprintf(freq,"%uHz ",temp);
  52. lcdString(freq);
  53. TMR0H=0;
  54. TMR0=0;
  55. }
  56. return 0;
  57. } 

I can not test it on bread-board because this chip was burn out. And I only have some newer PIC chips. So this program can only be tested using a simulator like Proteus. We can use another PIC chip like the PIC16F628A, and CCS PICC compiler. 

PIC16F84A Simple Frequency Meter With LCD Using XC8
Resource Usage

 

This program require 69.5% of program memory, and 89.7% of data memory. Click here to download this example.


 

No comments:

Post a Comment

336x280

Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (133) Distance Sensor (3) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (76) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Module PCB (1) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (10) PCD8544 (3) PCF8574 (10) PIC (108) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (13) SH1106 (3) Shift Register (13) Shift Registers (10) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)