Tuesday, November 8, 2011

Tutorial 5.4 : Penerangan ( Source Code )

Assalamualaikum semua,

Pertama sekali, saya meminta berbanyak maaf atas kelewatan menyambung tutorial v5.x kali ini.

Ok saya akan terangkan fungsi souce code seperti berikut:

#include < pic.h >

Arahan ini mesti ada dan perlu berada di barisan paling atas/awal dalam setiap fail C untuk hitech c. '#include' adalah untuk memasukkan header 'pic.h' semasa proses compile di jalankan. Proses compile adalah proses untuk menukarkan bahasa C kepada bahasa mesin/hex code. Hanya bahasa mesin/hex code akan difahami oleh micro controller PIC dan PIC akan menjalankan fungsi-fungsi yang terkandung dalam hex code tadi.

fail 'pic.h' mengandungi ringkasan-ringkasan / alamat hardware di dalam PIC ( seperti alamat PORTA atau alamat PORTC.1 dan seterusnya ). Untuk kefahaman lanjut, sila buka fail 'pic.h' menggunakan MPLAB IDE atau notepad.


__CONFIG(0x2FE4);
__CONFIG(0x3FFF);


Ini adalah config untuk PIC. Sila rujuk tutorial 4.x untuk kefahaman yang lebih terprinci.


#define BUTTON1 RC1

Ini arahan untuk mentakrifkan/menamakan/aliaskan hardware PIC ( dalam kes ini adalah PORTC.1 / RC1 ) kepada nama lain iaitu 'BUTTON1'. Di dalam program ini, kita akan meng
gunakan nama BUTTON1 sebagai gantinama kepada 'RC1'.

