Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și...

64
Arduino “avansat” Facultatea de Informatică – Univ. “Al. I. Cuza” Iaşi

Transcript of Arduino “avansat”vcosmin/pagini/resurse...Arduino “avansat” Am vrut să vă povestesc și...

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

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

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

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

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

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

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

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

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

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

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

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
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

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

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

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

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

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

Î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

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

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

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

Î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

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

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

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

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

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

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

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

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

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://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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)