![Page 1: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/1.jpg)
Arduino “avansat”
Facultatea de Informatică – Univ. “Al. I. Cuza” Iaşi
![Page 2: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/2.jpg)
Arduino “avansat”
Am vrut să vă povestesc și câteva chestiuni cu care s-arputea să nu vă intâlniţi chiar des atunci când programaţiun Arduino…
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 3: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/3.jpg)
Crearea de biblioteci
Probabil știţi ce sunt bibliotecile...Bibliotecile sunt de obicei scrise pentru a ușura
interacţiunea cu o anumită componentă hardware (ca șiun driver).
Bibliotecile pot fi utilizate și pentru a "ascunde" un cod mai complex ce este utilizat de un progrămel simplificat.
Bibliotecile disponibile la un moment dat pot fi văzute înmeniul Sketch -> Include Libraries.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 4: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/4.jpg)
Selectarea unei bibliotecidin meniu o va include automat în proiect.
Dacă introduceţi o nouăbibliotecă în mediul de programare Arduino, aceasta va fi recunos-cută numai după restrat.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 5: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/5.jpg)
Câteva biblioteci deja incluse:
EEPROM Ethernet Firmata Liquid CrystalMatrix SD Servo
SoftwareSerial SPI Sprite StepperWireGSMWiFi
etc…
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 6: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/6.jpg)
Adăugarea unei biblioteci
Includerea unei biblioteci face ca tot codul scris în aceabibliotecă să fie adăugat proiectului vostru.
Dimensiunea sktechului va crește. Totuși, la construcţiaaplicaţiei finale (ce va fi trimisă către Arduino), doar codulrelevant va fi inclus – doar ce folosiţi efectiv.
Pentru a adăuga o bibliotecă, puteţi fie să o dezarhivaţidirect în directorul libraries fie să o includeţi ca și ZIP din Sketch -> Include Library -> Add .ZIP Library (contine .h). [ În examples for fi adăugate (eventual) și exemple de utilizare. ]
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 7: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/7.jpg)
Custom made (or modified)
Atenţie: pot exista biblioteci care să folosească prea multămemorie și să nu mai rămână nimic pentru restulprogramului vostru. Aţi putea modifica bibliotecile dupăcum vă convine mai mult (sursele le găsiţi în directorulbibliotecii) – și știu că a trebuit să faceţi așa ceva la unuldin proiecte.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 8: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/8.jpg)
Exemplu de bibliotecă (basic)blink.cpp:
#include "blink.h"
void blink(int pin,int duration)
{
digitalWrite(pin, HIGH);
delay (duration);
digitalWrite(pin, LOW);
delay (duration);
}
blink.h:#include <Arduino.h>
void blink(int pin,int duration);
Ambele fișiere se salveazăîn directorul libraries/blink.
In .ino:
#include <blink.h>…blink(13,1000);
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 9: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/9.jpg)
Memoria Flash
Memoria programabilă (flash) este locul în care estestocată aplicaţia făcută de voi.
Conţinutul memoriei flash pote fi modificat numai de bootloader atunci când Arduino IDE îi cere acest lucru.
După upload, conţinutul flash-ului rămâne neschimbatpână la următorul upload.
Dacă aplicaţia nu încape în memoria flash, bootloaderul arputea fi eliminat și încărcarea programului trebuie atuncifăcută printr-un dispozitiv extern (vezi un curs anterior)
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 10: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/10.jpg)
Memoria RAM
Utilizată de aplicaţie pentru a rula corect [2k].
Memoria EEPROM• EEPROM = Electrically Erasable Programmable Read-Only Memory = memorie ce poate fi scrisă de aplicaţie dar care nu se șterge nici după ce Arduino a fost închis.
• Mult mai înceată ca RAMul, utlizată pentruconfigurări sau informaţii ce ar permite Arduino-uluisă reia aplicaţia de unde a rămas.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 11: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/11.jpg)
Cat RAM liber mai am ?
Pentru a găsi cât RAM aveţi la dispoziţie, utilizaţibiblioteca MemoryFree(https://github.com/maniacbug/MemoryFree)
La instalare veţi găsi și un exemplu de utilizare (îndirectorul de exemple).
Un exemplu de utilizare, într-o funcţie recursivă ce are nevoie să salveze în stivă datele înainte de a se reapelaeste următorul:
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 12: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/12.jpg)
![Page 13: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/13.jpg)
Daca freeMemory<0 =>
Consumatori de RAM:
Iniţializarea de constante: #define msg “…”Variabile globale: char msg[] = “…”Când se apelează o funcţie (ce utilizează variabile
declarate local).Când se alocă memorie în mod dinamic:
String msg = “…”
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 14: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/14.jpg)
Memorarea unor constante în memoria flash (cea asignată programelor)
CosminVârlan – Facultatea de Informatică (DSFUM)
Necesara pentruPROGMEM si
pgm_read_byte.
Aici aș putea scrie și “msg+i”. De ce ?
![Page 15: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/15.jpg)
Dacă folosiţi aceleași valori de maimulte ori, pre-calculaţi-le și
declaraţi-le constante.Mă scutește de o grămadă de calculemai mult sau mai puţin utile [+ saves
RAM if PROGMEM is used].
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 16: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/16.jpg)
Variabile VS Constante
Declaraţi-le constante atunci când oricum nu le veţimai modifica: nu vor mai ocupa RAM.[ # define valoare 5 ]
preprocesor
![Page 17: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/17.jpg)
Rulaţi sau nu cod de debugging
Comentaţi asta…
Și asta nu se vamai executa
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 18: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/18.jpg)
În funcţie de hardware…
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 19: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/19.jpg)
Hardware functions not fully exposed
Pentru că vrem să avem acces la funcţii hardware low-level;
Pentru că avem nevoie de performanţă și nu vrem sătrecem prin driverele lor.
De utilizat cu mare grijă
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 20: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/20.jpg)
EEPROM
Memoria EEPROM poate fi utilizată pentru stocarea de informaţii între "sesiuni" (va memora datele chiar și cândArduino nu este alimentat).
Biblioteca EEPROM.h permite citirea, scrierea sauștergerea informaţiilor stocate într-o rulare anterioară(read, write, clear).
Adrese EEPROM: 0-511 [512 bytes]Un exemplu…
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 21: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/21.jpg)
Utilizarea EEPROM
EEPROM.clear() șterge toatedatele din EEPROM
Atenţie la ce locaţiidin memorie văsalvaţi datele !
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 22: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/22.jpg)
Întreruperi
Sunt semnale ce opresc execuţia unui program pentru a executa un cod de tratare a întreruperii.
Spre exemplu, atunci când sunt recepţionate date de peportul serial, pentru menţinerea timpului și pentru a sincroniza instrucţiunile de tip delay și pentru a executafuncţiile de tip attachInterrupt.
Codul de tratare a întreruperii trebuie să se execute rapid. Altfel, o întrerupere ce apare în timpul execuţiei coduluipoate fi ratată sau întârziată execesiv [avoid serial printing, led blink].
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 23: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/23.jpg)
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 24: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/24.jpg)
Asocierea nr.Intrerupere – pin
Vom apela funcţia la apariţia întreruperii 0 care se produce în funcţiede valoarea citită pe pinul 2 (unde se află butonul) – folosim UNO.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 25: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/25.jpg)
Cu intreruperi… [needs debouncing?]
Detalii: http://playground.arduino.cc/Code/Interrupts
CHANGELOWHIGH
RISINGFALLING
![Page 26: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/26.jpg)
Regiştri, ASM programming
Un program poate citi/scrie un registru.Regiștri pot conţine o valoare numerică.Regiștrii pot controla sau raporta starea unui echipament
hardware.Regiștrii pot fi utilizaţi în cod în baza numelor lor (data
sheet for microcontrollers)
Detalii despre ASM programming: http://www.avr-asm-tutorial.net/avr_en/
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 27: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/27.jpg)
Registri asociati porturilor
https://www.arduino.cc/en/Reference/PortManipulation Permite manipularea mai rapida a pinilor Arduino. Există 3
porturi:- B pentru pinii digitali 8-13- C pentru pinii analogici- D pentru pinii digitali 0-7
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 28: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/28.jpg)
Regiştri asociaţi porturilor
Registrul DDR determină dacă portul este de tip INPUT sau OUTPUT. [Read/Write]
Registrul PORT controlează dacă pinul este pe HIGH saupe LOW. [Read/Write]
Registrul PIN citește starea pinilor INPUT (care au fostsetaţi pe INPUT prin comanda pinMode()). [Read only]
Fiecare bit corespunde unui singur port.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 29: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/29.jpg)
Regiştri asociaţi porturilor
De exemplu, pentru a seta toţi pinii digitali de la 1 la 7 ca pini de tip output și pe pinul 0 ca pin de tip input, estesuficient să facem atribuirea:DDRD = B11111110;
Pentru a seta biţii 7,6,4 pe High:PORTD = B11010000;
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 30: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/30.jpg)
Ce face urmatorul program ?
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 31: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/31.jpg)
Ce face următorul program Arduino ?
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 32: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/32.jpg)
https://code.google.com/p/narcoleptic/
O biblioteca foarte interesanta: pune Arduino in Sleep mode atâta timp cât nu primește HIGH de la un pin. Când a primitHIGH (de exemplu din cauză că un senzor a “prins” infractorul, activează Arduino care poate face o anumita acţiune.
Ar trebui ca acest sistem anti-efracţie să fie pe baterie (ca altfelinfractoru scoate siguranţa și moare Arduino). Și aceastăbibliotecă face ca bateria să nu moară repede (e testată: scadela 0.01A consumul Arduino)
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 33: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/33.jpg)
AVR Assembly
Facultatea de Informatică – Univ. “Al. I. Cuza” Iaşi
![Page 34: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/34.jpg)
ASM…
Primul exemplu de asm:asm("nop \n");
Pentru a scrie cod asm in interiorul unui program Arduino, se va utiliza comanda “asm”. Vom discutadespre ea imediat.
CosminVârlan – Facultatea de Informatică (DSFUM)
“nop” nu face nimic. Instructiunile asmsunt scrise cate una pe linie si din acest
motiv trebuie sa se termine cu “\n”.
![Page 35: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/35.jpg)
ASM… - comezi fara operanzi
Exista in 24 de instructiuni care nu folosesc operanzidintre care 16 sunt utilizate pentru a sterge sau seta registrul de stare (Status Register – SREG).
Celelalte 8 instructiuni sunt:• NOP - sta degeaba :d• BREAK, SLEEP, • WDR – Watch Dog Reset (rar folosit)• ICALL / IJMP, RET / RETI – pentru a sari la alte
instructiuni.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 36: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/36.jpg)
Comanda asm
Comanda asm are urmatorul format:asm(“code” : output list : input list : clobber list);
Unde:• code = instructiunea asm data ca un sir de caractere• output list = lista operatorilor de iesire separati cu virgula• input list = lista opertori de intrare, separati cu virgula• clobber list = lista de registri accesati.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 37: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/37.jpg)
Un prim exemplu….
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 38: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/38.jpg)
ASM…
Arduino nu poate face operatii intre valorile aflate in memorie. Acestea trebuie sa fie incarcate in registripentru a putea fi manipulate (adunate, schimbate saucomparate).
Registri sunt o zona speciala din SRAM (Static Random Access Memory). Arduino are 32 de registri: [r0..r31] care sunt utilizati pentru manipularea valorilor stocate in variabile.
Fiecare registru este pe 8 biti (1 byte).
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 39: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/39.jpg)
ASM…
ldi = LoaD Immediate: are rolul de a incarca valoarea 42 in registrui 26. Nu putem folosi registri mai mici de 16. Deci puteam incarca in orice registru din intervalul 16-31.
sts = Store direct to data Space: va stoca valoarea aflatain registrui r26 in zona de memorie asociata variabilei a. In spate, asamblorul inlocuieste “a”-ul cu adresa lui a.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 40: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/40.jpg)
ASM…
Variabila “a” trebuie sa fie declarata global. Altfel, asamblorul ar putea sa o stocheze fie intr-un registru –pentru ca este temporara functiei setup sau in stiva.
Uneori compilatorul (care si optimizeaza) mai punevariabilele globale (cum e “a”) si in registri – de exemplu, in programul nostru, din cauza ca nu avem decat o singuravariabila, aceasta ar putea foarte bine sa fie stocata intr-un registru chiar de la inceput. Pentru a ne asigura ca nu se intampla acest lucru, s-a adaugat cuvantul “volatile” pentrua ne asigura ca stocarea se face in SRAM.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 41: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/41.jpg)
ASM… registri utilizati
Programul nostru a bagat fortat in r26 valoarea 42, farasa il intereseze ce se afla acolo.
Daca acolo se afla o alta valoare (de exemplu pentru ca in acel registru s-a gandit procesorul sa puna o valoare), acea valoare este pierduta.
Din acest motiv instructiunea trebuie sa declare si registripe care ii va utiliza pentru a forta procesorul sa isimemoreze in alta parte valorile:
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 42: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/42.jpg)
ASM… Endians (Arduino = little-endian)
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 43: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/43.jpg)
ASM… 32 byte uint
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 44: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/44.jpg)
ASM… lo8, hi8
Prin intermediul lo8 si hi8 putem sa identificam LSB siMSB dintr-un intreg pe 16 biti:
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 45: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/45.jpg)
ASM… lo8, hi8
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 46: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/46.jpg)
ASM… swapping
CosminVârlan – Facultatea de Informatică (DSFUM)
lds = incarca direct din spatiul de memorie asociat variabilei (a).
![Page 47: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/47.jpg)
ASM… lista parametrilor (iesire / intrare)
Fiecare parametru de iesire / intrare se supune uneiconstrangeri. Constrangerile pot fi litere sau numere sipot avea o serie de modificatori.
Modificatorii sunt:• = - acest operand va fi scris• + - acest operand poate fi citit sau scris. Daca nu e cu egal
sau cu plus, operandul poate fi doar citit.• & - earlyclobber• % - operatorul este comutativ
CosminVârlan – Facultatea de Informatică (DSFUM)
Detalii la: https://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers
![Page 48: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/48.jpg)
ASM… lista parametrilor (iesire / intrare)
CosminVârlan – Facultatea de Informatică (DSFUM)
Detalii la: https://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers
Lista modificatoriloreste data in tabelulalaturat. Stiu ca nu se vede, dar gasiti cursulpe site si puteti sadati “zoom in”.
Disponibil si la : https://ucexperiment.wordpress.com/2016/03/10/arduino-inline-assembly-tutorial-4/
![Page 49: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/49.jpg)
ASM…
CosminVârlan – Facultatea de Informatică (DSFUM)
= – ca sa putem scrier – ca sa asocieze automat reg.(a) – adresa variabilei a
M – indica o constanta(B) – se va inlocui cu (123)
ldi - copie imediat ce se afla in registrul %1 (asociat lui B) in registrul %0 (cel asociat lui a)
![Page 50: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/50.jpg)
ASM… Swapping 2 x int
CosminVârlan – Facultatea de Informatică (DSFUM)
A0 = MSB din %0B0 = LSB din %0
mov %B0, %B3
copie din B3 in B0
![Page 51: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/51.jpg)
ASM… Sa-l facem eficient (bytes)
CosminVârlan – Facultatea de Informatică (DSFUM)
Foloseste acelasi registru pe care l-aiasociat lui %0 !
![Page 52: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/52.jpg)
ASM…
Exista o serie de registri standard in Arduino. (cum suntcei pentru manipularea I/O despre care am discutat maiinainte). Lista completa a acestora se gaseste la adresa:
https://ucexperiment.wordpress.com/2016/03/11/arduino-inline-assembly-tutorial-5-2/
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 53: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/53.jpg)
ASM… Shiftarea bitilor
Pentru shiftarea bitilor se utilizeaza:lsl = Logical Shift Left. Parametrul este un registru si
valoarea din acesta este shiftata la stanga cu 1 bitlsr = Logical Shift Right. Parametrul este un registru…
CosminVârlan – Facultatea de Informatică (DSFUM)
Sa aveti o variabila v declarataglobal volatile (byte)
![Page 54: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/54.jpg)
ASM… Shiftarea bitilor
Daca prin shiftare se pierde bitul din stanga:
CosminVârlan – Facultatea de Informatică (DSFUM)
254
![Page 55: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/55.jpg)
ASM… Shiftarea bitilor
Daca vrem sa nu pierdem bitul ce iese in partea stanga, ilpastram cu carry prin intermediul comenzii rol (Rotate Left throgh carry):
CosminVârlan – Facultatea de Informatică (DSFUM)
510
ror = Rotate Right through carry
![Page 56: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/56.jpg)
ASM… rjump
rjmp = Relative JuMP: sare la o eticheta. Se face un salt ;a o anumita eticheta.
CosminVârlan – Facultatea de Informatică (DSFUM)
Peste aceastaportiune de cod se
va sari…
20
1f = 1 forward1b = 1 backward
![Page 57: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/57.jpg)
ASM… brne = BRanch if Not Equal (<>0)
CosminVârlan – Facultatea de Informatică (DSFUM)
Sare doar daca operatia anterioaranu a pus flag-ul Z pe zero (se pune
automat cand rezultatul este 0)
64
![Page 58: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/58.jpg)
ASM… alte tipuri de jumps:
breq = branch if equal (sare cand este egal cu zero)brsh = branch if same of higherbrlo = branch if same of lowerbrcc = branch if carry bit is clearbrcs = branch if carry is setAcestea se utilizeaza dupa ce in prealabil s-a realizat o
comparare (cu: cp, cpi, cpc, cpse, tst).
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 59: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/59.jpg)
ASM… unsigned
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 60: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/60.jpg)
ASM… signed
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 61: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/61.jpg)
ASM… e.g.
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 62: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/62.jpg)
ASM… operatii matematice
inc = incrementeaza valoarea din registru dec = … subi = SUBtract Immediate add = add with carry
More on those: https://ucexperiment.wordpress.com/2016/03/19/arduino-inline-assembly-tutorial-8-math/
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 63: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/63.jpg)
CosminVârlan – Facultatea de Informatică (DSFUM)
![Page 64: Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și câteva chestiuni cu care s-ar putea să nu vă intâlniţi chiar des atunci când](https://reader030.vdocuments.mx/reader030/viewer/2022040107/5e4af89d1e46e83a3a246bc9/html5/thumbnails/64.jpg)
Bibliografie
James M. Eli: Arduino Inline Assembly – Learn 8-bit AVR GCC Inline Assembly Programming (2016), Disponibila la: https://leanpub.com/arduinoinlineassembly
https://ucexperiment.wordpress.com/2016/03/04/arduino-inline-assembly-tutorial-1/ (varianta online a cartii de maisus)
CosminVârlan – Facultatea de Informatică (DSFUM)