Kelebihan menggunakan gantinama adalah kita boleh letak nama yang mempunyai maksud/menjelaskan fungsi tertentu dan juga jika kita hendak tukar pin yang lain (katakan jika tak mahu guna port RC1 dan ingin mengubahkan kepada port RC0), kita hanya perlu menukarkan arahan di atas sahaja ( kepada #define BUTTON1 RC0 ) dan isi program yang lain tidak perlu dipinda.


main(void)
{
..... apa-apa arahan/semu arahan
}

Ini adalah fungsi di mana setiap fail C akan bermula ( semua bahasa C termasuklah Hitech C, CCS C, mikro C dan sebagainya ).

Sebenarnya fungsi 'main' yang standard adalah seperti dibawah:

void main(void)
{
..... apa-apa arahan/semu arahan
}

Oleh kerana 'void' itu bermaksud secara lebih kurang adalah 'abai' maka fungsi main ini boleh juga di ringkas seperti di bawah:

main( )
{
..... apa-apa arahan/semu arahan
}


Untuk fungsi dalam bahasa C, saya akan sentuh lebih mendalam dalam tutorial-tutorial yang seterusnya ( dengan menggunakan contoh-contoh supaya senang faham ).


unsigned int i;

Untuk set pemboleh i sebagai integer tanpa sign. Bila i diset seperti ini, i boleh dimasukkan dengan nilai 0 sehingga nilai 65,535. Jika di setkan sebagai :

signed int i;

Ini bermaksud/diset i bernilai -32,768 sehingga +32,767. Sila rujuk url di bawah untuk kefahaman lebih terprinci.

http://www.ucblueash.edu/koehler/comath/13.html


ANSEL = 0;
ANSELH = 0;


ANSEL adalah ringkasan kepada Analog Select untuk byte yang rendah (lower byte) dan ANSELH adalaha Analog Select Higher Byte. Insya Allah, saya akan sentuh lebih lanjut berkenaan dengan ANSEL dan ANSELH di dalam tutorial untuk ADC ( Analog to Digital Converter ) yang akan datang berserta dengan contoh untuk kefahaman yang lebih mendalam.

Di dalam tutorial ini, kita setkan ANSEL dan ANSELH = 0 adalah untuk mematikan/disable fungsi ADC untuk pin-pin tertentu ( pin yang berkongsi fungsi analog ... contoh pin A0/AN0 .. AN0 adalah analog 0/pin analog yang pertama). Jika tidak di matikan fungsi Analog, pin-pin yang berkenaan tidak dapat berfungsi dengan normal sebagai masukan/keluaran Digital (Digital I/O).


TRISD = 0;
PORTD = 0;

TRISD = 0 .... bermaksud PortD ( RD0 - RD7 ) diset sebagai output ( TRISD = 0 = 0b00000000 = 0x00). 0b .. bermaksud binary ( iaitu nilai 0 atau 1 ), 0x ... bermaksud hex/perenambelasan ( nilai 0 - F ). Jika TRISD = 1 = 0b00000001 = 0x01 ... ini bermaksud hanya pin RD0 diset sebagai digital input manakala RD1 - RD7 diset sebagai digital output. Secara mudahnya jika 0 bermaksud diset sebagai (o)utput (digital output) dan jika 1 bermaksud diset sebagai (i)nput ( digital output ). Bila sesuatu port diset sebagai digital input, port tersebut akan menerima input samada nilai 0 ( 0 volt ) atau 1 ( 2.2V - 5v ). Sila rujuk datasheet untuk keterangan lanjut berkenaan voltan setara untuk nilai 0 dan nilai 1.

Manakala PORTD =0 bermaksud PORTD dengan nilai 0 = 0b00000000 = 0x00 ( semua pin RD0 - RD7 ... 0 volt ) ... dengan kata lain, semua LED yang bersambung kepada PORTD akan padam ( sebab 0 volt ). Jika PORTD = 1 = 0b00000001 = 0x01 ... maka LED yang disambung ke pin RD0 akan menyala manakala LED-LED yang bersambung ke RD1 - RD7 padam.

TRISB = 15;
PORTB = 0;


TRISB = 15 = 0b00001111 = 0x0F ... bermaksud pin RB4 - RB7 diset sebagai digital output dan pin RB0- RB3 di set sebagai digital input ( terima nilai 0 atau 1 ).

PORTB = 0 = 0b00000000 = 0x00 ... semua LED yang bersambung ke RB0 - RB3 padam. Pin RB4- RB7 tidak terjejas.


for(;;) {
.... arahan-arahan lain
....
}

Satu kaedah untuk loop tanpa henti selain menggunakan while(1) { ... }.


if(BUTTON1 == 1) // No. 1
{
PORTD = 0b10101010; // No. 2
for(i = 50000 ; --i ;) continue; // No. 3
PORTD = 0; // No. 4
}

Arahan ' if(BUTTON1 == 1)' rujuk no. 1, bermaksud jika Button1 = 1 maka arahan - arahan dalam { ... } semuanya akan dilaksanakan oleh microController PIC ( PIC ) dan sebaliknya.

Button1 = 1 bila butang yang bersambung dengan port RC1 ditekan. Bila butang tersebut ditekan, maka isyarat 5V akan di masukkan ke Port RC1 dan bila terdapat isyarat 5V di port tersebut, PIC akan menyatakan bahawa masukan di port RC1 adalah 1. Button1 = RC1 = 1.

Rujuk no. 2, LED yang di sambung kepada PortD ( RD0 - RD7) akan menyala berselang seli ( RD7 = 1 = LED D1 = menyala, RD7 = 0 = LED D2 = padam. RD7 = 1 = 5V (yang menyebabkan LED D1 menyala)

No 3 sebagai delay dengan cara tolak nilai 1 satu demi satu sehingga nilai = 0. Kemudian pergi ke arahan seterusnya.

No 4 setkan PortD = 0 = 0b00000000 = semua LED D1 - D8 = padam.


if(RB0 == 1)
{
PORTD = 0b00001111; // No. 1
for(i = 50000 ; --i ;) continue;
PORTD = 0;
}


No. 1 setkan portD = 0b00001111 = LED D1 - D4 menyala dan D5 - D8 padam. Yang lain adalah sama prinsip dengan yang sebelumnya.


if(RB1 == 1)
{
PORTB = 0b11110000; // No. 1
for(i = 50000 ; --i ;) continue;
PORTB = 0; // No. 2
}


No.1 ... LED di PortB.7/RB7 sehingga RB4 akan menyala sebab TRISB = 0b00001111 (hanya RB7-RB4 diset sebagai output dan selainnya sebagai input)

No.2 ... PORTB = 0 = 0b00000000 - semua LED (port RB7 - RB4) di PORTB padam. RB3-RB0 tak terjejas sebab ia diset sbg input/masukan

Sekian terima kasih atas kunjungan semua.

1 comments:

Unknown said...

Boek doh bang

Post a Comment