Differences

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

Link to this comparison view

pm:lab:lab5-2022 [2022/04/11 00:37]
ionut.otelea created
pm:lab:lab5-2022 [2023/04/13 15:16] (current)
liliana.grigoriu [5. Configurări de SPI]
Line 1: Line 1:
 +/**
 + * uncomment this to publish the solution:
 + * ~~SHOWSOLUTION~~
 + */
 +~~SHOWSOLUTION~~
 +
 ===== Laboratorul 5: SPI (Serial Peripheral Interface) ===== ===== Laboratorul 5: SPI (Serial Peripheral Interface) =====
 Acest laborator acoperă noțiunea de SPI. 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/​Serial_Peripheral_Interface?​fbclid=IwAR3qQ8-N1G8sf38MDyQFSq4vtjz3aj9oynzeG46HjJoLr1OrBxybdlB74Fk|Serial Peripheral Interface}}. Acest laborator acoperă noțiunea de SPI. 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/​Serial_Peripheral_Interface?​fbclid=IwAR3qQ8-N1G8sf38MDyQFSq4vtjz3aj9oynzeG46HjJoLr1OrBxybdlB74Fk|Serial Peripheral Interface}}.
Line 40: Line 46:
 Clock Polarity (CPOL) configurează starea IDLE a ceasului. După cum putem vedea, pentru CPOL = 0, când ceasul este inactiv valoarea semnalului SCLK este pe LOW, iar pentru CPOL = 1 ceasul inactiv are SCLK pe HIGH. Clock Polarity (CPOL) configurează starea IDLE a ceasului. După cum putem vedea, pentru CPOL = 0, când ceasul este inactiv valoarea semnalului SCLK este pe LOW, iar pentru CPOL = 1 ceasul inactiv are SCLK pe HIGH.
  
-Clock Phase (CPHA) configurează momentul când datele sunt generate pe ieșire și când datele sunt citite la intrare. Pe una dintre fronturile ceasului (de întâmpinare sau de sfârșit) datele sunt generate, iar pe cealaltă datele sunt citite.+Clock Phase (CPHA) configurează momentul când datele sunt generate pe ieșire și când datele sunt citite la intrare. Pe unul dintre fronturile ceasului (de întâmpinare sau de sfârșit) datele sunt generate, iar pe cealaltă datele sunt citite.
  
 Frontul de pornire al ceasului este prima schimbare de ceas. Ex: Pentru un ceas care merge de la LOW la HIGH și înapoi la LOW, frontul de întâmpinare este frontul crescător(tranziția de la LOW la HIGH). Frontul de pornire al ceasului este prima schimbare de ceas. Ex: Pentru un ceas care merge de la LOW la HIGH și înapoi la LOW, frontul de întâmpinare este frontul crescător(tranziția de la LOW la HIGH).
Line 108: Line 114:
 <​code>​ <​code>​
 /* set master mode */ /* set master mode */
-SPCR0 |= (1 << ​MSTR0);+SPCR |= (1 << ​MSTR);
  
 /* set prescaler 16 */ /* set prescaler 16 */
-SPCR0 |=  (1 << ​SPR00);+SPCR |=  (1 << ​SPR);
  
 /* enable SPI  */ /* enable SPI  */
-SPCR0 |= (1 << ​SPE0);+SPCR |= (1 << ​SPE);
 </​code>​ </​code>​
  
Line 120: Line 126:
 <​code>​ <​code>​
 /* Start transmission */ /* Start transmission */
-SPDR0 = data;+SPDR = data;
  
 /* Wait for transmission complete */ /* Wait for transmission complete */
-while(!(SPSR0 & (1 << ​SPIF0)));+while(!(SPSR & (1 << ​SPIF)));
 </​code>​ </​code>​
  
Line 129: Line 135:
 <​code>​ <​code>​
 /* Wait for reception complete */ /* Wait for reception complete */
-while(!(SPSR0 & (1 << ​SPIF0)));+while(!(SPSR & (1 << ​SPIF)));
   
 /* Return Data Register */ /* Return Data Register */
-return ​SPDR0;+return ​SPDR;
 </​code>​ </​code>​
  
-==== SPI în Arduino IDE ====+===== 7. SPI în Arduino IDE =====
  
 Mediul de dezvoltare Arduino IDE ne oferă posibilitatea de a folosi biblioteca “SPI.h” Mediul de dezvoltare Arduino IDE ne oferă posibilitatea de a folosi biblioteca “SPI.h”
