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

Post on 05-Feb-2020

30 views 2 download

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

Arduino “avansat”

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

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)

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)

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)

Câteva biblioteci deja incluse:

EEPROM Ethernet Firmata Liquid CrystalMatrix SD Servo

SoftwareSerial SPI Sprite StepperWireGSMWiFi

etc…

CosminVârlan – Facultatea de Informatică (DSFUM)

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)

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)

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)

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)

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)

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)

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)

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 ?

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)

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

Rulaţi sau nu cod de debugging

Comentaţi asta…

Și asta nu se vamai executa

CosminVârlan – Facultatea de Informatică (DSFUM)

În funcţie de hardware…

CosminVârlan – Facultatea de Informatică (DSFUM)

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)

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)

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)

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

CosminVârlan – Facultatea de Informatică (DSFUM)

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)

Cu intreruperi… [needs debouncing?]

Detalii: http://playground.arduino.cc/Code/Interrupts

CHANGELOWHIGH

RISINGFALLING

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)

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)

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)

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)

Ce face urmatorul program ?

CosminVârlan – Facultatea de Informatică (DSFUM)

Ce face următorul program Arduino ?

CosminVârlan – Facultatea de Informatică (DSFUM)

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)

AVR Assembly

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

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

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)

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)

Un prim exemplu….

CosminVârlan – Facultatea de Informatică (DSFUM)

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)

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)

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)

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)

ASM… Endians (Arduino = little-endian)

CosminVârlan – Facultatea de Informatică (DSFUM)

ASM… 32 byte uint

CosminVârlan – Facultatea de Informatică (DSFUM)

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)

ASM… lo8, hi8

CosminVârlan – Facultatea de Informatică (DSFUM)

ASM… swapping

CosminVârlan – Facultatea de Informatică (DSFUM)

lds = incarca direct din spatiul de memorie asociat variabilei (a).

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

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/

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)

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

ASM… Sa-l facem eficient (bytes)

CosminVârlan – Facultatea de Informatică (DSFUM)

Foloseste acelasi registru pe care l-aiasociat lui %0 !

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)

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)

ASM… Shiftarea bitilor

Daca prin shiftare se pierde bitul din stanga:

CosminVârlan – Facultatea de Informatică (DSFUM)

254

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

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

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

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)

ASM… unsigned

CosminVârlan – Facultatea de Informatică (DSFUM)

ASM… signed

CosminVârlan – Facultatea de Informatică (DSFUM)

ASM… e.g.

CosminVârlan – Facultatea de Informatică (DSFUM)

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)

CosminVârlan – Facultatea de Informatică (DSFUM)

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)