PIC Lesson: ADC


ADC bermaksud Analog To Digital Converter. ADC Module adalah fungsi dalam PIC yang membolehkan PIC membaca analog input. Oleh itu, sistem design tidak memerlukan chip tambahan untuk menukarkan analog voltage kepada digital. ADC Module di dalam PIC akan menukarkan analog voltage tersebut kepada digital dan disimpan didalam addressnya.

Analog input hanya terdapat di beberapa pin PIC sahaja. Untuk PIC 28pin, mempunyai 5 analog input dan PIC 40/44pin mempunyai 8 analog input. Antara address-address yang terlibat untuk ADC Module adalah A/D Result High Register (ADRESH), A/D Result Low Register (ADRESL), A/D Control Register 0 (ADCON0) dan A/D Control Register 1 (ADCON1).

ADC Module mempunyai high-voltage reference (VREF+) dan low-voltage reference (VREF-). Nilainya boleh dipilih daripada VDD, VSS, RA2 atau RA3. ADC Module akan membaca voltage pada salah satu antara Channel 0-7 (AN0-AN7).

Selepas ADC Module menukarkan analog voltage, ia akan menyimpan 10bit data di address ADRESH dan ADRESL dalam bentuk 10bit. Hasilnya bergantung kepada justification sama ada disimpan di bahagian kanan atau kiri.

Dibawah adalah videonya.

PIC Source Code

/*
Project: Analog-to-Digital Lesson
Programmer: Shahrulnizam Mat Rejab
PIC (Crystal Frequency):
PIC16F877A (20MHz), PIC16F887 (20MHz), PIC16F1939 (Internal 32MHz) 
PIC18F4520 (10MHz), PIC18F4550 (10MHz), PIC18F46K22 (Internal 16MHz)
Compiler: HI-TECH C for PIC10/12/16 V9.83, PIC18 V9.80
Last Modified: 8 November 2013
Website: http://shahrulnizam.com
*/

#define	ADC
#define	HD44780
#define LCD16X2
//#define LCD20X4

#include "LibraryHardware.h"
#include "LibraryPeripheral.h"
#include "LibraryUniversalDisplay.h"

void setup()
{
initialize();
TRISA=0b00000001;
TRISB=0b00000000;
TRISC=0b00000000;
TRISD=0b00000000;
TRISE=0b00000000;
BUZZER=1;
adc_init(0);
lcd_init();
#if defined (LCD16X2)
    lcd_goto(0,0);
    lcd_string("   ADC LESSON   ");
#elif defined (LCD20X4)
    lcd_goto(0,0);
    lcd_string("     ADC LESSON     ");
#endif
}

void loop()
{
int value[2];
value[0]=adc_read(0);
value[1]=(int)(4.888*value[0]);

#if defined (LCD16X2)
    lcd_goto(0,1);
    lcd_string("VOLTAGE: ");
    lcd_number(value[1]/1000,DEC,1);
    lcd_string(".");
    lcd_number(value[1]%1000,DEC,3);
    lcd_string("V ");
#elif defined (LCD20X4)
    lcd_goto(0,1);
    lcd_string(" VOLTAGE: ");
    lcd_number(value[1]/1000,DEC,1);
    lcd_string(".");
    lcd_number(value[1]%1000,DEC,3);
    lcd_string("V    ");

    lcd_goto(0,2);
    lcd_string(" BINARY : ");
    lcd_number(value[0],BIN,10);

    lcd_goto(0,3);
    lcd_string(" DECIMAL: ");
    lcd_number(value[0],DEC,4);
    lcd_string("      ");
#endif
delay(100);
}

