1. Komponen [Kembali]
Percobaan 2
1.
Bisakah SPI menggunakan lebih dari satu master?
Tidak bisa karena
akan terjadi eror atau sulitnya dalam pemilihan slave yang dituju jika
menggunakan master yang banyak atau lebih dari satu. Karena pada saat memilih
slave atau slave select pertama pada master diberi high maka untuk memilih
slavenya kita beri atau kirim perintah slave select low ke sehingga slave
tersebut dapat dialiri arus oleh master karena adanya beda potensial. Tetapi
jika terdapat 2 master maka slave akan menerima 2 data yang berbeda dari 2
master yang berbeda juga sehingga slave sulit memproses 2 data sekaligus karena
pada SPI bersifat sinkron atau komunikasi sinkron.
2.
Jelaskan pengaruh input pullup dan pulldown pada rangkaian!
Sangat berpengaruh
pada input yang diterima dari master. Pada saat diberi input pullup seperti
pada program maka input bernilai 0 (low) saat push button ditekan dan akan
bernilai 1 (high) jika tidak ditekan. Maka sesuai program yang dimasukan maka
bila push button ditekan led hidup dan jika dilepas led mati. Tetapi beda
dengan input pull down yang merupakan kebalikan dari pull up yang dimana saat
ditekan berlogika 1 (high) dan jika dilepas maka akan berlogika 0 (low). Maka
pada output akan berubah juga pada saat push butto ditekan maka led akan mati
dan jika dilepas led akan hidup.
3.
Jelaskan prinsip kerja SPI pada rangkaian
Rangkaian dimulai
dari input button yang dimasukan ke master dan master mengolah lalu dikirimkan
ke slave dan salve mengeksekusi perintah yang diberikan dari master sehingga
led hidup atau mati. Lebih jelasnya mari kita lihat penjelasan dari listing
programnya.
a)
Master
#include <SPI.h> //Deklarasi library SPI
#define button 2
void setup (void) {
pinMode(button,
INPUT_PULLUP);
Serial.begin(115200 ); //Set baud rate 115200
digitalWrite(SS,
HIGH);
// disable Slave
Select
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8); //divide the clock by 8
}
· Pada listing program pertama saya mendeklarasikan library SPI yang dimana pin-pin yang ada pada SPI adalah 10-13. Dan saya juga mendeklarasikan pin 2 ke variabel button. Pada void setup saya memberi perintah yaitu pin button saya beri perintah input pullup selanjutnya set bued rate atau kecepatan data sebesar 115200 dan dilanjutkan dengan perintah pemeberian logika high pada ss master selanjutnya SPI.begin () untuk memulai SPI dan selanjutnya adalah SPI.setClockDivider(SPI_CLOCK_DIV8) digunakan untuk mengatur clock pada SPI.
void loop (void) {
char c;
int
nilai=digitalRead(button);
if(nilai==0){
digitalWrite(SS,
LOW); //enable Slave Select
// send test
string
for (const char *
p = "Hello, world!\r" ; c = *p; p++)
{
SPI.transfer
(c);
Serial.print(c);
}
digitalWrite(SS,
HIGH); // disable Slave Select
delay(2000);
}
}
· Listing program selanjutnya adalah void loop yang berisikan inisialisasi variabel c dengan tipe data char. Selanjutnya deklarasikan variabel nilai dengan tipe data integer yang nilainya sama dengan input button yang terbaca. Masuk ke logika if dimana jika button ditekan akan berlogika 0 maka dijalan kan program pertama pemberian logika low pada slave select sehingga ada arus yang mengalir karena beda potensial antara ss master dengan ss sehingga slave select aktif. Selanjutnya “for (const char * p = "Hello, world!\r" ; c = *p; p++)” sintak ini digunakan untuk menentukan c atau data variabel c. Selanjutnya SPI.transfer (c) untuk memulai mengrim data c ke slave dan Serial.print(c) digunakan untuk mencetak nilai dari variabel c. Setelah program if selesai maka slave select di non aktifkan dengan memeberi logika high pada slave select sehingga tidak ada arus mengalir ke slave select karena tidak ada beda potensial antara keduanya. Terakkhir program di delay 2000ms sebelum fungsi loop diulang kembali.
b)
Salve
#include <SPI.h>
#define led 2
char buff [50];
volatile byte indx;
volatile boolean process;
void setup (void) {
Serial.begin
(115200);
pinMode(led,
OUTPUT); // have to send on master in so it set as output
SPCR |= _BV(SPE);
// turn on SPI in slave mode
indx = 0; //
buffer empty
process = false;
SPI.attachInterrupt(); // turn on interrupt
}
·
pada program slave kita mendeklarasikan library SPI yang
dimana pin-pin yang ada pada SPI adalah 10-13. Dan saya juga mendeklarasikan
pin 2 ke variabel led. char buff [50] digunkan untuk mendeklarasikan variabel
buff yang terdapat pada SPI volatile byte indx yaitu varibel indx dengan
tipedata yang tidak berkoma dan volatile boolean process variabel process yang
tipe data tidak berkoma juga dan bersifat untuk memilih salah satu. Untuk
fungsi void setupnya berisikan untuk kecepatan data yang sama dengan master
karena komunikasi sinkron yaitu 115200. Untuk pin led beri perintah output. SPCR |= _BV(SPE) untuk turn on SPI in slave
mode. indx = 0 digunakan untuk memberi nilai awal pada indx. process = false
untuk memberi lokiga awal flase pada process. SPI.attachInterrupt() untuk turn
on interrupt.
ISR
(SPI_STC_vect) // SPI interrupt routine
{
byte c = SPDR; // read byte from SPI Data
Register
if (indx < sizeof buff) {
buff [indx++] = c; // save data in the next
index in the array buff
if (c == '\r') //check for the end of the
word
process = true;
}
}
·
Listing program selanjutnya adalah fungsi rutin interups
atau interuksi dimana berisi perintah untuk mengecek data yang dikirim oleh
master ke salve jika data terkirim dan benar makan process = true. Jika tidak
maka logika akan tetap yaitu process = false.
void loop (void) {
if (process) {
digitalWrite(led, HIGH);
process =
false; //reset the process
Serial.println
(buff); //print the array on serial monitor
indx = 0;
//reset button to zero
delay(1000);
}
else
{
digitalWrite(led, LOW);
}
}
· Listing program selanjutnya adalah fungsi void loop yang berisikan perintah if dimana jika process true maka akan dijalankan program didalamnya yang berisikan diberinya logika high pada pin led sehingga led hidup. Reset process dengan memeberi logika false ke process. Indx direset juga menjadi 0 dan diberi delay 1000ms karean process telah direset ke false maka logika else dijalankan sehingga setelah delay 1000ms maka led akan diberi logika low sehingga mati kembali. Setelahnya perintah voidloop akan diulang kembali.
Tidak ada komentar:
Posting Komentar