Laporan Akhir 2 - Percobaan 2


 

1.  Tujuan[Kembali]

    Tujuan Percobaan : 

a) Memahami prinsip kerja SPI

b) Mampu merangkai  komunikasi  SPI

   Kondisi
   kondisi awal LED mati, lalu ketika button di tekan led hidup berkedip dengan delay 500ms
 

2. Hardware[Kembali]

Alat 

1.Power Supply

 

2.  Ground

 

Bahan
1.Arduino

Arduino Uno Tutorial [Pinout]
2. Push Button


3. LED




4. Resistor

3. Rangkaian Simulasi[Kembali]

    Rangkaian Percobaan



    Prinsip Kerja
Pada komunikasi SPI memiliki kemampuan yaitu multiphase (pertukaran data) dapat dilakukan serentak dari master ke slave dan slave ke master pada saat bersamaan. SPI beroperasi berdasarkan shift register baik master device maupun slave device, keduanya akan mempunyai 8 bit shift register. Namun tergantung dari berbagai macam arsitektur mikrokontroler, ada yang bisa memiliki 10 bit ataupun 12 bit shift register. ntuk memulai komunikasi, bus master melakukan konfigurasi clock, dengan catatan frekuensi atau kecepatan transfer data antara SPI master device dan slave device harus sama, biasanya bisa mencapai beberapa MHz. Master akan memilih perangkat slave dengan mengeluarkan logika 0, lalu master akan menunggu proses yang telah dijadwalkan di master itu sendiri seperti uratan intrupsi , konversi analog ke digital, dll. Lalu setelah periode itu selesai master akan mengeluarkan clock yang pertAnda akan dimulainya proses komunikasi Serial.
  • Master mengirimkan satu bit ke slave, lalu Slave device akan membacanya dalam line yang sama.
  • Slave mengirimkan satu bit ke master, lalu master juga membacanya dalam line yang sama.
    

4. Program[Kembali]

Listing Program
 
master
 
#include<SPI.h>   //Library for SPI
#define LED 7           
#define ipbutton 2
int buttonvalue;
int x;
void setup ()

{
  Serial.begin(115200);                   //Starts Serial Communication at Baud Rate 115200
  pinMode(ipbutton,INPUT);                //Sets pin 2 as input
  pinMode(LED,OUTPUT);                    //Sets pin 7 as Output
  SPI.begin();                            //Begins the SPI commnuication
  SPI.setClockDivider(SPI_CLOCK_DIV8);    //Sets clock for SPI communication at 8 (16/8=2Mhz)
  digitalWrite(SS,HIGH);                  // Setting SlaveSelect as HIGH (So master doesnt connnect with slave)
}
void loop()
{
  byte Mastersend,Mastereceive;          
  buttonvalue = digitalRead(ipbutton);   //Reads the status of the pin 2
  if(buttonvalue == LOW)                //Logic for Setting x value (To be sent to slave) depending upon input from pin 2
  {
    x = 1;
  }
  else
  {
    x = 0;
  }
  digitalWrite(SS, LOW);                  //Starts communication with Slave connected to master
  Mastersend = x;                            
  Mastereceive=SPI.transfer(Mastersend); //Send the mastersend value to slave also receives value from slave
  if(Mastereceive == 1)                   //Logic for setting the LED output depending upon value received from slave
  {
    digitalWrite(LED,HIGH);
    delay(500);
    digitalWrite(LED,LOW);
    Serial.println("Master LED ON");
  }
  else
  {
   digitalWrite(LED,LOW);               //Sets pin 7 LOW
   Serial.println("Master LED OFF");
  }
  delay(500);

slave

#include<SPI.h>
#define LEDpin 7
#define buttonpin 2
volatile boolean received;
volatile byte Slavereceived,Slavesend;
int buttonvalue;
int x;
void setup()
{
  Serial.begin(115200);
  pinMode(buttonpin,INPUT);               // Setting pin 2 as INPUT
  pinMode(LEDpin,OUTPUT);                 // Setting pin 7 as OUTPUT
  pinMode(MISO,OUTPUT);                   //Sets MISO as OUTPUT (Have to Send data to Master IN
  SPCR |= _BV(SPE);                       //Turn on SPI in Slave Mode
  received = false;
  SPI.attachInterrupt();                  //Interuupt ON is set for SPI commnucation
}
ISR (SPI_STC_vect)                        //Inerrrput routine function
{
  Slavereceived = SPDR;         // Value received from master if store in variable slavereceived
  received = true;                        //Sets received as True
}
void loop()
{ if(received)                            //Logic to SET LED ON OR OFF depending upon the value recerived from master
   {
      if (Slavereceived==1)
      {
        digitalWrite(LEDpin,HIGH);
        delay(500);    
        digitalWrite(LEDpin, LOW);//Sets pin 7 as HIGH LED ON
        Serial.println("Slave LED ON");
      }else
      {
        digitalWrite(LEDpin,LOW);          //Sets pin 7 as LOW LED OFF
        Serial.println("Slave LED OFF");
      }
      buttonvalue = digitalRead(buttonpin);  // Reads the status of the pin 2
      if (buttonvalue == LOW)               //Logic to set the value of x to send to master
      {
        x=1;
      }else
      {
        x=0;
      }
  Slavesend=x;                             
  SPDR = Slavesend;                           //Sends the x value to master via SPDR
  delay(500);
}
}

 

Flowchart






5. Analisa[Kembali]

Percobaan 2

1.       Apakah pin SS bisa diganti dengan pin digital lain?

Jawab

Pin ss tidak bisa bisa diganti dengan pin digital lain. Dimana pin ss yang berfungsi dalam memilih slave mana yang mengirim dan menerima data.

2.       Apa yang terjadi jika pin MISO dilepas?

Jawab

MISO (Master input slave output) merupakan pin yang berfungsi sebagai jalur data pada saat data keluar dari slave dan masuk ke dalam master. Jikalau MISO dilepas maka tidak ada data yang masuk ke master

3.       Apakah pada komunikasi ini bisa menggunakan multi master

Jawab

Komunikasi ini tidak termasuk kedalam multimaster. Namun merupakan multislave dengan pengaturan pertukaran data antar slave dilakukan oleh pin SS 


6. Vidio[Kembali]  

 

0 komentar:

Posting Komentar