This shows you the differences between two versions of the page.
pm:lab:lab2 [2020/03/08 10:23] alexandru.predescu [3. Exerciții] |
pm:lab:lab2 [2020/03/08 11:01] (current) alexandru.predescu |
||
---|---|---|---|
Line 487: | Line 487: | ||
</hidden> | </hidden> | ||
+ | - **(1p)**. Rulați exemplul din scheletul de laborator. Ce mod de funcționare folosește timer-ul? Dar prescaler? | ||
+ | *Pe ecranul LCD-ului se pot vizualiza valorile ''TCNT1'' și ''OCR1A''. | ||
+ | *Limita din dreapta ecranului reprezintă 0xFFFF. | ||
- **(2p)**. Activați întreruperea externă ''PCINTn'' necesară pentru butoanele legate la ''PB2'' și ''PD6''. În handler-ul de întrerupere, aprindeți LED-ul legat la ''PB3'' la apăsarea lui ''PB2'' și stingeți-l la apăsarea lui ''PD6''. | - **(2p)**. Activați întreruperea externă ''PCINTn'' necesară pentru butoanele legate la ''PB2'' și ''PD6''. În handler-ul de întrerupere, aprindeți LED-ul legat la ''PB3'' la apăsarea lui ''PB2'' și stingeți-l la apăsarea lui ''PD6''. | ||
* Hint: butonul este de tip normal deschis, cu rezistență de tip pull-up | * Hint: butonul este de tip normal deschis, cu rezistență de tip pull-up | ||
Line 496: | Line 499: | ||
* La expirarea timpului se va stinge LED-ul legat la ''PB3'' | * La expirarea timpului se va stinge LED-ul legat la ''PB3'' | ||
* La apăsarea butonului ''PD6'', cronometrul va fi oprit și va fi reactivat doar la apăsarea lui ''PB2'' | * La apăsarea butonului ''PD6'', cronometrul va fi oprit și va fi reactivat doar la apăsarea lui ''PB2'' | ||
- | * Hint: Configurați Timer1 în mod //CTC// cu top la ''OCR1A''. Calculați prescaler-ul și valoarea lui ''OCR1A'' pentru a genera întreruperi cu perioada de o secundă. | + | * Hint: Configurați Timer1 în mod //CTC cu top la OCR1A//. Calculați prescaler-ul și valoarea lui ''OCR1A'' pentru a genera întreruperi cu perioada de o secundă. |
- | * <hidden>Nu este prea clara cerinta in ceea ce priveste butonul PD6. Cronometrul isi reia executia la apasarea lui PB2 si nu mai fuctioneaza la apasarea PD6? R: Da</hidden> | + | * <hidden>Nu este prea clara cerinta in ceea ce priveste butonul PD6. Cronometrul isi reia executia la apasarea lui PB2 si nu mai fuctioneaza la apasarea PD6? R: Da (actualizat)</hidden> |
- | - **(2p)**. Dorim ca led-ul conectat la ''PB2'' să funcționeze după următoarea regulă: dintr-o perioadă de o secundă, LED-ul va sta aprins 200 ms. Pentru a implementa acest comportament, vom avea nevoie de al doilea registru de comparație al Timer1, OCR1B. Calculați valorile care ar trebui scrise în registrele ''OCR1A'' și ''OCR1B'' și implementați/modificați rutinele de tratare a întreruperilor astfel încat să obținem acest comportament. | + | - **(2p)**. Dorim ca LED-ul conectat la ''PB2'' să funcționeze după următoarea regulă: dintr-o perioadă de o secundă, LED-ul va sta aprins 200 ms. Pentru a implementa acest comportament, vom avea nevoie de al doilea registru de comparație al Timer1, ''OCR1B''. Calculați valorile care ar trebui scrise în registrele ''OCR1A'' și ''OCR1B'' și implementați/modificați rutinele de tratare a întreruperilor astfel încat să obținem acest comportament. |
- | - **(2p)**. Realizați o alarmă pentru cronometrul de la exercițiul anterior | + | - **(3p)**. Realizați o alarmă pentru cronometrul de la exercițiul anterior |
- | * Configurați Timer2 în mod //CTC// și activați întreruperea corespunzătoare pentru a genera un sunet cu frecvența de 625Hz folosind speaker-ul de pe placă (folosiți ISR-ul pentru a comuta pinul ''PD4''). | + | * Configurați Timer2 în mod //CTC cu top la OCR2A// și activați întreruperea corespunzătoare pentru a genera un sunet cu frecvența de 625Hz folosind speaker-ul de pe placă (folosiți ISR-ul pentru a comuta pinul ''PD4''). |
- | * La expirarea timpului se va emite o alarmă folosind speaker-ul conectat la pinul ''PD4'' | + | * La expirarea timpului se va emite o alarmă folosind speaker-ul conectat la pinul ''PD4'', cu o durată de 2 secunde |
* La apăsarea butonului ''PD6'', cronometrul și alarma vor fi dezactivate | * La apăsarea butonului ''PD6'', cronometrul și alarma vor fi dezactivate | ||
- | * <hidden>Nu inteleg de unde a rezultat valoarea de 186 pentru OCR2A din solutii. Din ce am calculat eu, frecventa intreruperii ar fi de 1250Hz (jumatate din perioada) si pentru aceasta valoare obtin OCR2A = 149. R: Asa este, am schimbat frecventa ca sa dea exact si nu am actualizat solutia </hidden> | + | * <hidden>Nu inteleg de unde a rezultat valoarea de 186 pentru OCR2A din solutii. Din ce am calculat eu, frecventa intreruperii ar fi de 1250Hz (jumatate din perioada) si pentru aceasta valoare obtin OCR2A = 149. R: Asa este, am schimbat frecventa ca sa dea exact. Am actualizat solutia. </hidden> |
- | - **(1p)**. Afișați pe LCD starea cronometrului (timp rămas, activat/dezactivat) | + | - **(1p)** Bonus. Afișați pe LCD starea cronometrului (timp rămas, activat/dezactivat) |
* Afișarea pe LCD se va realiza în bucla principală, la fel ca în [[pm:lab:lab1|laboratorul 1]] | * Afișarea pe LCD se va realiza în bucla principală, la fel ca în [[pm:lab:lab1|laboratorul 1]] | ||
* Obs. Afișarea pe LCD este "independentă" și nu afectează redarea sunetului sau precizia cronometrului. | * Obs. Afișarea pe LCD este "independentă" și nu afectează redarea sunetului sau precizia cronometrului. | ||
- | - **(2p)** Bonus Timer. | + | |
<hidden> | <hidden> | ||
Line 530: | Line 533: | ||
* Ce observați că se întampla cu LED-ul? De ce? | * Ce observați că se întampla cu LED-ul? De ce? | ||
* Ce valoarea trebuie sa îi atribuim lui ''ICR1'' pentru a obține comportamentul dorit în enunț? | * Ce valoarea trebuie sa îi atribuim lui ''ICR1'' pentru a obține comportamentul dorit în enunț? | ||
+ | * [AP] este gresit enuntul sau este "misleading", deoarece nu poate genera overflow cu ICR1 = 50000 | ||
- **(1p + bragging rights)**. În directorul scheletului se generează fișierul ''lab2.lss'', reprezentând codul ASM asociat laboratorului. Numărați ciclii de procesor necesari rulării codului din handler-ul întreruperii de overflow a timer-ului 1. Modificați codul sursă C și folosiți ''ISR_NAKED'' pentru a reduce durata handler-ului. | - **(1p + bragging rights)**. În directorul scheletului se generează fișierul ''lab2.lss'', reprezentând codul ASM asociat laboratorului. Numărați ciclii de procesor necesari rulării codului din handler-ul întreruperii de overflow a timer-ului 1. Modificați codul sursă C și folosiți ''ISR_NAKED'' pentru a reduce durata handler-ului. | ||
</hidden> | </hidden> |