1. Komponen [kembali]
Gambar 1. Komponen Percobaan 2 (Arduino)
Gambar 2. Komponen Percobaan 2 (LED)
Gambar 3. Komponen Percobaan 2 (Push Button)
2. Rangkaian Simulasi [kembali]
3. Flowchart [kembali]
Gambar 5. Flowchart Master
4. Listing Program [kembali]
Listing Master :
#include <SPI.h> //Deklarasi library SPI
#define button 2 //Deklasrasi pin 2 terhubung pada button
void setup (void) { //Fungsi yang dieksekusi sekali
pinMode(button, INPUT_PULLUP); //Deklarasi button sebagai input dalam kondisi pull-up
Serial.begin(115200 ); //Set baud rate 115200
digitalWrite(SS, HIGH); //Pin SS berlogika HIGH atau menonaktifkan pin SS
SPI.begin (); //Mremulai komunikasi SPI
SPI.setClockDivider(SPI_CLOCK_DIV8); //Membagi clock dengan 8
#define button 2 //Deklasrasi pin 2 terhubung pada button
void setup (void) { //Fungsi yang dieksekusi sekali
pinMode(button, INPUT_PULLUP); //Deklarasi button sebagai input dalam kondisi pull-up
Serial.begin(115200 ); //Set baud rate 115200
digitalWrite(SS, HIGH); //Pin SS berlogika HIGH atau menonaktifkan pin SS
SPI.begin (); //Mremulai komunikasi SPI
SPI.setClockDivider(SPI_CLOCK_DIV8); //Membagi clock dengan 8
void loop (void) { //Fungsi yang dijalankan berulang atau looping
char c; //Deklarasi variabel c menggunakan tipe data char/character
int nilai=digitalRead(button); //Deklarasi variabel nilai merupakan hasil pembacaan kondisi button
if(nilai==0){ //Fungsi kondisional saat variabel nilai berlogika 0
digitalWrite(SS, LOW); //Pemberian logika LOW pada pin SS sehingga SS aktif //
for (const char * p = "Hello, world!\r" ; c = *p; p++) //Memasukkan nilai variabel p, dan increment variabel p
{
SPI.transfer (c); //Data dari master dikirimkan atau ditransfer
Serial.print(c); //Mencetak data yang didapatkan pada monitor serial
}
digitalWrite(SS, HIGH); //Pin SS berlogika HIGH, sehingga pin SS tidak aktif
delay(2000); //Penundaan looping selama 2000 ms
}
}
Listing Slave :
#include <SPI.h>
#define led 2 //Deklarasi pin 2 terhubung ke LED
char buff [50]; //Deklarasi variabel buff dengan array 50
volatile byte indx; //Deklarasi variabel indx
volatile boolean process; //Deklarasi variabel process
void setup (void) { //Fungsi yang hanya dieksekusi sekali
Serial.begin (115200); //Set baud rate 115200
pinMode(led, OUTPUT); //LED berfungsi sebagai output
SPCR |= _BV(SPE); //Mengaktifkan SPI dalam mode Slave
indx = 0; //Set nilai variabel indx menjadi 0
process = false; //Memasukkan nilai false ke dalam variabel process
SPI.attachInterrupt(); //Mengaktifkan intterupt
}
ISR (SPI_STC_vect) // SPI interrupt routine
{
byte c = SPDR; //Membaca data dari Data Register SPI
if (indx < sizeof buff) { //Kondisi saat nilai indx < dari jumlah array buff
buff [indx++] = c; //Data disimpan pada index selanjutnya di array buff
if (c == '\r') //Pengecekan pada akhir kata
process = true; //Memasukkan nilai tru ke variabel process
}
}
void loop (void) { //Fungsi yang dieksekusi berulang kali atau looping
if (process) { //Kondisional untuk nilai variabel process
digitalWrite(led, HIGH); //Pada LED akan diberi logika HIGH maka LED menyala
process = false; //Memberikan nilai false pada variabel process atau me reset variabel process
Serial.println (buff); //Mencetak array pada serial monitor
indx = 0; //Memasukkan nilai 0 pada variabel indx atau mereset button ke 0
delay(1000); //Menunda proses perulangan selama 1000 ms
}
else //Untuk kondisi lain
{
digitalWrite(led, LOW); //LED diberi logika LOW maka LED mati
}
}
#define led 2 //Deklarasi pin 2 terhubung ke LED
char buff [50]; //Deklarasi variabel buff dengan array 50
volatile byte indx; //Deklarasi variabel indx
volatile boolean process; //Deklarasi variabel process
void setup (void) { //Fungsi yang hanya dieksekusi sekali
Serial.begin (115200); //Set baud rate 115200
pinMode(led, OUTPUT); //LED berfungsi sebagai output
SPCR |= _BV(SPE); //Mengaktifkan SPI dalam mode Slave
indx = 0; //Set nilai variabel indx menjadi 0
process = false; //Memasukkan nilai false ke dalam variabel process
SPI.attachInterrupt(); //Mengaktifkan intterupt
}
ISR (SPI_STC_vect) // SPI interrupt routine
{
byte c = SPDR; //Membaca data dari Data Register SPI
if (indx < sizeof buff) { //Kondisi saat nilai indx < dari jumlah array buff
buff [indx++] = c; //Data disimpan pada index selanjutnya di array buff
if (c == '\r') //Pengecekan pada akhir kata
process = true; //Memasukkan nilai tru ke variabel process
}
}
void loop (void) { //Fungsi yang dieksekusi berulang kali atau looping
if (process) { //Kondisional untuk nilai variabel process
digitalWrite(led, HIGH); //Pada LED akan diberi logika HIGH maka LED menyala
process = false; //Memberikan nilai false pada variabel process atau me reset variabel process
Serial.println (buff); //Mencetak array pada serial monitor
indx = 0; //Memasukkan nilai 0 pada variabel indx atau mereset button ke 0
delay(1000); //Menunda proses perulangan selama 1000 ms
}
else //Untuk kondisi lain
{
digitalWrite(led, LOW); //LED diberi logika LOW maka LED mati
}
}
5. Video [kembali]
6. Analisa [kembali]
1.
Pada saat digunakan dua
perangkat slave. Bagian mana yang akan diubah, apakah program, rangkaian atau
dua duanya ?
Ø Untuk penggunaan multiple slave pada komunikasi SPI
menggunakan cara dengan menghubungkan pin pin pada slave secara parallel ke pin
pin master. Untuk program yang digunakan tetap sama. Dalam komunikasi antara
master dengan slave-slave nya akan ditentukan oleh SS yang dimana kita ketahui
SS yaitu penentuan slave mana yang akan dikirimkan data.
7. Link Download [kembali]
Tidak ada komentar:
Posting Komentar