44 responses to “PIC Lesson: ADC”

  1. minta maaf..boleh x saudara terangkan sedikit pasal code2 ni..sy paham jalan kerjanya..tp bile nak buat coding balik…xboleh.

    terima kasih atas perhatian saudara

  2. car-tok, agak susah nak terangkan dgn tulisan, kena dgn percakapan. Kalau nak fahamkan tu, kene baca datasheet PIC16F877A, datasheet LCD dan buat program banyak2 kali.

  3. salam.. saya nak tnya ttg coding tok PIC16F877 using LM35.
    1.coding juz nak detect temperature.
    2.use 3 led,green(detect normal temp) yellow (berjaga2) n red(bahaya).
    3. each led ada tahap temp yg dia detect,green(80).

    • Nak program LM35, baca je analog voltage. Pastu calibrate suhu mengikut datasheetnya. Daripada nilai ADC, boleh buat range untuk nyalakan mana2 LED.

  4. Salam.. Sy cuba compile source code, tetapi ada error apabila MPLAB mambaca “ADG0”.
    Adakah sy tidak setting MPLAB dgn betul atau ada fail yg tercicir?

    • ws, halimzainudin.
      Masalah tersebut kerana berbeza Hi-Tech version. Ada version yg declare dgn nama lain. Kalau nak check, cuba search file pic.h, kemudian lihat define file pic yang digunakan. Nama lain misalnya gantikan ADGO kpd GODONE.

  5. salam..

    saya ada soalan…

    1)boleh tak saya dapatkan “LibraryPIC40pin.h”,”LibraryHD44780.h” dan “LibraryADC.h” kerana project yg d’tjkkan lebih kurang sama dgn task yg saya terima…dan saya masih baru dalam programming.

    2)utk task saya..saya guna lcd 16×2..boleh ke saya guna libraryHD4470.h utk lcd saya??

  6. salam saudara, knp wat 5235%1000(ans=0.235) boleh dpt 235 tp klau sy wat 1000%235(ans=4.255) x dpt pun output value 255 tersebut kat display lcd…sy check kat lam address memory pic pun dpat value bukan 255…knp eh?

  7. habis tu mcm mana plak nak dispay baki 255 utk 1000%235 kat lcd…ade cara lain ke ?sbb x bleh guna % utk no ni…boleh ajar x?

  8. salam…

    saya nak tnye..knpe bile saya built programming di ats ..dia keluar

    (1273) Omniscient Code Generation not available in Lite mode (warning)
    HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.70
    Copyright (C) 2009 Microchip Technology Inc.
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 25. constant operand to || or &&
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 26. constant operand to || or &&
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 27. constant operand to || or &&
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 28. constant operand to || or &&
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 30. constant operand to || or &&
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 31. constant operand to || or &&
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 32. constant operand to || or &&
    Warning [750] C:\PIC Hands-on\Darimi\trial\LibraryHD44780.h; 33. constant operand to || or &&
    Warning [1355] C:\PIC Hands-on\Darimi\trial\sharulcoding1.c; 47. inline delay argument too large
    Error [800] sharulcoding.as; 45. undefined symbol “LVP_OFF”
    Error [800] sharulcoding.as; 45. undefined symbol “BOREN_OFF”
    Error [800] sharulcoding.as; 45. undefined symbol “PWRTE_ON”
    Error [800] sharulcoding.as; 45. undefined symbol “WDTE_OFF”
    Error [800] sharulcoding.as; 45. undefined symbol “FOSC_HS”
    Error [800] sharulcoding.as; 1437. undefined symbol “__delay”

    ********** Build failed! **********

    knpe?? adakah d’sbbkan b’lainan versi compiler?? boleh saudara shahrul beri p’dapat

  9. salam..

    saya dah puas cari compiler v9.83…masih x jmpa..
    boleh tak En.Shahrul kasi link dekat saya di mane nak download compiler V9.83

  10. salam..

    saya masih tak dapat build dgn success programming di atas walaupun saya pakai V9.83..dia tulis..

    HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode) V9.83
    Copyright (C) 2011 Microchip Technology Inc.
    Licensed for evaluation purposes only.
    This licence will expire on Sun, 24 Jun 2012.
    Error [1346] ; 0. can’t find 0x2 words for psect “config” in class “CONFIG” (largest unused contiguous range 0x1)

    ********** Build failed! **********

    En.Shahrul tahu tak error ni d’sbbkan ape??

  11. salam..

    saya dah dapat build programming d’atas dgn success..saya tak perasaan ..programming tu sudah d’up date..
    terima kasih En.Shahrul

  12. salam..

    En.Shahrul..saya nak tnye..saya telah cuba 2 programming En.Shahrul 1) programming di atas dan 2) programming scrolling text..

    saya try burn programming tu ke dlm PIC saya..tetapi ada error..walaupun saya dapat build success utk k’dua pragramming..saya guna PICKIT2 V2.61 utk burn programming..

    error yg keluar ialah
    programming failed at program memory address 0x000002

    boleh En.Shahrul bagi p’dapat

  13. salam..

    En.Shahrul ..adakah connection antara PIC dgn LCD utk programming d’atas sama dgn connection yg d’tjkkan d’dlm PIC:lesson LCD HD44780??

  14. Maaf. Saya ingin bertanya. Video di atas bit by bit and show on LCD. Bagaimana pula kalau saya ingin buat program ADC juga tetapi output pada LEDs (8 LEDs, bit by bit). Terima Kasih. Semoga En Shahrul di murahkan rezki kerana sifat anda yg suka membantu 🙂

  15. Assalam. y dont u provide the source code? i believe a lot of people would like to know and that will be the good lesson. Plus, if they want to modifiy the code, its all up to them. u have a talent to do a source which not many people having it. So lets just share. Our community cannot be developed if ppl dont want to share.

  16. Salam abg shahrul. Saya cbe buat program utk bace nilai adc. gune potentiometer 5k. PIC16f877a. dan LCD 2×16. tp bila saya run. di LCD tu, die keluar character cmni. Cc##?###…. lebih kurang cm2 la. saya vary potentiometer, die kluar character lain pulak. sbg pro, ada suggestion x? (:
    tq.

  17. Assalam abg shahrul. sy dah dpt solve hari 2 punye problem. cume kene tambah delay jek. Cme nk tanya. Knape ye kalau saya cabut usb programmer tu, dia dah xdisplay dah adc value kt LCD tu. sedangkan saya x ttup pun MCLR target kt MPLAB tu. Boleh bantu x? trima kasih banyak2

Leave a Reply

Your email address will not be published. Required fields are marked *