Upload
others
View
28
Download
2
Embed Size (px)
Citation preview
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)