Differences

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

Link to this comparison view

pm:lab:lab5-2023-2024 [2025/04/07 09:52]
dan.tudose [6. Exerciții]
pm:lab:lab5-2023-2024 [2025/04/08 18:06] (current)
andrei.batasev [6. Exerciții]
Line 90: Line 90:
 FRESULT pf_readdir (DIR*, FILINFO*);​ //​ Citește un director FRESULT pf_readdir (DIR*, FILINFO*);​ //​ Citește un director
 </​file>​ </​file>​
 +
 +<note tip> Atunci când folosești pf_write pentru a scrie date, este necesar să apelezi și <file c>​pf_write(NULL,​ 0, &​w)</​file>​ ca să finalizezi scrierea (flush).
 +
 +Dacă nu faci acest pas, citirile ulterioare pot eșua cu o eroare de tip disk error. </​note>​
  
 ===== 6. Exerciții ===== ===== 6. Exerciții =====
 +<​hidden>​
 +Inițializare SD-Card
 +
 +Pentru a putea inițializa cardul SD, trebuie urmați următorii pași:
 +
 +  - Formatați cardul SD folosind sistemul de fișiere **FAT32**
 +  - Creați un fișier numit **log.csv** în rădăcina (root) sistemului de fișiere  ​
 +    ({{ pm:​lab:​log.txt | exemplu de fișier }} – redenumiți-l în **log.csv**!)
 +
 +<note tip>
 +Fișierul trebuie să aibă deja o dimensiune suficient de mare, deoarece din PFF (Petit FAT FileSystem) **nu se poate face append** direct într-un fișier gol sau de dimensiune mică.
 +</​note>​
 +
 +</​hidden>​
 +{{ pm:​lab:​lab5_skel_2025-4.zip | Lab5_Skel }}
 +
 +1. SPI Control (2p total)
 +
 +Implementați funcțiile de bază care asigură comunicarea microcontroller-ului prin SPI: SPI_init() și SPI_exchange() din fișierul spi.c.
 +Urmați comentariile TODO1 și țineți cont de următoarele:​
 +  * PB4 trebuie setat ca output și inițial HIGH.
 +  * Configurați SPI ca master, cu SCLK = fosc/16.
 +  * Folosiți exemplele din datasheet (pagina 217).
 +  * SPDR0 conține octetul transmis și apoi cel recepționat.
 +
 +CHECKPOINT (1p): SPI_exchange() trebuie să trimită și să primească date corect.
 +
 +2. SD Card Control (2p total)
 +
 +Implementați funcțiile SD_init(), SD_receive() și SD_transmit() din sd.c. Urmați TODO2.
 +  * PA2 este pinul SS pentru SD Card, se setează ca output.
 +  * Pentru citire, transmiteți 0xFF (octet dummy).
 +
 +CHECKPOINT (1p): LCD ar trebui să afișeze '​Mounted!'​ după câteva secunde.
 +
 +3. Citirea temperaturii (2p)
 +
 +Configurați ADC-ul și citiți temperatura de la un senzor analog. Implementați adc_init() și adc_read().
 +  * Referință AVcc, prescaler 8.
 +  * Convertiți valoarea ADC în tensiune, apoi în °C (ex: LM35D).
 +  * Afișați temperatura pe LCD.
 +  * Verificați citirea temperaturii și prin USART.
 +
 +4. Logarea temperaturii pe cardul SD (2p)
 +<note tip> Tineti cont ca nu puteti crea sau mari size-ul unui fisier folosind PFF, asa ca va trebui sa va incadrati in marimea fisierului deja existent pe sdcard </​note>​
 +Implementați init_log_display() și log_temperature() în lab5.c astfel încât să logați valorile citite de la senzor într-un fișier CSV.
 +  * Folosiți SD_log_data() pentru scrierea valorilor.
 +  * Afișați temperatura pe LCD și trimiteți-o prin USART.
 +  * La apăsarea butonului PD6, salvați o nouă intrare.
 +
 +5. Navigarea prin loguri (2p total)
  
-Descărcați {{:​pm:​lab:​lab5_skel.zip|arhiva ​cu scheletul de cod}}+Implementați next_log_entry() pentru a citi fișierul log.csv linie cu linie
-Scheletul de cod din laboratorul de astăzi conține mai multe fișiere decât cele de până acum. Asta pentru că pe lângă fișierele pe care va trebui să le modificați voi (lab5.c și spi.c) sunt incluse și headerele și sursele pentru biblioteci (lcd, sd card, FAT file system). În cadrul laboratorului de astăzinu veți scrie foarte multe linii de cod. Este important să înțelegeți modul în care codul vostru va interacționa cu restul scheletului șva folosi bibliotecile acestea+  * Afișați fiecare linie pe LCD. 
 +  * La apăsarea butonului PB2treceți la următoarea linie. 
 +  * Când ajungeți la final, reveniți la început.
  
