This shows you the differences between two versions of the page.
pm:lab:lab0-2022 [2022/04/01 14:00] robert_mihai.lica Changed the dropdowns |
pm:lab:lab0-2022 [2023/03/12 10:02] (current) daniel.dosaru [6. Link-uri utile] |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | /** | ||
+ | * uncomment this to publish the solution: | ||
+ | * ~~SHOWSOLUTION~~ | ||
+ | */ | ||
+ | ~~SHOWSOLUTION~~ | ||
+ | |||
====== Laboratorul 0: Aplicații introductive ====== | ====== Laboratorul 0: Aplicații introductive ====== | ||
**Capitole utile din [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]]** | **Capitole utile din [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Datasheet ATmega328P]]** | ||
* 1. Pin Configurations - pag. 3 | * 1. Pin Configurations - pag. 3 | ||
- | * 14. I/O-Ports - pag. 58 | + | * 13. I/O-Ports - pag. 58 |
===== 1. Introducere ===== | ===== 1. Introducere ===== | ||
Line 23: | Line 29: | ||
Le gasim in diferite dispozitive precum: telefoane, electro-casnice, sateliti, avioane, in fabrici etc. Există o gamă largă de microcontrollere disponibile și acestea se aleg în funcție de aplicație, având în vedere mai ales optimizarea costului și a consumului energetic pentru dispozitivul unde µC urmează a fi folosit. | Le gasim in diferite dispozitive precum: telefoane, electro-casnice, sateliti, avioane, in fabrici etc. Există o gamă largă de microcontrollere disponibile și acestea se aleg în funcție de aplicație, având în vedere mai ales optimizarea costului și a consumului energetic pentru dispozitivul unde µC urmează a fi folosit. | ||
- | <spoiler Exemple de proiecte> | + | <spoiler Exemple de proiecte > |
{{:pm:lab:lab0:bird_tracking2.jpg?direct&100| [1] Bird tracking}} | {{:pm:lab:lab0:bird_tracking2.jpg?direct&100| [1] Bird tracking}} | ||
Line 52: | Line 58: | ||
* Porturi digitale de intrare-ieşire de uz general (**GPIO** - General Purpose Input Output) | * Porturi digitale de intrare-ieşire de uz general (**GPIO** - General Purpose Input Output) | ||
* Interfeţe seriale de comunicație (**USART**, **SPI**, **I2C**, PCM, **USB**, SDIO etc.) | * Interfeţe seriale de comunicație (**USART**, **SPI**, **I2C**, PCM, **USB**, SDIO etc.) | ||
- | <spoiler More> | + | <spoiler More > |
* Interfețe ethernet | * Interfețe ethernet | ||
* Interfețe pentru afișaj grafic (LVDS, **HDMI** sau alte protocoale dedicate controlului afișajelor LCD) | * Interfețe pentru afișaj grafic (LVDS, **HDMI** sau alte protocoale dedicate controlului afișajelor LCD) | ||
Line 79: | Line 85: | ||
- | <spoiler Specificatiile µC-ului> | + | <spoiler Specificatiile µC-ului > |
* 32 KB Flash (determină dimensiunea maximă a programului care poate fi executat) | * 32 KB Flash (determină dimensiunea maximă a programului care poate fi executat) | ||
Line 118: | Line 124: | ||
Desi la laborator va vom pune sa lucrati direct cu adrese de memorie pentru a configura pinii si a ii controla, va vom arata cum sa folositi si un framework numit Arduino. Acesta este scris in C++ si este practic o biblioteca cu functii ajutatoare si headere (fisiere .h) cu define-uri pentru fiecare procesor in parte. Ca orice nivel de abstractizare in plus, acesta face dezvoltarea mai usoara, dar aduce si un performance penalty de chiar si 20 de ori mai incet uneori. | Desi la laborator va vom pune sa lucrati direct cu adrese de memorie pentru a configura pinii si a ii controla, va vom arata cum sa folositi si un framework numit Arduino. Acesta este scris in C++ si este practic o biblioteca cu functii ajutatoare si headere (fisiere .h) cu define-uri pentru fiecare procesor in parte. Ca orice nivel de abstractizare in plus, acesta face dezvoltarea mai usoara, dar aduce si un performance penalty de chiar si 20 de ori mai incet uneori. | ||
- | 3 | + | |
===== 3. Let's get to work ===== | ===== 3. Let's get to work ===== | ||
Line 148: | Line 154: | ||
LED-urile - Light Emitting Diode - numite și diode electroluminesciente emit lumină când ele sunt polarizate direct. A nu se confunca cu becurile deoarece au metode de functionare radical diferite. | LED-urile - Light Emitting Diode - numite și diode electroluminesciente emit lumină când ele sunt polarizate direct. A nu se confunca cu becurile deoarece au metode de functionare radical diferite. | ||
- | <spoiler In depth> | + | <spoiler In depth > |
În funcție de semiconductorii care sunt utilizați în construcție, și de plasticul ce are rol de lentilă de dispersie și filtru optic, LED-urile pot emite lumină în diferite culori. Nu confundați LED-urile cu becurile! În timp ce becurile emit lumina prin încalzirea unui filament de tungsten la temperaturi foarte mari, LED-urile emit lumina trecând un curent printr-un material semiconductor (joncțiune p-n). Spre deosebire de becuri, al căror randament este de sub 5% - majoritatea energiei primite de ele se pierde prin efect caloric -, LED-urile au un randament de transformare a energiei electrice în energie luminoasă mult mai mare. | În funcție de semiconductorii care sunt utilizați în construcție, și de plasticul ce are rol de lentilă de dispersie și filtru optic, LED-urile pot emite lumină în diferite culori. Nu confundați LED-urile cu becurile! În timp ce becurile emit lumina prin încalzirea unui filament de tungsten la temperaturi foarte mari, LED-urile emit lumina trecând un curent printr-un material semiconductor (joncțiune p-n). Spre deosebire de becuri, al căror randament este de sub 5% - majoritatea energiei primite de ele se pierde prin efect caloric -, LED-urile au un randament de transformare a energiei electrice în energie luminoasă mult mai mare. | ||
</spoiler> | </spoiler> | ||
Line 184: | Line 190: | ||
Acesta poate fi considerat cel mai important pas atunci cand dorim sa folosim un µC. Trebuie sa invatam cum sa configuram intern µC-ul pentru ca sa indeplineasca functiile dorite de noi. In acest laborator vom configura pinii pentru a fi de I/O: unii pini sa citeasca daca se afla tensiune pe ei (input) sau altii sa dea 0 volti sau 5 volti in functie de comenzile noastre din software (output). | Acesta poate fi considerat cel mai important pas atunci cand dorim sa folosim un µC. Trebuie sa invatam cum sa configuram intern µC-ul pentru ca sa indeplineasca functiile dorite de noi. In acest laborator vom configura pinii pentru a fi de I/O: unii pini sa citeasca daca se afla tensiune pe ei (input) sau altii sa dea 0 volti sau 5 volti in functie de comenzile noastre din software (output). | ||
- | Pentru a clarifica niste terminologie: acum **cand spunem ca setam un registru** sau scriem intr-un registru, nu ne referim la registrii de uz general din procesor cu care ati lucrat la IOCLA. **Ne referim la adrese de memorie** rezervate in µC. Vom repeta iarasi impreuna: "Prin registru ne referim la o adresa de memorie". Practic cum merg lucrurile "under the hood", la acesti bytes sunt legaturi fizice si daca scriem un bit de 1 sau de 0 in anumite pozitii, activam sau dezactivam elemente din µC. | + | Pentru a clarifica niste terminologie: acum **cand spunem ca setam un registru** sau scriem intr-un registru, nu ne referim la registri de uz general din procesor cu care ati lucrat la IOCLA. **Ne referim la adrese de memorie** rezervate in µC. Vom repeta iarasi impreuna: "Prin registru ne referim la o adresa de memorie". Practic cum merg lucrurile "under the hood", la acesti bytes sunt legaturi fizice si daca scriem un bit de 1 sau de 0 in anumite pozitii, activam sau dezactivam elemente din µC. |
Mereu pentru a afla cum sa configurati un periferic, [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf | datasheet-ul]] µC-ului este cea mai buna locatie sa aflati exact fiecare configurare unde se afla si ce face. Deoarece nu este deloc placut sa scrii in cod ''*(0x04) = 0b0000 0001'', producatorii de µC ofera biblioteci ([[http://www.nongnu.org/avr-libc/user-manual/modules.html| avr-libc]]) pentru a da nume acestor adrese. Urmatorul cheatsheet va arata cum sa configurati un anumit bit de la o anumita adresa folosind macrouri (care sunt considerate si best practice). | Mereu pentru a afla cum sa configurati un periferic, [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf | datasheet-ul]] µC-ului este cea mai buna locatie sa aflati exact fiecare configurare unde se afla si ce face. Deoarece nu este deloc placut sa scrii in cod ''*(0x04) = 0b0000 0001'', producatorii de µC ofera biblioteci ([[http://www.nongnu.org/avr-libc/user-manual/modules.html| avr-libc]]) pentru a da nume acestor adrese. Urmatorul cheatsheet va arata cum sa configurati un anumit bit de la o anumita adresa folosind macrouri (care sunt considerate si best practice). | ||
Line 212: | Line 218: | ||
==== 3.3. Registrele de I/O ==== | ==== 3.3. Registrele de I/O ==== | ||
- | Pentru acest laborator v-am scutit de cautarea in datasheet, lucru ce poate parea complicat la inceput si am sintetizat pentru voi ce adrese de memorie (registrii) trebuie sa modificati pentru lucrul in acest laborator. | + | Pentru acest laborator v-am scutit de cautarea in datasheet, lucru ce poate parea complicat la inceput si am sintetizat pentru voi ce adrese de memorie (registri) trebuie sa modificati pentru lucrul in acest laborator. |
Microntroller-ul ATmega324 oferă 4 porturi I/O a câte 8 pini, iar intern, fiecare port are asociat trei registre a câte 8 biți prin care utilizatorul poate controla //la nivel de pin// fluxul datelor: poate scrie/citi date în/din portul respectiv. Aceste trei registre sunt: | Microntroller-ul ATmega324 oferă 4 porturi I/O a câte 8 pini, iar intern, fiecare port are asociat trei registre a câte 8 biți prin care utilizatorul poate controla //la nivel de pin// fluxul datelor: poate scrie/citi date în/din portul respectiv. Aceste trei registre sunt: | ||
Line 288: | Line 294: | ||
==== 3.4. Framework-ul Arduino ==== | ==== 3.4. Framework-ul Arduino ==== | ||
- | Cum am spus si mai devreme, acest framework aduce un nivel de abstractizare in plus ce mascheaza lucrul cu registre si operatii pe biti in spatele unor functii mai incede, dar convenabile. | + | Cum am spus si mai devreme, acest framework aduce un nivel de abstractizare in plus ce mascheaza lucrul cu registre si operatii pe biti in spatele unor functii mai incete, dar convenabile. |
=== 3.4.1 Setup-ul IDE-ului === | === 3.4.1 Setup-ul IDE-ului === | ||
Line 294: | Line 300: | ||
* Tool-ul cel mai des intalnit si oferit de fundatia Arduino este [[https://www.arduino.cc/en/software|Arduino IDE]]. Acesta ofera suport pentru mai multe placi si procesoare AVR, cat si posibilitatea de a instala biblioteci 3'rd party, dar pe lnaga niste syntax highlighting se simte ca si cum ati programa in Notepad++. | * Tool-ul cel mai des intalnit si oferit de fundatia Arduino este [[https://www.arduino.cc/en/software|Arduino IDE]]. Acesta ofera suport pentru mai multe placi si procesoare AVR, cat si posibilitatea de a instala biblioteci 3'rd party, dar pe lnaga niste syntax highlighting se simte ca si cum ati programa in Notepad++. | ||
- | * Un alt tool folosit de Microchip este AVR Studio (depracated) si mai nou Atmel Studio. Acesta este un tool profesional si destul de greu de utilizat la capacitati maxime. Daca vreti sa il utilizati, ar fi ca si cum ati folosi un flex sa va taiati friptura. | + | * Un alt tool folosit de Microchip este AVR Studio (deprecated) si mai nou Atmel Studio. Acesta este un tool profesional si destul de greu de utilizat la capacitati maxime. Daca vreti sa il utilizati, ar fi ca si cum ati folosi un flex sa va taiati friptura. |
* Un al treilea IDE posibil ar fi Visual Studio Code cu extensia de la [[https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide|PlatformIO]] pentru a avea acces automat la bibliotecile µC-lor si a incarca codul pe acestea, in acelasi timp avand si intellisense. | * Un al treilea IDE posibil ar fi Visual Studio Code cu extensia de la [[https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide|PlatformIO]] pentru a avea acces automat la bibliotecile µC-lor si a incarca codul pe acestea, in acelasi timp avand si intellisense. | ||
Line 302: | Line 308: | ||
=== 3.4.2. Primul cod === | === 3.4.2. Primul cod === | ||
- | Cel mai simplu cod de arduino ce poate fi compilat este uratorul: | + | Cel mai simplu cod de arduino ce poate fi compilat este urmatorul: |
- | <spoiler Cod> | + | <spoiler Cod > |
<code C> | <code C> | ||
void setup() { // setup facut de user pentru configurarea µC-ului | void setup() { // setup facut de user pentru configurarea µC-ului | ||
Line 316: | Line 322: | ||
Ce poate fi tratat ca urmatorul cod clasic de C in spate: | Ce poate fi tratat ca urmatorul cod clasic de C in spate: | ||
- | <spoiler Cod> | + | <spoiler Cod > |
<code C> | <code C> | ||
#include "µC_header" // importam header-ul µC-ului pentru a avea macrouri conveniente | #include "µC_header" // importam header-ul µC-ului pentru a avea macrouri conveniente | ||
Line 335: | Line 341: | ||
} | } | ||
- | return -1; // nu ar trebuii sa se ajunga aici | + | return -1; // nu ar trebui sa se ajunga aici |
} | } | ||
</code> | </code> | ||
Line 349: | Line 355: | ||
</note> | </note> | ||
- | <spoiler [[https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/|pinMode()]]> | + | <spoiler [[https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/|pinMode()]] > |
Este utilizat pentru a configura pinul daca sa fie de output, input sau input cu pull-up. | Este utilizat pentru a configura pinul daca sa fie de output, input sau input cu pull-up. | ||
Line 359: | Line 365: | ||
</spoiler> | </spoiler> | ||
- | <spoiler [[https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/|digitalWrite()]]> | + | <spoiler [[https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/|digitalWrite()]] > |
Este folosit pentru a seta un pin pe ''HIGH'' sau ''LOW'' (5 respectiv 0 volti in setup-ul nostru). ''HIGH'' si ''LOW'' sunt 2 macrouri din framework si sunt doar niste int-uri in spate. | Este folosit pentru a seta un pin pe ''HIGH'' sau ''LOW'' (5 respectiv 0 volti in setup-ul nostru). ''HIGH'' si ''LOW'' sunt 2 macrouri din framework si sunt doar niste int-uri in spate. | ||
Line 369: | Line 375: | ||
</spoiler> | </spoiler> | ||
- | <spoiler [[https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/|digitalRead()]]> | + | <spoiler [[https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/|digitalRead()]] > |
Returneaza HIGH sau LOW reprezentand starea pinului. ''HIGH'' si ''LOW'' sunt 2 macrouri din framework si sunt doar niste int-uri in spate. | Returneaza HIGH sau LOW reprezentand starea pinului. ''HIGH'' si ''LOW'' sunt 2 macrouri din framework si sunt doar niste int-uri in spate. | ||
Line 396: | Line 402: | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | === 3.4.4. Comparație între funcțiile Arduino și lucrul cu registre === | ||
+ | {{ :pm:lab:untitled.png?direct&600 |}} | ||
+ | |||
===== 4. Simulatorul Tinkercad ===== | ===== 4. Simulatorul Tinkercad ===== | ||
Line 409: | Line 419: | ||
{{ :pm:lab:lab0-2021.png?nolink&500 | Circuit Laborator }} | {{ :pm:lab:lab0-2021.png?nolink&500 | Circuit Laborator }} | ||
- | **Task 0** Incepem prin a verifica set-up-ul. Instalati IDE-ul dorit/folosit si rulați exemplul **Hello Word** cu registrii pe placuta Arduino UNO din laborator. Ulterior testati si varianta in care folositi framework-ul Arduino pentru a vedea ca este oferit acelasi comportament. | + | **Task 0** Incepem prin a verifica set-up-ul. Instalati IDE-ul dorit/folosit si rulați exemplul **Hello Word** cu registri pe placuta Arduino UNO din laborator. Ulterior testati si varianta in care folositi framework-ul Arduino pentru a vedea ca este oferit acelasi comportament. |
**Task 1** Verificati ca circuitul de pe breadboard-urile din laborator indeplineste aceleeasi functie precum circuitul din imaginea de mai sus si ca Arduino-ul este conectat la fel. | **Task 1** Verificati ca circuitul de pe breadboard-urile din laborator indeplineste aceleeasi functie precum circuitul din imaginea de mai sus si ca Arduino-ul este conectat la fel. | ||
- | **Task 2** Folosind butonul conectat la pinul digital 2 (PD2), configurati registrii pentru a face pinul de input si faceti LED-ul sa se aprind cand butonul este apasat. (nu uitati sa activati rezistenta de pull-up interna µC-ului) | + | **Task 2** Folosind butonul conectat la pinul digital 2 (PD2), configurati registri pentru a face pinul de input si faceti LED-ul sa se aprind cand butonul este apasat. (nu uitati sa activati rezistenta de pull-up interna µC-ului) |
- | **Task 3** Acum, folosind butonul conectat la pinul digital 3 (gasiti voi care este macroul pinului), configurati-l si pe acesta ca sa folsoiti butoanele pentru a creste si micsora durata delay-ului folosit la exemplul **Hello Word**. | + | **Task 3** Acum, folosind butonul conectat la pinul digital 3 (gasiti voi care este macroul pinului), configurati-l si pe acesta ca sa folositi butoanele pentru a creste si micsora durata delay-ului folosit la exemplul **Hello Word**. |
- | + | ||
- | <hidden> | + | |
- | + | ||
- | [[https://github.com/cs-pub-ro/laborator-pm/tree/master/laborator/task2 | Solutie task2]] | + | |
- | + | ||
- | [[https://github.com/cs-pub-ro/laborator-pm/tree/master/laborator/task3 | Solutie task3]] | + | |
- | </hidden> | + | |
<note tip> | <note tip> | ||
Dupa ce ati terminat exercitiile si daca mai aveti timp/putere, va recomandam sa rezolvati exercitiile 2 si 3 folosind functiile din framework-ul Arduino. | Dupa ce ati terminat exercitiile si daca mai aveti timp/putere, va recomandam sa rezolvati exercitiile 2 si 3 folosind functiile din framework-ul Arduino. | ||
</note> | </note> | ||
- | |||
===== 6. Link-uri utile ===== | ===== 6. Link-uri utile ===== | ||
Line 436: | Line 438: | ||
* [[http://hackaday.com/2010/10/23/avr-programming-introduction/ | Detalii introductive despre programarea pe AVR (blog)]] | * [[http://hackaday.com/2010/10/23/avr-programming-introduction/ | Detalii introductive despre programarea pe AVR (blog)]] | ||
* [[http://electronics.howstuffworks.com/led.htm | Cum funcționează LED-urile ]] | * [[http://electronics.howstuffworks.com/led.htm | Cum funcționează LED-urile ]] | ||
+ | |||
+ | <solution> | ||
+ | Arhiva cu soluțiile o puteți găsi aici: {{:pm:lab:lab0:lab0-solved.zip}} | ||
+ | </solution> | ||
===== 7. Responsabili laborator ===== | ===== 7. Responsabili laborator ===== | ||
- | * [[robertlica21@gmail.com | Robert Lica]] | + | * [[enedragos99@gmail.com | Dragos Ene]] |
+ | * [[narciscaroi24@gmail.com | Narcis Caroi]] |