Line 170: Line 176:
  
 ===== 8. Exerciții ===== ===== 8. Exerciții =====
-1. Realizati ​o comunicație prin SPI între 2 plăcuțe Arduino. Hotărâți ce plăcuță va fi +  - Realizați ​o comunicație prin SPI între 2 plăcuțe Arduino. 
-Master și care va fi Slave. Trimiteți un mesaj de la Master către Slave, cât și de la  +    * Hotărâți ce plăcuță va fi Master și care va fi Slave (Câte o echipă poate alege să facă codul pentru Master și cealaltă pentru Slave). 
-Slave la Master și afișați-le pe interfața serială. Stabiliți o lungime minimă a +    * Trimiteți un mesaj de la Master către Slave, cât și de la Slave la Master și afișați-le pe interfața serială. Stabiliți o lungime minimă a informației ce trebuie trimisă înainte să opriți transmiterea datelor. 
-informației ce trebuie trimisă înainte să opriți transmiterea datelor. Pentru a +    * Pentru a putea să detectați comunicația SPI din Slave puteți implementa întreruperea SPI_STC_vect (trebuie să adaugați în setup "​SPI.attachInterrupt();"​ - cum trebuiau să fie declarate variabilele modificate în întreruperi?​). ​După ce ați încărcat codul pe plăcuțe, resetați-le pe ambele (apăsând butonul roșu de pe acestea), întâi plăcuța Slave (care va aștepta apoi inițierea comunicației) și apoi plăcuța Master (care va iniția comunicația).{{ :​pm:​lab:​spi_communication.jpg?​600 |}} 
-putea să detectați comunicația SPI din Slave puteți implementa întreruperea +
-SPI_STC_vect (trebuie să adaugați în setup "​SPI.attachInterrupt();"​ - cum trebuiau +
-să fie declarate variabilele modificate în întreruperi?​).+
  
 +  - **(Bonus)** Un card MicroSD este un exemplu de memorie nevolatilă. Pentru ca plăcuța Arduino UNO să poată comunica prin SPI cu cardul, avem nevoie de un adaptor. ​ În privința codului, pe lângă biblioteca "​SPI.h"​ prezentată mai sus avem nevoie și de biblioteca "​SD.h"​ despre care vă sfătuim să citiți înainte să continuați cu exercițiile.
 +    * a) Scrieți un secret într-un fișier numit "​sd.txt"​ pe cardul SD.
 +    * b) Faceți schimb de carduri cu colegii voștri și citiți-le secretul.
 +    * c) Realizați un contor al resetărilor plăcuței Arduino scriind pe cardul SD în fișierul "​re.txt"​ numărul de resetări.
  
 +<note tip>​**Hint1**:​ La resetare se rulează din nou codul din setup.\\
 +**Hint2**: Salvați pe cardul SD ultima valoare a numărului de resetări.</​note>​
 +<note warning>​**Dacă ați modificat montajul pentru a realiza exercițiul bonus, refaceți schema exercițiului 1 înainte de a pleca!**</​note>​
 +{{ :​pm:​lab:​microsd_la_arduino.png?​500 |}}
   * {{https://​www.arduino.cc/​en/​reference/​SD|SD.h}}   * {{https://​www.arduino.cc/​en/​reference/​SD|SD.h}}
 <file c> <file c>
Line 217: Line 228:
   * {{:​pm:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}}   * {{:​pm:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|Datasheet Atmega 328p}}
   * Arduino UNO pinout   * Arduino UNO pinout
-{{:​pm:​lab:​uno.jpg?​200|pinout Arduino UNO}} +{{:​pm:​lab:​uno.jpg?​500|pinout Arduino UNO}} 
-  * Responsabil: [[dbrigalda@gmail.com Dumitru Brigalda]]+  * Responsabili: [[bogdan.ciobanu1201@stud.acs.upb.ro ​Bogdan-Călin Ciobanu]]  ​[[ionut.otelea@upb.ro | Ionuț-Gabriel Oțelea]]  
 + 
 +<​solution>​ 
 +<​hidden>​Arhiva cu soluțiile o puteți descărca de aici: {{:​pm:​lab:​lab5:​lab5-solved.zip}}</​hidden>​ 
 +</​solution>​
  
 ===== 10. Linkuri Utile ===== ===== 10. Linkuri Utile =====
pm/lab/lab5-2022.1649626651.txt.gz · Last modified: 2022/04/11 00:37 by ionut.otelea
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