Differences

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

Link to this comparison view

pm:lab:lab6-2023-2024 [2024/04/15 09:31]
irina_cristina.nita [6. Exerciții]
pm:lab:lab6-2023-2024 [2025/04/09 02:43] (current)
mihnea.dinica Add points
Line 7: Line 7:
 ===== Laboratorul 6: 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-42743-ATmega324P_Datasheet.pdf|Datasheet ATmega324P]] ș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-42743-ATmega324P_Datasheet.pdf|Datasheet ATmega324P]] ​(Capitolul 23: TWI - 2-wire Serial Interface) ​și [[https://​en.wikipedia.org/​wiki/​I%C2%B2C|Inter-Integrated Circuit]].
  
 ===== 1. I2C (Inter-Integrated Circuit) ===== ===== 1. I2C (Inter-Integrated Circuit) =====
Line 49: Line 49:
  
 === 4. Condiția de stop === === 4. Condiția de stop ===
-După ce toate cadrele de date au fost interschimbate,​ master-ul generează condiția de stop. Aceasta este realizată prin eliberarea liniei SDA (trecere din LOW în HIGH) **după** eliberarea liniei SCL (trecere din LOW în HIGH).+După ce toate cadrele de date au fost interschimbate,​ master-ul generează condiția de stop. Aceasta este realizată prin eliberarea liniei SDA (trecere din LOW în HIGH) **după** eliberarea liniei SCL (trecere din LOW în HIGH). Pentru claritate, prima linie eliberata este SCL, urmata imediat de SDA.
  
 {{pm:​lab:​image6.png?​700}} {{pm:​lab:​image6.png?​700}}
Line 59: Line 59:
 ===== 3. Registre configurare I2C ===== ===== 3. Registre configurare I2C =====
  
-Arduino ​poate funcționa atât în modul I2C Master cât și I2C Slave.+ATMega324P ​poate funcționa atât în modul I2C Master cât și I2C Slave.
  
 ==== TWI Bit Rate Register ==== ==== TWI Bit Rate Register ====
 {{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 ==== ==== TWI Control Register ====
 {{pm:​lab:​twcr.png?​600}} {{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.+ 
 +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   * TWINT : TWI Interrupt Flag
-    * 1 - Clear, ​setat din softwarein rest este setat de hardware.+    * 1 - In general este setat de hardware, cand s-a incheiat etapa curenta de comunicare I2C si se asteapta o interactiune ​din partea ​software-ului. Daca intreruperile sunt activate (bit I in SREG si bit TWIE aici), se va executa ISR-ul aferent. Incheierea acestei rutine nu dezactiveaza automat flagul, deci pentru a fi //cleared// trebuie ​setat din software (prin scierea 1 logic).
   * TWEA: TWI Enable Acknowledge Bit   * TWEA: TWI Enable Acknowledge Bit
     * 1 - ACK este trimis     * 1 - ACK este trimis
Line 76: Line 78:
     * 1 - Permite comunicarea     * 1 - Permite comunicarea
     * 0 - Încheierea transmisiunii indiferent de stare     * 0 - Încheierea transmisiunii indiferent de stare
 +  * TWIE: TWI Interrupt Enable 
 +    * 1 - Intreruperea I2C este activata (atat timp cat bitul TWINT este high) 
 +    * 0 - Intreruperea I2C este dezactivata 
 +  * TWSTA: TWI START Condition 
 +    * 1 - Setat software atunci cand se doreste sa obtinem statusul de Master pe magistrala I2C. 
 +  * TWSTO: TWI STOP Condition 
 +    * 1 - Setat software atunci cand vrem sa facem release la statusul de Master.
 ==== TWI Status Register ==== ==== TWI Status Register ====
 {{pm:​lab:​twsr.png?​600}} {{pm:​lab:​twsr.png?​600}}
-  * TWSR descrie statusul si prescalerul interfeței.+ 
 +TWSR descrie statusul si prescalerul interfeței.
  
 ==== TWI Data Register ==== ==== TWI Data Register ====
 {{pm:​lab:​twdr.png?​600}} {{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.+ 
 +TWDR conține în modul de transmisie următorul octet de transmis iar în modul de recepție ultimul octet primit.
  
 ===== 4. Utilizarea modulului I2C pe AVR ===== ===== 4. Utilizarea modulului I2C pe AVR =====
Line 126: Line 136:
 Comunicarea cu senzorul se va face prin citirea/​scrierea registrelor senzorului, folosind I2C. Pentru accesarea unui registru, atât pentru scriere Comunicarea cu senzorul se va face prin citirea/​scrierea registrelor senzorului, folosind I2C. Pentru accesarea unui registru, atât pentru scriere
 cât și pentru citire, este necesară transmiterea adresei acestuia înainte de operație. Tabela cu registrele si adresele acestora, se găsește cât și pentru citire, este necesară transmiterea adresei acestuia înainte de operație. Tabela cu registrele si adresele acestora, se găsește
-în [[https://​www.nxp.com/​docs/​en/​data-sheet/​MPL3115A2.pdf|Datasheet]],​ în secțiunea ''​14''​.+în [[https://​www.nxp.com/​docs/​en/​data-sheet/​MPL3115A2.pdf|Datasheet-ul senzorului]], în secțiunea ''​14''​.
  
 {{ :​pm:​lab:​lab6:​mpl3115a2-registers.jpeg?​400 |}} {{ :​pm:​lab:​lab6:​mpl3115a2-registers.jpeg?​400 |}}
Line 132: Line 142:
 ===== 6. Exerciții ===== ===== 6. Exerciții =====
  
-Descărcați {{:​pm:​lab:​lab6:​lab6-skel-2023-2024.zip|arhiva cu scheletul de cod}}. Urmăriți indicațiile din ''​TODO''​-uri.+Descărcați {{:​pm:​lab:​lab6:​lab6-skel-2025.zip|arhiva cu scheletul de cod}}. Urmăriți indicațiile din ''​TODO''​-uri.
  
-**Task 0.** Completați corpul funcțiilor ''​twi_init'',​ ''​twi_start''​ și ''​twi_stop''​ din fișierul ''​twi.c''​. ​+**Task 0 [2p].** Completați corpul funcțiilor ''​twi_init'',​ ''​twi_start''​ și ''​twi_stop''​ din fișierul ''​twi.c''​. ​
  
 <​note>​ <​note>​
Line 140: Line 150:
 </​note>​ </​note>​
  
-**Task 1.** Completați corpul funcțiilor ''​twi_read_ack'',​ ''​twi_read_nack''​ și ''​twi_write''​ din fișierul ''​twi.c''​.+**Task 1 [2p].** Completați corpul funcțiilor ''​twi_read_ack'',​ ''​twi_read_nack''​ și ''​twi_write''​ din fișierul ''​twi.c''​.
  
 <​note>​ <​note>​
Line 147: Line 157:
 </​note>​ </​note>​
  
-**Task 2.** Completați corpul funcției ''​twi_discover''​ din fișierul ''​twi.c''​. Funcția trebuie să trimită un SLA_R (slave read)+**Task 2 [2p].** Completați corpul funcției ''​twi_discover''​ din fișierul ''​twi.c''​. Funcția trebuie să trimită un SLA_R (slave read)
 către toate adresele posibile pentru I2C slaves (0-127), pentru a determina ce dispozitive sunt conectate pe magistrala de I2C. către toate adresele posibile pentru I2C slaves (0-127), pentru a determina ce dispozitive sunt conectate pe magistrala de I2C.
 Afișați pe serial adresele dispozitivelor conectate și nu uitați să apelați funcția în ''​main''​. Afișați pe serial adresele dispozitivelor conectate și nu uitați să apelați funcția în ''​main''​.
Line 167: Line 177:
 </​note>​ </​note>​
  
-**Task 3.** În următoarele task-uri, vom folosi senzorul **MPL3115A2**,​ prezentat anterior. Pentru a putea configura și citi valorile+**Task 3 [4p].** În următoarele task-uri, vom folosi senzorul **MPL3115A2**,​ prezentat anterior. Pentru a putea configura și citi valorile
 registrelor senzorului, vom urmări pașii din diagrama de stări de mai jos, preluată din [[https://​www.nxp.com/​docs/​en/​data-sheet/​MPL3115A2.pdf|Datasheet MPL3115A2]]. ​ registrelor senzorului, vom urmări pașii din diagrama de stări de mai jos, preluată din [[https://​www.nxp.com/​docs/​en/​data-sheet/​MPL3115A2.pdf|Datasheet MPL3115A2]]. ​
  
Line 177: Line 187:
 </​note>​ </​note>​
  
-**Task 3.1.** Pentru început, vrem să inițializăm senzorul. Completați corpul funcției ''​mpl3115a2_init''​ din fișierul ''​mpl3115a2.c''​. Aceasta va trebui apelată în cadrul+**Task 3.1 [1p].** Pentru început, vrem să inițializăm senzorul. Completați corpul funcției ''​mpl3115a2_init''​ din fișierul ''​mpl3115a2.c''​. Aceasta va trebui apelată în cadrul
 funcției ''​main'',​ înainte de loop. funcției ''​main'',​ înainte de loop.
  
-**Task 3.2.** Completați corpul funcțiilor ''​mpl3115a2_read_pressure''​ și ''​mpl3115a2_read_temperature''​ din fișierul ''​mpl3115a2.c''​. Acestea vor trebui apelate în cadrul+**Task 3.2 [3p].** Completați corpul funcțiilor ''​mpl3115a2_read_pressure''​ și ''​mpl3115a2_read_temperature''​ din fișierul ''​mpl3115a2.c''​. Acestea vor trebui apelate în cadrul
 funcției ''​main'',​ în interiorul loop-ului. Afișați valorile citite pe serial. funcției ''​main'',​ în interiorul loop-ului. Afișați valorile citite pe serial.
  
Line 227: Line 237:
 <​hidden>​ <​hidden>​
 <​solution>​ <​solution>​
-Arhiva cu soluțiile o puteți descărca de aici: {{:​pm:​lab:​lab6:​lab6-skel-solution.zip}}+Arhiva cu soluțiile o puteți descărca de aici: {{:​pm:​lab:​lab6:​lab6-solution-2025.zip}}
 </​solution>​ </​solution>​
 </​hidden>​ </​hidden>​
Line 239: Line 249:
 ===== 8. Responsabili laborator ===== ===== 8. Responsabili laborator =====
  
-  * [[irina_cristina.nita@stud.acs.upb.ro|Irina-Cristina Niță]] +  * [[mihnea.dinica@stud.acs.upb.ro|Mihnea-Gabriel Dinica]] 
-  * [[sebastian.severin@stud.acs.upb.ro|Sebastian Severin]]+  * [[atoader@stud.acs.upb.ro|Alexandru Toader]]
  
pm/lab/lab6-2023-2024.1713162662.txt.gz · Last modified: 2024/04/15 09:31 by irina_cristina.nita
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