-  - **(2pSPI Control**. Prima voastră sarcină pentru a implementa player-ul audio este să implementați funcțiile de bază care vor asigura comunicarea microprocesorului nostru prin SPIfuncțiile **SPI_init()** și **SPI_exchange()** din fișierul **spi.c**. Urmăriți comentariile marcate cu // TODO1 //. De asemenea, țineți cont de următoarele hint-uri: +CHECKPOINT ​(1p): Trebuie ​să puteți naviga prin toate logurile.
-        * PIN-ul SS de pe microcontroller (**PB4**) trebuie configurat ca output și setat HIGH. Dacă acesta ar fi setat ca input și ar ajunge LOW, microcontroller-ul ar trece automat interfața SPI în modul slave. +
-        * Pentru implementarea celor 2 funcții, porniți de la exemplele de cod de la pagina 217 din datasheet. +
-        * Folosiți schema din secțiunea 5 pentru a identifica pinii asociați semnalelor **MOSI** și **SCLK**. +
-        * Interfața SPI trebuie configurată ca **Master**. Vom folosi pentru semnalul **SCLK** o frecvență de 16 ori mai mică decât frecvența de ceas a microprocesorului (**fosc/​16**) deoarece, după cum am spus și în secțiunea 3, trebuie ​să ne adaptăm la frecvența suportată de dispozitivul **Slave** (cititorul SD, în cazul nostru). +
-        * Ca rezultat al modului de comunicare descris în secțiunea 3, registrul **SPDR0** va conține, la începutul unei transmisii, datele pe care dorim să le transmitem către **Slave**, iar la finalul transmisiei unui octet, va conține datele primite de la **Slave**. Acest lucru ne va permite să implementăm comunicarea într-o singură funcție, **SPI_exchange()**,​ în loc să avem 2 funcții (e.g. **SPI_read()** ș**SPI_write()**). +
-  - **(3p) SD Card Control**. În continuare, vom implementa funcțiile de bază pentru comunicarea cu cardul SD (practic, o abstractizare peste funcțiile SPI de la exercițiul anterior). Sarcina voastră este să implementați funcțiile **SD_init()**,​ **SD_receive()** și **SD_transmit()** din fișierul **sd.c**. Urmăriți comentariile marcate cu //TODO2// și țineți cont de următoarele hint-uri: +
-        * **PA2** este pin-ul ce corespunde semnalului SS pentru cardul SD. Acesta trebuie setat ca output, însă nu trebuie setat pe starea **HIGH** sau **LOW** (acest lucru va fi gestionat de scheletul de cod). +
-        * Comunicarea,​ atât la recepție, cât și la transmisie, va fi asigurată de funcția **SPI_exchange()**. În cazul recepției, nu ne va interesa să transmitem date utile, ci doar să citim date de pe cardul SD. Cu toate acestea, din cauza faptului că microprocesorul nostru acționează ca dispozitiv **Master**, el este cel care trebuie să inițieze comunicația și care trebuie să transmită mai întâi un octet pentru a citi ulterior un octet de la cardul SD. Pentru asta, va trebui să trimitem în cazul funcției **SD_receive()** un octet dummy, cu valoarea **0xff**. +
-        * **CHECKPOINT:​** După implementarea acestui task ar trebui ca, la câteva secunde după upload-ul programului,​ textul afișat pe LCD să se schimbe din //​Mounting...//​ în //​Mounted!//​. Dacă nu se întâmplă asta, încercați să reporniți programul folosind butonul de //RESET// de pe plăcuță (dacă nu merge nici așa, faceți debugging împreună cu asistentul :) ). +
-  - **(2p) First File Display.** Acum că am reușit să montăm filesytem-ul de pe cardul SD, ne dorim să afișăm numele primului fișier audio din directorul **/music**. Urmăriți comentariile marcate cu //TODO3// în fișerul **lab5.c** și implementați astfel funcția **init_directory()**. +
-        * Folosiți funcția **pf_opendir()** pentru a deschide directorul și funcția **pf_readdir()** pentru a naviga prin acesta. +
-        * La parcurgerea directorului,​ e posibil să găsiți și niște fișiere "​poluate",​ al căror nume începe cu underscore. Filtrați aceste fișiere. Practic, va trebui să parcurgeți fișerele și să vă opriți la primul fișier al cărui nume nu începe cu underscore. +
-        * Pentru afișarea pe ecranul LCD-ului, puteți să vă inspirați din apelurile **LCD_clear_top_line()** și **LDC_printAt()** utilizate în main pentru afișarea mesajului //​Mounted!//​ +
-  - **(2p) File Cycling**. La apăsarea butonului PB2, afișați pe ecranul LCD-ului următorul fișier din directorul **/music**. Când ajungeți la ultimul fișier, săriți din noul la primul fișier. Urmăriți comentariile marcate cu //TODO4// în fișierul **lab5.c**. Din nou, va trebui să ignorați fișierele al căror nume începe cu underscore. +
-        * Funcția **pf_readdir()** va completa parametrul **file** cu un fișier cu numele ""​ (string-ul vid) atunci când s-a ajuns la finalul directorului. +
-        * Nu uitați de implementarea debounce-ului pentru apăsarea butonului +
-  - **(1p) Play Music.** Party time! La apăsarea butonului PD6, folosiți funcția **play()** din fișierul **lab5.c** pentru a reda pe speaker fișierul afișat la momentul curent pe LCD. Urmăriți comentariile marcate cu //TODO5// în scheletul de laborator. +
-        * Funcția **play()** este blocantă. Pentru a opri redarea fișierului curent, apăsați simultan butoanele PD6 și PB2. Acest feature este deja implementat în scheletul de cod și poate fi folosit direct.+
  
 ===== 4. Linkuri utile  ===== ===== 4. Linkuri utile  =====
Line 123: Line 162:
 ===== 5. Responsabili laborator ===== ===== 5. Responsabili laborator =====
  
-  * [[virtanrazvan@gmail.com|Răzvan Vîrtan]] +  * [[vlad.radulescu2901@upb.ro|Vlad dulescu]] 
-  * [[daniel.rosner@cs.pub.ro|Daniel Rosner]]+  * [[ga.andrei.batasev@gmail.com|Andrei Batasev]]
  
pm/lab/lab5-2023-2024.1744008760.txt.gz · Last modified: 2025/04/07 09:52 by dan.tudose
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