Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:lab:lab6-2021 [2021/04/17 18:43]
jan.vaduva
pm:lab:lab6-2021 [2021/04/22 13:43] (current)
dumitru.brigalda
Line 1: Line 1:
-===== Laboratorul ​5: I2C (Inter-Integrated Circuit) =====+===== Laboratorul ​6: I2C (Inter-Integrated Circuit) =====
 Acest laborator acoperă noțiunea de I2C. Pentru aprofundarea acestui topic, consultați [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]] și {{https://​en.wikipedia.org/​wiki/​I%C2%B2C|Inter-Integrated Circuit}}. Acest laborator acoperă noțiunea de I2C. Pentru aprofundarea acestui topic, consultați [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]] și {{https://​en.wikipedia.org/​wiki/​I%C2%B2C|Inter-Integrated Circuit}}.
  
Line 8: Line 8:
 Semnalul de ceas este generat de către master iar linia de date este controlată atât de master cât și de către slave. La un moment dat un singur dispozitiv de pe magistrală poate controla linia de date. Din acestă cauză protocolul I2C este half-duplex. Semnalul de ceas este generat de către master iar linia de date este controlată atât de master cât și de către slave. La un moment dat un singur dispozitiv de pe magistrală poate controla linia de date. Din acestă cauză protocolul I2C este half-duplex.
  
-{{icalc:​laboratoare:​09:​sda_scl.png?​450x250 }}+{{ icalc:​laboratoare:​09:​sda_scl.png?​450x250 }}
  
 <​note>​I2C mai este cunoscut și cu numele de TWI (Two-Wire Interface)</​note>​ <​note>​I2C mai este cunoscut și cu numele de TWI (Two-Wire Interface)</​note>​
Line 49: Line 49:
 </​note>​ </​note>​
  
-===== 3. Regiștrii ​configurare I2C =====+===== 3. Registre ​configurare I2C =====
  
 Arduino poate funcționa atât în modul I2C Master cât și I2C Slave. Arduino poate funcționa atât în modul I2C Master cât și I2C Slave.
Line 56: Line 56:
 {{pm:​lab:​twbr.png?​600}} {{pm:​lab:​twbr.png?​600}}
   * TWBR selectează divizorul de frecvență care generează frecvența ceasului SCL în modurile master.   * TWBR selectează divizorul de frecvență care generează frecvența ceasului SCL în modurile master.
 +
 +==== TWI Control Register ====
 +{{pm:​lab:​twcr.png?​600}}
 +  * TWCR este folosit pentru a activa interfața I2C, inițiază accesul la master prin aplicarea condiției START, generează confirmarea receptorului,​ generează condiția de oprire și control al acesteia în timpul scrierii în registrul de date TWDR. De asemenea, indică coliziuni la scriere.
 +  * TWINT : TWI Interrupt Flag
 +    * 1 - Clear, setat din software, in rest este setat de hardware.
 +  * TWEA: TWI Enable Acknowledge Bit
 +    * 1 - ACK este trimis
 +    * 0 - NACK, deconectare virtuală a dispozitivului de pe interfață
 +  * TWEN: TWI Enable Bit
 +    * 1 - Permite comunicarea
 +    * 0 - Încheierea transmisiunii indiferent de stare
 +
 +==== TWI Status Register ====
 +{{pm:​lab:​twsr.png?​600}}
 +  * TWSR descrie statusul si prescalerul interfeței.
 +
 +==== TWI Data Register ====
 +{{pm:​lab:​twdr.png?​600}}
 +  * TWDR conține în modul de transmisie următorul octet de transmis iar în modul de recepție ultimul octet primit.
  
 ===== 4. Exemplu I2C Master/​Slave ===== ===== 4. Exemplu I2C Master/​Slave =====
-În acest laborator vom utiliza biblioteca Arduino pentru a ușura lucrul cu dispozitivele I2C. +În acest laborator vom utiliza biblioteca Arduino pentru a ușura lucrul cu dispozitivele I2C. API-ul acesteia poate fi văzut în headerul ”Wire.h” din scheletul de laborator. Un exemplu de interconectare este de asemenea disponibil mai jos:
-API-ul acesteia poate fi văzut în headerul ”Wire.h” din scheletul de laborator. Un exemplu de interconectare este de asemenea disponibil mai josȘ+
  
-{{pm:​lab:​master_sender_bb.png?​500}}+{{ pm:​lab:​master_sender_bb.png?​500 }}
  
-**Master_reader_example**+**Master Writer** 
 +<code c> 
 +#include <​Wire.h>​ 
 + 
 +void setup() 
 +
 +  Wire.begin();​ // join i2c bus (address optional for master) 
 +
 + 
 +byte x = 0; 
 + 
 +void loop() 
 +
 +  Wire.beginTransmission(4);​ // transmit to device #4 
 +  Wire.write("​x is "​); ​       // sends five bytes 
 +  Wire.write(x); ​             // sends one byte   
 +  Wire.endTransmission(); ​   // stop transmitting 
 + 
 +  x++; 
 +  delay(500);​ 
 +
 +</​code>​ 
 + 
 +**Slave Reader** 
 +<code c> 
 +#include <​Wire.h>​ 
 + 
 +void setup() 
 +
 +  Wire.begin(4); ​               // join i2c bus with address #4 
 +  Wire.onReceive(receiveEvent);​ // register event 
 +  Serial.begin(9600); ​          // start serial for output 
 +
 + 
 +void loop() 
 +
 +  delay(100);​ 
 +
 + 
 +// function that executes whenever data is received from master 
 +// this function is registered as an event, see setup() 
 +void receiveEvent(int howMany) 
 +
 +  while(1 < Wire.available()) // loop through all but the last 
 +  { 
 +    char c = Wire.read();​ // receive byte as a character 
 +    Serial.print(c); ​        // print the character 
 +  } 
 +  int x = Wire.read(); ​   // receive byte as an integer 
 +  Serial.println(x); ​        // print the integer 
 +
 +</​code>​ 
 + 
 + 
 +**Master Reader**
 <code c> <code c>
 #include <​Wire.h>​ #include <​Wire.h>​
Line 84: Line 157:
 </​code>​ </​code>​
  
-**Slave_writer_example**+**Slave Writer**
  
 <code c> <code c>
Line 107: Line 180:
    
  
-===== Exerciții =====+===== 5. Exerciții ===== 
 + 
 +**Task 0** Folosiți codul Arduino pentru a implementa un Master Reader și un Slave Writer. Master-ul va avea atașat un led, iar Slave-ul un buton. Master-ul trebuie să interogheze Slave-ul despre starea butonului și să aprindă/​stingă led-ul în funcție de starea butonului (apăsat/​neapăsat). Cele două board-uri vor comunica pe I2C. Pentru realizarea comunicării,​ Master-ul trebuie să facă request de citire a 3 caractere, iar Slave-ul să răspundă cu starea butonului: "​ON!"​ sau "​OFF"​. 
 +{{ :​pm:​lab:​lab_i2c_task0.png?​500 |}} 
 + 
 +**Task 1** Folosiți codul Arduino pentru a implementa un Master Writer și un Slave Reader. Master-ul va avea atașate 2 butoane, iar Slave-ul un led. Master-ul trebuie să trimită Slave-ului una din cele 2 comenzi: "​ON!"​ sau "​OFF"​. Cele două board-uri vor comunica pe I2C. Pentru realizarea comunicării,​ la apăsarea primului buton, Master-ul trebuie să trimită comanda "​ON!",​ iar la apăsarea butonului 2, comanda "​OFF"​. În funcție de comanda recepționată,​ Slave-ul va aprinde/​stinge led-ul. 
 +{{ :​pm:​lab:​lab_i2c_task1.png?​500 |}} 
 + 
 +<​hidden>​ 
 +{{https://​www.tinkercad.com/​things/​aWsNXOGkVBR|Soluție Task0 și Task1}} 
 +</​hidden>​ 
 + 
 +<​hidden>​ 
 +**Task 2** Folosiți codul Arduino pentru a implementa un ceas digital folosind un model de LCD pornind de la codul disponibil: [[https://​www.tinkercad.com/​things/​i5JAD1DytMu-copy-of-arduino-digital-clock-without-rtc-module/​editel?​sharecode=NA25XBlf6CdMtIZ9UNoAWGDuaUopZQh8aAye2WJZUEU|Arduino LCD Digital Clock]] 
 +</​hidden>​
  
-===== Resurse =====+===== 6. Resurse =====
  
   * {{:​pm:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}}   * {{:​pm:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}}
Line 116: Line 203:
   * Responsabil:​ [[dbrigalda@gmail.com | Alexandru Vaduva]]   * Responsabil:​ [[dbrigalda@gmail.com | Alexandru Vaduva]]
  
-===== 6. Linkuri Utile =====+===== 7. Linkuri Utile =====
   * [[https://​www.arduino.cc/​en/​Reference/​Wire|Arduino I2C]]   * [[https://​www.arduino.cc/​en/​Reference/​Wire|Arduino I2C]]
   * [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328p]]   * [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328p]]
  
pm/lab/lab6-2021.1618674229.txt.gz · Last modified: 2021/04/17 18:43 by jan.vaduva
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0