Upload
phammien
View
213
Download
0
Embed Size (px)
Citation preview
64
V dengan 2 resistor seperti tampak pada Gambar III.30 (a) di atas. Pin-pin
masukan CC1100 yang dimaksud adalah SI, CS, dan SCK. Sehingga konfigurasi
antar muka pin-pin pada mikrokontroler dan transceiver dapat dilihat pada
Gambar III.30 (b) di atas. Semua interkoneksi dari ATMega128 ke CC1100 diberi
tanda kotak dengan artian interkoneksi tersebut membutuhkan rangkaian pada
Gambar III.30 (a). Pin GDO2 CC1100 terhubung ke mikrokontroler pada 2 pin,
pin masukan (PINB.5) dan pin interupsi (INT0). Maksud interkoneksi ini akan
dijelaskan lebih lanjut pada bagian perancangan perangkat lunak. Skematik PCB
antarmuka dapat dilihat pada Gambar III.31 di bawah ini.
Gambar III.31. Desain rangkaian sub-sistem transceiver RF.
III.7.2 Implementasi
Gambar III.32. Tata letak komponen sub-sistem transceiver RF.
65
Implementasi rangkaian antarmuka transceiver RF dilakukan secara manual
dengan menggunakan PCB Matriks dengan pertimbangan kesederhanaan
rangkaian dan waktu implementasi. Sedangkan untuk PCB modul transceiver
CC1100, tata letak dan daftar komponennya dapat dilihat pada Gambar III.32 dan
Tabel III.7 di bawah ini. Implementasi sub-sistem transceiver berupa rangkaian
antarmuka dan interkoneksi dengan modul CC1100 dapat dilihat pada Gambar
III.33 di bawah ini. Setelah semua sub-sistem terimplementasi, langkah
selanjutnya adalah proses interkoneksi antar sub-sistem dan integrasi sistem.
Tabel III.7. Daftar komponen sub-sistem transceiver RF.
Komponen Nilai @ 433 MHz Keterangan C51 100 nF Decoupling capacitor C81, C101 27 pF Crystal loading capacitor C121, C131 3.9 pF RF balun / matching capacitor C122 8.2 pF RF LC filter capacitor C123 5.6 pF RF LC filter capacitor C124, C125 220 pF RF DC blocking capacitor L121, L131 27 nH RF balun / matching inductor L122 22 nH RF LC filter inductor L123 27 nH RF LC filter inductor R171 56 kΩ Internal bias resistor for current reference XTAL 26 MHz Crystal oscillator
Gambar III.33. Implementasi sub-sistem transceiver RF.
66
III.8 Integrasi dan Interkoneksi Perangkat Keras
Langkah terakhir dalam perancangan dan implementasi perangkat keras adalah
interkoneksi antar sub-sistem dan integrasi sistem. Catu tegangan dari sub-sistem
catu daya yang disalurkan melalui sub-sistem pengolah data, menjadi masukan
pada sub-sistem sensor dan pengondisi sinyal, transceiver RF, dan penyimpan
data. Untuk jalur data, data sensor-sensor terkondisi pada sub-sistem sensor dan
pengondisi sinyal, data 4-wire transceiver CC1100, dan data memori eksternal,
terhubung dengan sub-sistem pengolah data. Bentuk fisik interkoneksi antar sub-
sistem, dengan menggunakan kabel pita, dapat dilihat pada Gambar III.34.
(a) Sub-sistem sensor (b) Sub-sistem catu daya
(c) Sub-sistem transceiver RF (d) Sub-sistem penyimpan data
Gambar III.34. Interkoneksi antar sub-sistem dengan sub-sistem pengolah data.
Integrasi sub-sistem menjadi sistem perangkat keras (node sensor) secara
keseluruhan dapat dilihat pada Gambar III.35 di bawah ini. Setelah implementasi
satu node, maka dilakukan ekspansi dengan mengimplementasi 3 node tambahan
untuk membangun jaringan satu klaster. Dalam jaringan satu klaster ini, satu node
akan bertindak sebagai kepala klaster dan ketiga node lainnya sebagai anggota
klaster. Secara fungsional, pada kepala klaster terdapat sub-sistem penyimpan
67
data yang tidak terdapat pada node lain. Hal ini dilakukan sebagai antisipasi
ketidakcukupan kapasitas memori utama pada mikrokontroler. Namun fungsi sub-
sistem penyimpan data ini belum tentu dibutuhkan. Sedangkan untuk sub-sistem
lain, kepala klaster dan node sensor memiliki konfigurasi yang sama.
Gambar III.35. Integrasi sub-sistem.
Hasil implementasi empat node tersebut dapat dilihat pada Gambar III.36 di
bawah ini. Pada pengujian sub-sistem di Bab IV, keempat node ini disebut dengan
Board-1 hingga Board-4.
Gambar III.36. Implementasi empat node.
68
III.9 Perangkat Lunak
Perangkat lunak sistem yang dibuat adalah program untuk mikrokontroler.
Pembuatan program dilakukan pada software CodeVision AVR, seperti tampak
pada Gambar III.37 (a). Bahasa program yang digunakan adalah bahasa C. Untuk
memindahkan program yang telah dibuat ke memori flash mikrokontroler, maka
setelah program tersebut di-compile, seperti tampak pada Gambar III.37 (b), bebas
kesalahan bahasa pemrograman, maka program ditransfer menuju mikrokontroler
melalui koneksi pemrograman ISP dengan alat STK200. Jika terdapat kesalahan
pemrograman, maka software CVAVR akan memberitahu letak kesalahannya.
(a) CodeWizard AVR (b) Hasil compile program
Gambar III.37. Tampilan Code Vision AVR.
Pada dasarnya perangkat lunak mikrokontroler yang dikembangkan dengan Code
Vision AVR memiliki bagian-bagian utama sebagai berikut:
- Header dan definisi
- Deklarasi variabel dan fungsi
- Modul-modul fungsi
- Inisialisasi modul perangkat keras
- Program utama
69
#include <mega128.h> #include <math.h> #include <mem.h> #include <delay.h> // Standard Input/Output functions #include <stdio.h> #include <stdlib.h> // Pin I/O For CC1100 Config #define CS PORTB.0 #define SCK PORTB.1 #define DOUT PORTB.2 #define DIN PINB.3 #define GDO0 PINB.4 #define GDO2 PINB.5 // Pin Output For LED #define LED0 PORTD.5 #define LED1 PORTD.6 #define LED2 PORTD.7 // Variable Declaration bit flag_int0,flag_int1,flag_timer0,flag_timer1,flag_timer2,flag_timer3,flag_cs; char m,n,chipstat,datread,datstat,datrburst,packet,crc; char temp[8],display[16],data_sync[8],data_ack[6],sampah[16]; ---dan seterusnya---
Program C di atas adalah contoh header, definisi, dan deklarasi variabel pada
perangkat lunak. Header memuat file-file panduan (library) yang terkait dengan
program yang dibuat. Bagian definisi memuat interkoneksi pin-pin mikrokontroler
dengan variabel-variabel pada program. Bagian modul fungsi dan program utama
akan dijelaskan dengan rinci di bagian selanjutnya. Sedangkan untuk perangkat
keras, modul-modul fungsional mikrokontroler yang harus diinisialisasi, terkait
dengan pengaturan sebagai berikut.
- Pin keluaran pada PORTB.0,1,2 dan PORTD.5,6,7
- Interupsi eksternal pada INT0 dan INT1 (rising edge)
- Timer-0, clock 250 kHz, interupsi overflow, nilai awal = 0x05 (1ms)
- Timer-1, clock 8 MHz, fungsi ICP (rising edge)
- Timer-2, clock 8 MHz, interupsi overflow, nilai awal = 0xF7 (1us)
- Timer-3, clock 125 kHz, interupsi overflow, nilai awal = 0x9E57 (200ms)
- Transmitter USART dengan baud-rate 9600bps
- ADC dengan clock 62.500 kHz dan referensi AREF sebesar 4.6 V
Sesuai dengan segmentasi sistem di awal bab ini, maka perancangan perangkat
lunak dibagi secara bertahap menjadi beberapa proses, yaitu algoritma
pengukuran dan format data sensor, konfigurasi register CC1100, komunikasi 1
dan 2-arah, dan perancangan protokol MAC. Berikut adalah penjelasannya.
70
III.9.1 Algoritma Pengukuran dan Format Data Sensor
Data analog sensor yang sudah terkondisi harus diubah menjadi data digital oleh
ADC. Kanal ADC yang terpakai adalah 2 buah untuk data tekanan dan
temperatur. Implementasi program C dapat dilihat di bawah ini.
#define ADC_VREF_TYPE 0x00 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; void baca_adc(void) //read all adc input in one time directly dtk=0; ratadc1=0; ratadc2=0; read_adc(0x0E); while(dtk<32) adc1=read_adc(0); //pressure adc2=read_adc(1); //temperature ratadc1=ratadc1+adc1; ratadc2=ratadc2+adc2; dtk++; ratadc1=ratadc1/32; ratadc2=ratadc2/32;
Untuk mengurangi fluktuasi nilai akibat kesalahan konversi ADC, maka
digunakan teknik perata-rataan pada data integer hasil konversi. Data yang telah
dirata-rata, diubah menjadi data rentang analog dengan tipe float. Offset sebesar 5
mV akibat teknik perata-rataan dikompensasikan terhadap data digital. Langkah
terakhir adalah mengubah kembali data digital tegangan menjadi data sensor
dengan hubungan masukan-keluaran yang telah diketahui. Untuk data tekanan,
data tegangan diubah menjadi satuan mbar, sedangkan untuk data temperatur, data
tegangan dibagi penguatan op-amp dan diubah menjadi satuan celcius.
Implementasi program C untuk data tekanan dan temperatur dapat dilihat di
bawah ini.
71
void baca_press(void) vadc1=ratadc1*4.60/1024L; vadc1=vadc1+0.0051; //kompensasi ofset averaging volt1=vadc1-0.5; //kompensasi ofset sensor tekanan=volt1*258.5; //tekanan udara dalam mbar void baca_temp(void) vadc2=ratadc2*4.60/1024L; vadc2=vadc2+0.0051; //kompensasi ofset averaging volt2=vadc2*0.1282; //dibagi 7.8 kali gain op-amp suhu=volt2*100; //suhu udara dalam celcius
Sedangkan untuk data sensor kelembaban terkondisi berupa gelombang pulsa,
digunakan fungsi ICP mikrokontroler untuk menghitung frekuensi pulsa tersebut.
Ketika rising edge dari pulsa level positif, program interupsi Timer-1
memasukkan isi register ICR1 pada variabel, begitu pula yang terjadi pada rising
edge pulsa positif berikutnya di variabel yang berbeda, misalkan isi_reg1 dan
isi_reg2. Periode pulsa adalah selisih isi_reg2 dan isi_reg1. Berdasarkan
persamaan pada Gambar III.6, maka nilai kelembaban ( %RH) dapat dihitung.
void baca_hum(void) unsigned int a,temp_L,temp_H,isi_reg1,isi_reg2,selisih; float perioda,waktu,frequency; flag_timer1=0; a=0; waktu=0; while (flag_timer1!=1); //abaikan 1st conversion flag_timer1=0; while (a<32) while (flag_timer1!=1); //nunggu sampai satu temp_L = ICR1L; temp_H = ICR1H; isi_reg1=((temp_H<<8)|temp_L); flag_timer1=0; wile (flag_timer1!=1); temp_L = ICR1L; temp_H = ICR1H; isi_reg2=((temp_H<<8)|temp_L); flag_timer1=0; selisih=isi_reg2-isi_reg1; waktu+=selisih; a++; waktu= waktu/32; perioda= waktu*0.000000125; frequency=1/perioda; //freq=f(RH), y = -13,351x + 7389 lembab=7389-frequency; lembab=lembab*0.0749; //humidity dalam %RH
72
Setelah data digital 3 sensor telah siap, maka hal yang dipikirkan selanjutnya
adalah format data sensor tersebut. Format ini terkait urutan data dan tipe data
yang digunakan. Mengacu pada singkatan PTU untuk Pressure, Temperature, dan
Humidity, maka urutan data yang dirancang adalah data tekanan, data temperatur,
dan data kelembaban. Sedangkan untuk tipe data, ada beberapa pilihan, yaitu:
• Tipe data heksadesimal
Dengan tipe data heksadesimal, maka panjang data yang dirancang adalah
10-bit (tekanan) + 10-bit (temperatur) + 16-bit (kelembaban) = 36-bit = 6 byte.
Panjang data yang dihasilkan minimal, namun pada sisi penerima data,
diperlukan proses untuk mengubah data heksa ini menjadi data displai sensor.
Kesulitan juga terjadi pada masing-masing node untuk melakukan kompensasi
offset sensor, karena karakteristik masing-masing sensor berbeda-beda.
• Tipe data ASCII
Dengan tipe data ASCII, 1 karakter direpresentasikan sebesar 1 byte. Sehingga
untuk rentang data tekanan 0 – 1034 mbar, rentang data temperatur 0.0 –
100.0 oC, dan rentang data kelembaban 0 – 100 %RH, panjang data adalah 12
byte. Panjang data yang dihasilkan maksimal, namun tidak diperlukan proses
tambahan pada sisi penerima data sehingga data dapat langsung ditampilkan.
Kelemahan tipe ini adalah kebergantungan panjang data pada rentang data
sensor yang digunakan.
• Tipe data IEEE-754 (floating point 32-bit)
Dengan tipe data floating point ini, tiap bilangan data direpresentasikan sama
panjang yaitu 4 byte. Sehingga untuk 3 data sensor, panjang data total adalah
12 byte. Selain panjang data yang dihasilkan maksimal, masih diperlukan juga
proses tambahan pada sisi penerima data. Kelebihan tipe ini adalah, panjang
data yang sama untuk data bilangan apapun. Hal ini menyebabkan
mikrokontroler dapat mengolah data sensor apapun tanpa pengaturan ulang.
Berdasarkan kelebihan dan kekurangan tiap pilihan, maka tipe data yang dipilih
adalah tipe data IEEE-754 (floating point 32-bit) karena fleksibilitasnya
menangani berbagai data sensor dengan representasi yang sama, yaitu 4 byte.
Panjang data yang sama ini akan memberi keuntungan pada implementasinya.
73
Dengan menggunakan IEEE-754 Calculator [20], dapat disimulasikan proses
konversi data sensor ke tipe floating point sebagai berikut.
o Data tekanan : 910,208 44 63 8D 52
o Data temperatur : 26,959 41 D7 AD BB
o Data kelembaban : 73,127 42 92 41 3C
Implementasi program C dapat dilihat di bawah ini. Fungsi single adalah adalah
untuk mengubah data tekanan, temperatur, dan kelembaban menjadi tipe floating
point dan memasukkan data-data tersebut pada variabel deret bertipe char.
Sedangkan fungsi elgnis berlaku sebaliknya, untuk mengubah data floating point
pada variabel-variabel deret menjadi data sensor yang siap ditampilkan.
void single(void) unsigned int addr1,addr2,addr3; unsigned char i; int k; addr1=&tekanan; addr1+=3; for(k=0;k<4;k++) i=peekb(addr1); display[k+2]=i; addr1--; ; addr2=&suhu; addr2+=3; for(k=0;k<4;k++) i=peekb(addr2); display[k+6]=i; addr2--; ; addr3=&lembab; addr3+=3; for(k=0;k<4;k++) i=peekb(addr3); display[k+10]=i; addr3--; ;
void elgnis (int z) unsigned int addr4,addr5,addr6; int k; addr4=&nanaket; addr4+=3; for(k=0;k<4;k++) pokeb(addr4,display[k+z]); addr4--; ; addr5=&uhus; addr5+=3; z=z+4; for(k=0;k<4;k++) pokeb(addr5,display[k+z]); addr5--; ; addr6=&babmel; addr6+=3; z=z+4; for(k=0;k<4;k++) pokeb(addr6,display[k+z]); addr6--; ; //Setting printf features: //float,width,precision printf("%-8.0f ",nanaket); printf("%-8.1f ",uhus); printf("%-8.0f ",babmel);
III.9.2 Konfigurasi Register Transceiver RF
Karena menggunakan transceiver yang berupa evaluation kit, maka untuk
menggunakannya, diperlukan akses untuk mengisi register internal transceiver
dan memberi perintah sesuai protokol MAC yang dikembangkan. Diagram
pewaktuan untuk mengakses register CC1100 dapat dilihat pada Gambar III.38.
74
Gambar III.38. Diagram pewaktuan akses register CC1100.
Untuk dapat menulis ke dan membaca dari register CC1100, diperlukan 2 pin
kontrol (CSn dan SCLK) dan 2 pin data (SI dan SO). Pada sisi mikrokontroler, pin
CSn, SCLK, dan SI adalah keluaran, dan pin SO adalah masukan. Terdapat 2
bagian akses, yaitu penulisan alamat register ke CC1100, dan penulisan /
pembacaan isi register oleh mikrokontroler. Pin CSn adalah penanda aktivitas
baca / tulis register dapat dilakukan. Setiap bit data yang ditulis oleh pin SI atau
dibaca oleh pin SO, dilakukan saat clock pada pin SCLK naik positif. Berdasarkan
diagram pewaktuan di atas, maka urutan aksi yang dilakukan untuk mengakses
register CC1100 dapat dirinci sebagai berikut.
1. Inisialisasi
– CSn (1) CSn (0), pertanda aksi dapat dilakukan
– Waktu tunda 200 µs
2. Penulisan alamat register
– SI = A7 = 0 (R/W bit)
– Waktu tunda 5 µs
– SCLK (0) SCLK (1), clock naik
– Waktu tunda 5 µs
– SCLK (1) SCLK (0), clock turun
3. Perulangan no.2 untuk bit alamat A6 sampai A0
4. Waktu tunda 10 µs (antara alamat dan data)
5. Perulangan no.2 dan no.3 untuk bit data D7 sampai D0
6. CSn (0) CSn (1)
75
void write_single_CC1100(char addwrite, char datwrite) char temp1,temp2; char s,t; addwrite=addwrite | 0x00; //Write Bit = 0, Burst Bit = 0 chipstat=0x00; CS=0; delay_us(200); while (DIN!=0); for (s=0;s<8;s++) temp1=addwrite & 0x80; if(temp1==0x80) DOUT=1; else DOUT=0; delay_us(5); SCK=1; addwrite=addwrite << 1; if(temp1==0x80) addwrite=addwrite | 0x01; else addwrite=addwrite & 0xFE; chipstat=chipstat <<1; if(DIN==1) chipstat=chipstat | 0x01; else chipstat=chipstat | 0x00; delay_us(5); SCK=0; delay_us(5); //Delay between Address and Data chipstat=0x00; for (t=0;t<8;t++) temp2=datwrite & 0x80; if(temp2==0x80) DOUT=1; else DOUT=0; delay_us(5); SCK=1; datwrite=datwrite << 1; if(temp2==0x80) datwrite=datwrite | 0x01; else datwrite=datwrite & 0xFE; chipstat=chipstat <<1; if(DIN==1) chipstat=chipstat | 0x01; else chipstat=chipstat | 0x00; delay_us(5); SCK=0; delay_us(5); CS=1;
Implementasi program C dapat dilihat di atas. Proses tersebut merupakan
konfigurasi aksi untuk menulis data ke suatu register secara single. Secara umum,
terdapat beberapa macam konfigurasi akses register CC1100 yaitu:
– Read / Write Single byte Register
– Read / Write Burst Register
– Write Command Strobe
– Read Status Register
76
Perbedaan antar akses register di atas adalah pada nilai bit alamat A7 sebagai bit
tulis (A7=0) atau bit baca (A7=1), dan bit alamat A6 sebagai bit aksi secara single
(A6 =0) atau bit aksi secara konsekutif atau burst (A6=1). Hasil implementasi
setiap macam akses register tersebut dapat dilihat di Lampiran C, dan
performansinya akan diuji pada Bab IV.
Setelah semua register dapat diakses dengan berbagai macam cara, maka langkah
selanjutnya adalah menentukan nilai/isi dari setiap register CC1100. Penentuan
ini berkaitan dengan karakteristik transceiver yang diinginkan. Terdapat 33 buah
register yang harus ditentukan nilainya, baik melalui perancangan maupun
menggunakan nilai awalnya. Parameter-parameter penting transceiver yang
menentukan nilai dari register adalah sebagai berikut.
• Panjang paket variabel dengan panjang maksimum 16 byte
• Perhitungan CRC pada akhir paket
• Skema Modulasi = FSK
• Deviasi frekuensi = 20 kHz
• Frekuensi sinyal pembawa = 433 MHz
• Lebar kanal tapis penerima = 100 kHz
• Data-rate = 38,4 kbps
• Jarak antar kanal = 200 kHz
• Nomer kanal = 0
• Daya keluaran = -10 dBm
Tidak semua register harus diubah nilainya, namun ada beberapa register yang
cukup mengandalkan nilai awalnya. Dalam proses penentuan nilai register dari
parameter-parameter di atas, digunakan bantuan software SmartRF Studio v.6.9.
Nilai lengkap semua register CC1100 dapat dilihat pada Tabel III.8 di bawah ini.
Selain nilai register, dirancang pula format paket data yang digunakan untuk
proses pertukaran data, seperti dapat dilihat pada Gambar III.39 di bawah ini.
Pengaturan Preambule, Sync word, dan CRC dilakukan di level register. Data
field berisi data 3 sensor (tekanan, temperatur, kelembaban) ditambah 2 byte
informasi berisi level RSSI, kualitas LQI, dan status CRC.
77
Gambar III.39. Format paket data.
Tabel III.8. Nilai register-register CC1100. No. Register Alamat Nilai No. Register Alamat Nilai 1. IOCFG2 0x00 0x07 7. CHANNR 0x0A 0x00 IOCFG0 0x02 0x0A 8. DEVIATN 0x15 0x34 2. SYNC1 0x04 0xD3 9. MCSM2 0x16 0x07 SYNC0 0x05 0x91 MCSM1 0x17 0x0E 3. PKTLEN 0x06 0x10 MCSM0 0x18 0x18 PKTCTRL1 0x07 0x0C 10. FOCCFG 0x19 0x15 PKTCTRL0 0x08 0x05 BSCCFG 0x1A 0x6C4. FSCTRL1 0x0B 0x08 11. AGCCTRL2 0x1B 0x03 FSCTRL0 0x0C 0x00 AGCCTRL1 0x1C 0x40 5. FREQ2 0x0D 0x10 AGCCTRL0 0x1D 0x91 FREQ1 0x0E 0xA7 12. FREND1 0x21 0x56 FREQ0 0x0F 0x62 FREND0 0x22 0x10 6. MDMCFG4 0x10 0xCA 13. FSCAL3 0x23 0xE9 MDMCFG3 0x11 0x83 FSCAL2 0x24 0x2A MDMCFG2 0x12 0x83 FSCAL1 0x25 0x00 MDMCFG1 0x13 0x22 FSCAL0 0x26 0x1F MDMCFG0 0x14 0xF8 14. PATABLE Index-0 0x26
void init_CC1100(void) CS=1; SCK=0; LED0=1; LED1=1; LED2=1; printf("CC1100 Configuration - Adam / 23205342\r\n"); delay_ms(1000); //Wait for Chip to be ready void endconfig_CC1100(void) delay_ms(1000); //end of config LED0=0; printf("End of Configuration\r\n");
78
Modul tambahan untuk inisialisasi dan penutup proses, diimplementasi pada
program C di atas. Hasil implementasi program C untuk proses konfigurasi
register CC1100 secara keseluruhan dapat dilihat di bawah ini. Setelah inisialisasi,
IC CC1100 di-reset terlebih dahulu untuk menghapus nilai register sebelumnya.
Penulisan nilai register dilakukan dengan cara single, sedangkan penulisan
pengaturan daya keluaran dilakukan dengan cara burst.
init_CC1100(); write_strobe_CC1100(0x30); //Reset Chip delay_ms(1); write_single_CC1100(0x00, 0x07); //Setting IOCFG2 (CRC Detect) write_single_CC1100(0x02, 0x0A); //Setting IOCFG0 (PLL Locked) write_single_CC1100(0x04, 0xD3); //Setting SYNC1 write_single_CC1100(0x05, 0x91); //Setting SYNC0 write_single_CC1100(0x06, 0x10); //Setting PKTLEN (16 Bytes) write_single_CC1100(0x07, 0x0C); //Setting PKTCTRL1 write_single_CC1100(0x08, 0x05); //Setting PKTCTRL0 (Variable Length) write_single_CC1100(0x0A, 0x00); //Setting CHANNR write_single_CC1100(0x0B, 0x08); //Setting FSCTRL1 write_single_CC1100(0x0C, 0x00); //Setting FSCTRL0 write_single_CC1100(0x0D, 0x10); //Setting FREQ2 write_single_CC1100(0x0E, 0xA7); //Setting FREQ1 write_single_CC1100(0x0F, 0x62); //Setting FREQ0 write_single_CC1100(0x10, 0xCA); //Setting MDMCFG4 write_single_CC1100(0x11, 0x83); //Setting MDMCFG3 write_single_CC1100(0x12, 0x83); //Setting MDMCFG2 write_single_CC1100(0x13, 0x22); //Setting MDMCFG1 write_single_CC1100(0x14, 0xF8); //Setting MDMCFG0 write_single_CC1100(0x15, 0x34); //Setting DEVIATN write_single_CC1100(0x16, 0x07); //Setting MCSM2 write_single_CC1100(0x17, 0x0E); //Setting MCSM1 write_single_CC1100(0x18, 0x18); //Setting MCSM0 write_single_CC1100(0x19, 0x15); //Setting FOCCFG write_single_CC1100(0x1A, 0x6C); //Setting BSCCFG write_single_CC1100(0x1B, 0x03); //Setting AGCCTRL2 write_single_CC1100(0x1C, 0x40); //Setting AGCCTRL1 write_single_CC1100(0x1D, 0x91); //Setting AGCCTRL0 write_single_CC1100(0x21, 0x56); //Setting FREND1 write_single_CC1100(0x22, 0x10); //Setting FREND0 write_single_CC1100(0x23, 0xE9); //Setting FSCAL3 write_single_CC1100(0x24, 0x2A); //Setting FSCAL2 write_single_CC1100(0x25, 0x00); //Setting FSCAL1 write_single_CC1100(0x26, 0x1F); //Setting FSCAL0 //Setting PATABLE Output Power -10 dBm temp[0]=0x26; //-10 dBm CC1100 temp[1]=0x00; temp[2]=0x00; temp[3]=0x00; temp[4]=0x00; temp[5]=0x00; temp[6]=0x00; temp[7]=0x00; write_burst_CC1100(0x3E, temp, 8); delay_us(5); write_strobe_CC1100(0x33); //SCAL delay_ms(1); endconfig_CC1100();
79
III.9.3 Komunikasi 1 dan 2-arah
Untuk melakukan komunikasi nirkabel dalam pertukaran data, perlu disusun
algoritma proses pengiriman dan penerimaan paket data. Ada beberapa hal yang
dijadikan pertimbangan desain, antara lain:
Keadaan dasar (default state) dari transceiver adalah mode IDLE.
Kapasitas buffer RX dan TX FIFO sebesar 64 byte.
Kalibrasi PLL transceiver.
Fungsi pin serbaguna GDO0 dan GDO2.
Berdasarkan pertimbangan di atas, maka algoritma pengiriman paket data yang
dirancang dapat dirinci sebagai berikut.
1. Pembersihan buffer FIFO RX dan TX untuk mencegah penumpukan akibat
adanya data yang tertinggal.
2. Transfer data 3 sensor yang pada awalnya terletak di variabel deret ke buffer
FIFO TX.
3. Kalibrasi PLL transceiver.
4. Pindah keadaan dari IDLE ke TX, transceiver mulai mengirim paket data.
5. Cek status pengiriman paket melalui pin serbaguna GDO2.
6. Kembali ke keadaan IDLE.
Hasil implementasi program C untuk proses pengiriman paket data dapat dilihat di
bawah ini.
void RFSendPacket(char *txbuffer, char length) //IDLE STATE write_single_CC1100(0x00, 0x06); // Setting IOCFG2 (Sync TX'ed) write_strobe_CC1100(0x3A); // Flush RX FIFO Buffer write_strobe_CC1100(0x3B); // Flush TX FIFO Buffer write_burst_CC1100(0x3F, txbuffer, length); // Write TX data //TX STATE write_strobe_CC1100(0x31); // SFSTXON with AUTOCAL delay_ms(1); write_strobe_CC1100(0x35); // Change state to TX delay_ms(1); while (GDO0!=1); // PLL Lock Detector Check while (GDO2!=1); // Wait GDO2 to go high while (GDO2!=0); // Wait GDO2 to clear //BACK TO IDLE STATE write_strobe_CC1100(0x36); // Change state to IDLE delay_us(1); write_single_CC1100(0x00, 0x07); // Setting IOCFG2 (CRC Detect)
80
Sedangkan algoritma penerimaan paket data, dapat dirinci sebagai berikut.
1. Cek status penerimaan paket melalui pin serbaguna GDO2.
2. Ambil data 3 sensor yang pada buffer FIFO RX ke suatu variabel deret.
3. Cek status pemindahan paket melalui pin serbaguna GDO2.
4. Kembali ke keadaan IDLE.
5. Pembersihan buffer FIFO RX dan TX untuk mencegah penumpukan akibat
adanya data yang tertinggal.
Hasil implementasi program C untuk proses penerimaan paket data dapat dilihat
di bawah ini.
char RFReceivePacket(char *rxbuffer) char pktlen; // Length(1)+Type(1)+Payload //RX STATE while (GDO2!=1); // Wait GDO0 to go high read_single_CC1100(0x3F); // Read the packet length pktlen=datread+2; // Add 2 bytes append status read_burst_CC1100(0x3F, rxbuffer, pktlen); // Read RX data while (GDO2!=0); // Wait GDO0 to clear //BACK TO IDLE STATE write_strobe_CC1100(0x36); // Change state to IDLE delay_us(1); write_strobe_CC1100(0x3A); // Flush RX FIFO Buffer write_strobe_CC1100(0x3B); // Flush TX FIFO Buffer return datread;
Terdapat pula modul tambahan untuk menghitung nilai RSSI, seperti dapat dilihat
di bawah ini. Level RSSI pada paket terima, berupa data heksadesimal sehingga
harus diubah ke bentuk yang dapat mudah dibaca. Proses komunikasi 1 dan 2-
arah, sebagai penerapan algoritma di atas, dilakukan melalui pengujian di Bab IV.
void rssi(int rssidec) if (rssidec>=128) rssidec = (int) (rssidec-256); rssidec = rssidec/2; rssidbm = rssidec-75; else rssidec = rssidec/2; rssidbm = rssidec-75;
81
III.9.4 Protokol MAC
Protokol MAC yang dikembangkan adalah berbasis TDMA. Proses pertukaran
data antar node dilakukan berdasarkan pewaktuan-pewaktuan yang disepakati dan
dimengerti semua node dalam jaringan. Pada topologi tipe klaster, anggota
jaringan adalah kepala klaster dan node-node sensor disekitarnya. Secara garis
besar, seperti tampak pada Gambar III.40 di bawah ini, protokol ini terdiri dari 3
bagian, yaitu round, frame, dan timeslot.
Gambar III.40. Protokol MAC berbasis TDMA.
Secara fungsional, protokol MAC ini terdiri dari 2 fase, yaitu fase set-up dan fase
steady-state. Pada fase set-up, terjadi pembentukan jaringan antara kepala klaster
dan node sensor disekitarnya. Fase ini terdiri dari 3 frame, yaitu:
1. Kepala klaster mengirim pesan SETUP ke semua node dengan tujuan untuk
memberi tahu keberadaan kepala klaster dan untuk proses sinkronisasi node.
2. Masing-masing node sensor, yang menerima pesan SETUP, melakukan
sinkronisasi dan kemudian membalas dengan mengirim pesan JOIN ke kepala
klaster sebagai bentuk keikutsertaan node sensor tersebut dalam jaringan.
3. Berdasarkan jumlah pesan JOIN yang diterima, kepala klaster membentuk
frame-frame yang merupakan jadwal untuk tiap-tiap node dalam melakukan
pertukaran data dengan kepala klaster. Jadwal ini kemudian disebar kembali
melalui pesan SLOT ke semua node untuk dimengerti dan diikuti.
Sedangkan pada fase steady-state, node sensor yang berkewajiban, melakukan
pertukaran data dengan kepala klaster dengan skema SYNC-DATA-ACK. Node
lain yang tidak berkepentingan, memasuki mode tidur untuk menghemat daya.
82
Dalam 1 frame, terdapat 10 timeslot yang merupakan pewaktuan aksi protokol
MAC. Satu timeslot memiliki panjang waktu 200 ms (timer value: 9e57h),
sehingga 1 frame memiliki panjang waktu 2 detik. Aksi protokol berupa kirim dan
terima paket data dilakukan dengan skema 1 aksi / timeslot. Jadi, ketika node-1
mengirim paket ke node-2 pada timeslot-1 dan kedua node sudah sinkron satu
sama lain, maka node-2 akan menerima data pada timeslot-2.
Definisi “menerima data” dalam hal ini bukanlah berarti transceiver menerima
gelombang termodulasi data, namun berarti data dari buffer FIFO RX transceiver
diambil ke variabel internal mikrokontroler. Karena skema validasi data terima
adalah CRC filtering, maka ketika transceiver sedang dalam mode RX, data
apapun dengan CRC benar, akan masuk ke buffer FIFO RX. Jadi sebenarnya
dalam kasus node-1 mengirim data ke node-2 di atas, paket data node-1 pada
timeslot-1 sudah diterima oleh node-2 sesaat setelah paket tersebut terkirim,
dengan asumsi waktu tunda propagasi gelombang diabaikan. Namun paket
tersebut baru diambil oleh mikrokontroler pada timeslot-2.
Gambar III.41. Fase SET-UP bagian-1.
Gambar III.41 di atas adalah penjelasan lebih rinci mengenai fase set-up bagian
pertama. Format paket data SETUP adalah | Length | Type | Head ID | Time Slot |.
Head ID merupakan nomer node dari kepala klaster. Kita pilih ID = 00 sebagai
identitas dari kepala klaster. Time Slot berisi nilai yang menunjukkan jumlah
timeslot tersisa dalam 1 frame setelah dikurangi timeslot pengiriman paket SETUP
tersebut. Karena 1 frame = 10 timeslot dan paket dikirim di timeslot-1, maka isi
variabel Time Slot = 10 – 1 = 9.
83
Konsep kerja protokol MAC pada fase SET-UP bagian-1 ini adalah node sensor
ibarat seekor anak ayam yang mencari-cari induknya. Node sensor berada pada
mode RX di sepanjang frame dan mengecek data terima di buffer FIFO RX pada
setiap timeslot. Ketika node sensor menerima pesan SETUP dari kepala klaster,
maka node sensor mengetahui bahwa telah ada kepala klaster yang ingin
membangun jaringan dan langkah selanjutnya adalah sinkronisasi untuk
menyamakan pewaktuan timeslot node sensor dengan kepala klaster.
Gambar III.42. Proses sinkronisasi node.
Gambar III.42 di atas adalah metode sinkronisasi yang dirancang. Timeslot x dan
timeslot x+1 adalah pewaktuan node sensor, sedangkan timeslot 1 adalah milik
kepala klaster. Ketika pesan SETUP diterima node sensor saat a,diantara x dan
x+1, maka akan dijalankan program interupsi, sesuai Gambar III.30 (b), untuk
memasukkan nilai pewaktu timeslot pada variabel tertentu. Ketika node tiba pada
timeslot x+1 dan mengetahui ada pesan SETUP yang diterima, maka dilakukan
perhitungan sebagai berikut.
(III.1)
Inti perhitungan di atas adalah menghitung selisih waktu timeslot node sensor dan
kepala klaster. Pada timeslot x+2, nilai y ini digunakan sebagai waktu tunda node
untuk menyamakan dengan timeslot kepala klaster. Setelah itu, node sensor
dikatakan sudah sinkron dengan kepala klaster.
Pada implementasi perangkat lunak, perlu dibuat fungsi-fungsi berbasis pewaktu
mikrokontroler dengan nilai waktu tertentu. Pewaktu mikrokontroler yang
digunakan adalah Timer-0, Timer-2, dan Timer-3. Fungsi ini diperlukan untuk
84
pewaktuan timeslot dalam frame dan satuan waktu tunda. Fungsi pewaktuan yang
dibuat adalah pewaktu 1 ms, 1 µs, dan 200 ms. Hasil implementasi program C
dapat dilihat di bawah ini.
void timer0_1ms (unsigned int loop1) TCCR0=0x03; //Start Timer with clock 250kHz flag_timer0=0; k=0; while (k<loop1) while (flag_timer0!=1); //nungu sampai satu flag_timer0=0; k++; TCCR0=0x00; //Stop Timer void timer2_1us (long int loop2) TCCR2=0x01; //Start Timer with clock 8MHz flag_timer2=0; j=0; while (j<loop2) while (flag_timer2!=1); //nungu sampai satu flag_timer2=0; j++; TCCR2=0x00; //Stop Timer void timer3_200ms (char loop3) n=0; while (n<loop3) while (flag_timer3!=1); //nungu sampai satu flag_timer3=0; n++;
Untuk aksi protokol MAC berupa pengiriman dan penerimaan pesan SETUP,
implementasi program C dapat dilihat di bawah ini. Tipe data SETUP adalah 01
dengan panjang paket 4 byte.
void Send_SETUP (char head, char time) //Packet Data Array data_setup[0]=0x03; // Packet Length 3 bytes data_setup[1]=0x01; // Type of Data = 01 data_setup[2]=head; // Cluster Head ID data_setup[3]=time; // Timeslots Remaining //Transmitt SETUP Data timer3_200ms(1); // Start timeslot-1
85
m=data_setup[0]+1; RFSendPacket(data_setup, m); printf("Head ID: %02x\r\n",data_setup[2]); LED1=!LED1; timer3_200ms(1); // Start timeslot-2 void Receive_SETUP (void) //Receive SETUP Message packet=(RFReceivePacket(data_setup))+2; sync_sender=data_setup[1]; //Get Sender ID sync_count=data_setup[2]-2; //Get 9, 9-2=7 sync=(int)sync_count; sync=sync*200; //SETUP Calculation timer_sync=timer_high; timer_sync=((timer_sync<<8)|timer_low); timer1=abs(timer_sync-40535); //200 ms timer2=timer1*8; //t dalam us //Synchronization timer3_200ms(1); //Goto next timeslot TCCR3B=0x00; //Stop Timer-3 timer2_1us(timer2); //sync timeslot-3 timer0_1ms(sync); //Goto timeslot-10 TCCR3B=0x03; //Start Timer-3
Untuk mengakomodasi mode tidur (sleep mode) dari node ketika tidak ada
aktivitas jaringan, perlu diimplementasi fungsi penghematan daya pada
transceiver. Mode tidur yang dibuat ada 2 macam, SLEEP-1 dengan waktu tidur
800 ms dan SLEEP-2 dengan waktu tidur 1600 ms. Konsumsi arus saat tidur
adalah 1/100 kali saat aktif (XOFF = 0,2mA, TX / RX = 15 – 30 mA).
void Sleep_1 (void) LED1=!LED1; write_strobe_CC1100(0x32); // SXOFF timer3_200ms(2); // Start timeslot-7 to 8 write_strobe_CC1100(0x36); // IDLE write_strobe_CC1100(0x33); // SCAL delay_ms(1); timer3_200ms(2); // Start timeslot-9 to 10 LED2=!LED2; void Sleep_2 (void) LED1=!LED1; write_strobe_CC1100(0x32); // SXOFF timer3_200ms(6); // Start timeslot-3 to 8 write_strobe_CC1100(0x36); // IDLE write_strobe_CC1100(0x33); // SCAL delay_ms(1); timer3_200ms(2); // Start timeslot-9 to 10 LED2=!LED2;
86
Gambar III.43. Fase SET-UP bagian-2.
Gambar III.43 di atas adalah penjelasan lebih rinci mengenai fase set-up bagian
kedua. Format paket data JOIN adalah | Length | Type | Head ID | Node ID |.
Konsep kerja protokol MAC pada fase SET-UP bagian-2 ini adalah kepala klaster
mencari node sensor yang ingin bergabung dalam jaringan. Node sensor yang
ingin bergabung, mengirim pesan JOIN ke kepala klaster pada timeslot ke-x. Nilai
x ditentukan oleh ID masing-masing node dengan hubungan x = 2(ID) – 1. Jadi
node ID = 2 akan beraksi pada timeslot ke-3, dan begitu seterusnya. Hal ini
dimaksudkan agar tidak terjadi tabrakan antar node dalam mengirim paket data.
Untuk aksi protokol MAC berupa pengiriman dan penerimaan pesan JOIN,
implementasi program C dapat dilihat di bawah ini. Tipe data JOIN adalah 02
dengan panjang paket 4 byte.
void Send_JOIN (char head, char member) //Packet Data Array data_join[0]=0x03; // Packet Length 3 bytes data_join[1]=0x02; // Type of Data = 02 data_join[2]=head; // Cluster Head ID data_join[3]=member; // Join Member ID //Transmitt JOIN Data right=(member*2)-1; // Collision Avoidance left=9-right; // For Delay m=data_join[0]+1; timer3_200ms(right); // Start timeslot-1 delay_ms(20); RFSendPacket(data_join, m); printf("Member ID: %02x\r\n",data_join[3]); LED1=!LED1; timer3_200ms(1); // Start timeslot-2 void Receive_JOIN (void)
87
//RX Sequence packet=(RFReceivePacket(data_join))+2; printf("Member ID: %02x ",data_join[2]); //RSSI Display i=(int) data_join[packet-2]; rssi(i); printf("RSSI=%i\r\n",rssidbm); LED1=!LED1;
Gambar III.44. Fase SET-UP bagian-3.
Gambar III.44 di atas adalah penjelasan lebih rinci mengenai fase set-up bagian
ketiga. Konsep kerja protokol MAC pada fase SET-UP terakhir ini adalah
penyebaran jadwal transfer data untuk node anggota jaringan. Format paket data
SLOT adalah | Length | Type | Head ID | Slot-1 | Slot-2 | Slot-3 | Slot-4 | Slot-5 |.
Algoritma pembentukan jadwal / frame / slot ini adalah pengurutan nomer ID
node sensor yang mengirimkan pesan JOIN. Jadi jika kepala klaster secara
berurutan menerima pesan JOIN dari node dengan ID = 01, 03, dan 06, maka dari
5 slot yang tersedia, hanya 3 slot awal yang terisi, yaitu Slot-1 = 01, Slot-2 = 03,
dan Slot-3 = 06, dan begitu seterusnya. Sedangkan pada sisi node sensor, pada
pesan SLOT yang diterima, jadwal / frame node sensor dalam transfer data adalah
sama dengan urutan Slot yang isinya ID node tersebut. Node-3 akan mengirim
data pada frame ke-5 jika ternyata ID node berada pada Slot-5, dan seterusnya.
Dengan terbentuknya formasi frame / slot ini, maka jaringan sudah dikatakan
terbentuk, dan kemudian semua node memasuki fase steady-state.
Untuk aksi protokol MAC berupa pengiriman dan penerimaan pesan SLOT,
implementasi program C dapat dilihat di bawah ini. Tipe data SLOT adalah 03
dengan panjang paket 8 byte.
88
void Send_SLOT (char head, char slot1, char slot2, char slot3, char slot4, char slot5) //Packet Data Array data_slot[0]=0x07; // Packet Length 7 bytes data_slot[1]=0x03; // Type of Data = 03 data_slot[2]=head; // Cluster Head ID data_slot[3]=slot1; // Member Slot-1 data_slot[4]=slot2; // Member Slot-2 data_slot[5]=slot3; // Member Slot-3 data_slot[6]=slot4; // Member Slot-4 data_slot[7]=slot5; // Member Slot-5 //Transmitt JOIN Data m=data_slot[0]+1; timer3_200ms(1); // Start timeslot-1 delay_ms(20); RFSendPacket(data_slot, m); printf("SLOT: "); for(i=3;i<m;i++) printf("%02x ",data_slot[i]); printf("\r\n"); printf("\r\n"); LED1=!LED1; timer3_200ms(1); // Start timeslot-2 void Receive_SLOT (void) //RX Sequence packet=RFReceivePacket(data_slot); printf("SLOT: "); for(i=2;i<packet;i++) printf("%02x ",data_slot[i]); printf("\r\n"); printf("\r\n"); LED1=!LED1;
Gambar III.45. Fase Steady-state.
Gambar III.45 di atas adalah penjelasan lebih rinci mengenai fase steady-state dari
protokol yang dikembangkan. Node sensor yang sedang memiliki jadwal transfer
data, akan melakukan skema SYNC-DATA-ACK dengan kepala klaster
kemudian menuju mode tidur-1, sedangkan node sensor lain yang tidak
berkepentingan akan menuju mode tidur-2.
89
Format paket data pada skema SYNC-DATA-ACK yang digunakan adalah:
SYNC : | Length | Type | Head ID | Period | Frame | Round |
DATA : | Length | Type | Pressure | Temperature | Humidity |
ACK : | Length | Type | Head ID | Counter |
Pesan SYNC memiliki tipe data = 4 dengan panjang paket 6 byte. Paket ini berisi
data trafik jaringan pada bagian Period, Frame, dan Round. Period berisi
informasi mengenai periode aggregasi data node. Frame dan Round berisi status
urutan frame dalam satu round dan jumlah round yang sudah dijalankan.
Siklus jaringan yang dirancang terdiri dari 6 round. Round pertama adalah fase
set-up yang terdiri dari 3 frame seperti telah dijelaskan sebelumnya. Lima round
berikutnya adalah fase steady-state. Setelah round ke-6, maka jaringan kembali ke
round ke-1 untuk melakukan pembentukan ulang jaringan. Pembentukan ulang ini
terkait dengan skalabilitas sistem terhadap penambahan atau pengurangan jumlah
node. Pada 6 round berikutnya, frame node sensor lama yang mati akan terganti,
dan sebaliknya, node sensor baru akan bergabung dan mendapatkan frame / slot.
Dalam 5 round fase steady-state, tiap round terdiri dari 10 frame, yang terdiri dari
5 frame periode data, dan 5 frame periode tanpa data. Pada jaringan yang lebih
besar, jumlah frame periode data dapat ditambah untuk mengakomodasi
kebutuhan node-node dalam jaringan. Karena perangkat keras node sensor yang
diimplementasi sebanyak 3 buah, maka 5 frame periode data sudah cukup dengan
2 frame kosong untuk kemungkinan penambahan node. Pada frame periode tanpa
data, semua node memasuki mode tidur-2 setelah menerima pesan SYNC.
Paket DATA memiliki tipe data = 5 dengan panjang paket 14 byte. Paket ini berisi
data 3 sensor (tekanan, temperatur, kelembaban) dengan masing-masing data
memiliki panjang 4 byte. Pesan ACK memiliki tipe data = 6 dengan panjang paket
4 byte. Paket ini berisi notifikasi penerimaan data dari kepala klaster ke node
pengirim dan informasi jumlah data yang sudah diterima oleh kepala klaster. Pada
pengembangan layer di atas data-link, terutama pada protokol routing, salah satu
cara untuk mengukur kinerja jaringan adalah dengan membandingkan jumlah data
90
yang diterima kepala klaster dengan jumlah round yang telah dijalankan.
Implementasi program C paket-paket data pada fase steady-state dapat dilihat di
bawah ini.
void Send_SYNC_Data (char sync_from, char data, char slot_right, char slot_left) //Packet Data Array data_sync[0]=0x05; // Packet Length 5 bytes data_sync[1]=0x04; // Tipe Data = 4 data_sync[2]=sync_from; // Cluster Head ID data_sync[3]=data; // Data:01, No Data:00 data_sync[4]=slot_right; // Current Timeslot data_sync[5]=slot_left; // Remaining Timeslot //Transmitt SYNC Data m=data_sync[0]+1; timer3_200ms(1); //Start timeslot-1 delay_ms(20); RFSendPacket(data_sync, m); printf("SYNC "); for(i=4;i<m;i++) printf("%02x ",data_sync[i]); LED1=!LED1; timer3_200ms(1); //Start timeslot-2 void Receive_SYNC (void) //RX Sequence packet=RFReceivePacket(data_sync); printf("SYNC "); for(i=3;i<packet;i++) printf("%02x ",data_sync[i]); LED1=!LED1; void Send_DATA (void) //Packet Data Array display[0]=0x0D; // Packet Length 13 bytes display[1]=0x05; // Type of Data = 05 baca_adc(); baca_press(); baca_temp(); baca_hum(); single(); //Sensor Data Section// m=display[0]+1; timer3_200ms(1); //Start timeslot-3 delay_ms(20); RFSendPacket(display, m); printf("DATA: "); elgnis(2); timer3_200ms(1); //Start timeslot-4 void Receive_DATA (void) //RX Sequence packet=RFReceivePacket(display); printf("DATA: "); elgnis(1); void Send_ACK (char ack_from) //Packet Data Array data_ack[0]=0x03; // Packet Length 3 bytes data_ack[1]=0x06; // Type of Data = 06
91
data_ack[2]=ack_from; // Cluster Head ID data_ack[3]=temp[7]; // Data Counter temp[7]++; //Transmitt ACK Data m=data_ack[0]+1; timer3_200ms(1); //Start timeslot-5 delay_ms(20); RFSendPacket(data_ack, m); printf("ACK %02x\r\n",data_ack[3]); LED2=!LED2; timer3_200ms(1); //Start timeslot-6 void Receive_ACK (void) //RX Sequence packet=RFReceivePacket(data_ack); printf("ACK %02x\r\n",data_ack[2]); LED2=!LED2;
Jika penjelasan pada Gambar III.41 – 45 didasarkan pada tahapan proses pada
protokol MAC berbasis TDMA dan implementasinya berupa modul-modul
generator paket-paket data yang digunakan pada protokol, maka pada program
utama mikrokontroler, proses implementasi didasarkan pada fungsional node, baik
sebagai kepala klaster, maupun node sensor.
Perancangan program utama berupa diagram alir untuk node sensor dan kepala
klaster secara berurutan dapat dilihat pada Gambar III.46 dan Gambar III.47 di
bawah ini. Sedangkan bentuk implementasi program C dapat dilihat pada
Lampiran C. Metode pengembangan program utama ini didasarkan pada keadaan
(state) pada protokol MAC dan syarat / kondisi yang menyertainya. Suatu proses
dapat berpindah ke proses lainnya jika satu atau lebih kondisi telah dipenuhi.
Selain itu, jalannya proses pada protokol diatur oleh modul-modul pewaktuan
yang telah dijelaskan sebelumnya.
Dengan demikian maka proses perancangan dan implementasi bagian perangkat
keras dan perangkat lunak dari sistem pemantauan tanaman yang dikembangkan.
Proses selanjutnya adalah pengujian dan karakterisasi sub-sistem, baik pada
perangkat keras dan perangkat lunak, dan pengujian sistem secara keseluruhan.
92
Gambar III.46. Diagram alir program utama untuk Node Sensor.
93
Gambar III.47. Diagram alir program utama untuk Kepala Klaster.