This shows you the differences between two versions of the page.
pm:lab:lab4-2023-2024 [2024/03/31 04:50] mihnea.dinica [Registre] |
pm:lab:lab4-2023-2024 [2025/04/02 11:11] (current) florin.stancu |
||
---|---|---|---|
Line 86: | Line 86: | ||
**F_ADC = F_CPU / PRESCALER** | **F_ADC = F_CPU / PRESCALER** | ||
- | Alegerea prescaler-ului depinde de frecventa de esentionare si de acuratetea dorita. Cu cat prescaler-ul este mai mare frecventa ADC va fi mai mica si acuratetea va fi mai mare. Mai multe informatii se pot gasi in capitolul 23.5 din [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42743-ATmega324P_Datasheet.pdf|Datasheet ATmega324P]]. | + | Alegerea prescaler-ului depinde de frecventa de esentionare si de acuratetea dorita. Cu cat prescaler-ul este mai mare frecventa ADC va fi mai mica si acuratetea va fi mai mare. Mai multe informatii se pot gasi in capitolul 25.4 din [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42743-ATmega324P_Datasheet.pdf|Datasheet ATmega324P]]. |
==== Moduri de functionare ==== | ==== Moduri de functionare ==== | ||
Line 145: | Line 145: | ||
ADCSRA |= (1 << ADSC); | ADCSRA |= (1 << ADSC); | ||
/* wait until conversion is complete */ | /* wait until conversion is complete */ | ||
- | while (!(ADCSRA & (1 << ADIF))); | + | while ((ADCSRA & (1 << ADSC))); |
uint32_t result = ADC; | uint32_t result = ADC; | ||
</code> | </code> | ||
Line 152: | Line 152: | ||
Obiectivul exercitiilor este sa controlam convertorul analog-digital integrat in microprocesorul Atmega324p pentru diferite citiri (butoane multiplexate prin divizoare de tensiune, senzor de temperatura). | Obiectivul exercitiilor este sa controlam convertorul analog-digital integrat in microprocesorul Atmega324p pentru diferite citiri (butoane multiplexate prin divizoare de tensiune, senzor de temperatura). | ||
- | Scheletul de cod {{:pm:lab:lab_4_skel.zip|}} | + | Scheletul de cod este {{:pm:lab:lab4_skel.zip|aici}}. |
- | **Task 0** | + | **Task 0** (2 puncte) Completați scheletul de cod (fișierul “adc.c”) astfel încât sa definiți o funcție cu un comportament similar analogRead(uint8_t pin) → aceasta face o singura conversie a semnalului de pe pinul specificat și este blocanta pana la returnarea rezultatului. |
- | Completați scheletul de cod (fișierul "adc.c") astfel încât sa definiți o funcție cu un comportament similar analogRead(uint8_t pin) -> aceasta face o singura conversie a semnalului de pe pinul specificat și este blocanta pana la returnarea rezultatului. | + | |
- | **Task 1** | + | **Task 1** (1 punct) Folosind funcția anterior definită, citiți valorile de pe senzorul de temperatura (PA0). Puteti pune degetul peste el (pe proprie răspundere) și observa cum se modifica valorile. Senzorul de temperatura `MCP9701T-E/TT` are un interval de functionare de -10°C - 125°C. |
- | Folosind funcția anterior definită, citiți valorile de pe senzorul de temperatura (PA0). Puteti pune degetul peste el (pe proprie răspundere :) ) și observa cum se modifica valorile. | + | |
- | **Task 2** | + | <note warning> |
- | Butoanele 1-6 sunt multiplexate pe același pin analogic (PA5) prin intermediul unui sistem de divizoare de tensiune (urmăriți schematicul pentru o explicație vizuala). Aflați ce valoare întoarce fiecare buton la apăsare și completați "define-urile" din cod. Completați codul astfel încât la apăsarea BTN2 sa se aprindă doar LED-ul roșu, la apăsarea BTN3 - LED-ul verde, iar la apăsarea BTN5 - LED-ul albastru. | + | AVR Libc are implicit o implementare simplistică a printf()-ului care nu știe să formateze valori floating point. Dacă doriți să meargă ''%f'' & friends, va trebui să activați o setare de bibliotecă prin linker-ul GCC, desigur, prin ''platformio.ini'': <code>build_flags = -Wl,-u,vfprintf -lprintf_flt -lm</code> |
+ | </note> | ||
- | **Task 3** | + | **Task 2** (3 puncte) Butoanele 1-6 sunt multiplexate pe același pin analogic (PA5) prin intermediul unui sistem de divizoare de tensiune (urmăriți schematicul pentru o explicație vizuala). Aflați ce valoare întoarce fiecare buton la apăsare și completați “define-urile” din cod. Completați codul astfel încât la apăsarea BTN1 sa se aprindă doar LED-ul magenta, la apăsarea BTN4 - LED-ul galben, iar la apăsarea BTN6 - LED-ul cyan. |
- | Configurați ADC-ul astfel încât conversia valorilor citite de pe senzorul de temperatura sa se întâmple automat la interval de 1 sec. Folosiți-vă de timer1, este deja configurat sa genereze întreruperi la fiecare secunda! Hint: citiți in datasheet despre ADC Auto Trigger Enable și ADC Auto Trigger Source, care pot începe conversiile automat la apariția unui eveniment; altfel, puteți realiza manual o citire cu funcția completată in Task 0 la fiecare întrerupere de timer, caz in care nu este necesar sa completați și primele 3 funcții din scheletul task-ului 3. | + | |
+ | > Hint: culorile cerute se pot obtine prin combinarea a cate 2 leduri dintre rosu, verde si albastru | ||
+ | |||
+ | **Task 3** (4 puncte) Configurați ADC-ul astfel încât conversia valorilor citite de pe senzorul de temperatura sa se întâmple in mod continuu. Configurati LED-ul RBG astfel incat sa afiseze o culoare intre albastru si rosu. (Albastru va corespunde unei temperaturi de 20°C, iar rosu unei temperaturi de 30°C). Folositi FastPWM de 8 biti pentru culorile ledurilor. NU MODIFICATI CODUL DIN FUNCTIA `task3`! | ||
+ | |||
+ | > Hint: folositi functia `remap_interval` pentru a calcula duty-cycle pentru cele 2 timere | ||
+ | |||
+ | **Task 4 (BONUS)** (1 punct) Configurati ADC-ul astfel incat sa aiba o rezolutie de 8 biti si observati diferenta de timp la rulare. | ||
===== 5. Linkuri utile ===== | ===== 5. Linkuri utile ===== | ||
* [1] [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42743-ATmega324P_Datasheet.pdf|Datasheet ATmega324P]] | * [1] [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42743-ATmega324P_Datasheet.pdf|Datasheet ATmega324P]] | ||
* [2] [[https://github.com/dantudose/PM-Board|Documentatie placuta laborator]] | * [2] [[https://github.com/dantudose/PM-Board|Documentatie placuta laborator]] | ||
+ | * [3] [[https://www.instructables.com/Accessing-5-buttons-through-1-Arduino-pin-Revisi|Butoane multiplexate pe un pin]] | ||
===== 6. Responsabili laborator ===== | ===== 6. Responsabili laborator ===== | ||
- | * [[mihnea.dinica@stud.acs.upb.ro|Mihnea Dinica]] | + | * Eduard Radu |
- | * [[cristi.tranca@gmail.com|Cristi Tranca]] | + | * Alexandru Jipa |