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”
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
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.
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.
nak tanya, lcd ni jenis apa?
fatimah, ni LCD 20X4. Program sama je dgn LCD 16X2.
ADCON0=0b00000001;
ADCON1=0b10000000;
ADCON0=(ADCON0&0xC7)|(channel<<3);
boleh tak terang macam mana nak set ni?
fatimah, setting ADCON0, ADCON1 boleh lihat bit dan table di atas atau lebih lanjut di datasheet. Setting tu right justify, all analog input.
cmne nk buat coding kalau kita ade 3 analong input..
blh terang x?
pizi, nak baca 3 analog
sensor1=read_a2d(0);
sensor2=read_a2d(1);
sensor3=read_a2d(2);
assalamualaikum, mcm mne nk sambungkan ADC dengan 7segments ye?
ws, yui. Nak sambungkan 7 segment tgk Lesson 7 Segment.
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.
Terima kasih.. Masalah dpt diatasi..
Sy menukarkan ADG0 kepada GO..
salam..
nak tnye programming yg d’tjknan boleh ke d’gunakan dlm mplab??
w/salam, darimi89. Memang program ni menggunakan software MPLab.
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??
w/salam, darimi89. Dapatkan semua header kat sini.
salam..
dah jmpa haeader file tu ..terima kasih
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?
w/salam, mtaufiq23. 5235%1000 tu bahagi, lepas tu kira bakinya memang lah dpt baki 235.
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?
sy dpt da wat…tq saudara atas tutorial ini…
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
w/salam, darimi89.
Tu sebab V9.70, saya gunakan yg terbaru V9.83.
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
w/salam. Download drpd microchip.com.
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??
w/salam, saya x tahu error sebab apa.
salam..
saya dah dapat build programming d’atas dgn success..saya tak perasaan ..programming tu sudah d’up date..
terima kasih En.Shahrul
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
w/salam, saya x tahu sebab apa.
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??
w/salam, darimi89. Connection LCD semua sama sebab menggunakan Header file yang sama.
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 🙂
mona, kalau nak display ADC kat LED lebih senang. Terus je assign ADC result ke PORT.
blh x encik shahrul tlg bg 1 contoh program ADC ke LEDs. minta tolong.
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.
w/salam, source code not for free.
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.
w/salam, Bella. X de suggestion. Kena troubleshoot depan mata baru tahu.
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
w/salam, Bella. Saya x tahu, kena tiru skematik yg saya buat.