Realizat de andrei (Kovari Andrei) Am postat acest tutorial pentru ca începatorilor să le fie mai uşor învăţarea programării plăcuţelor de dezvoltare Arduino în C. Aici gasiţti cele mai uzuale funcţii folosite la programarea arduino in C.
1. Introducere La începutul anilor 70’ a apărut limbajul C în laboratoarele AT&T, creaţia lui Dennis Ritchie şi Brian Kernighan. Tot acolo s-a născut Unix şi C++.
Unele limbaje de programare sunt ‘iertătoare’. În sensul ca erorile sunt evidenţiate în timpul compilării sau în timpul rulări programului, lucru care îi permite programatorului să intervină şi să repare erorile respective iar ulterior programul va funcţiona corect. Limbajul C nu este asa. Modelul de programare pe care se bazează C presupune ca programatorul ştie exact ce vrea sa facă şi ştie sa folosească limbajul C pentru a ob ţine acel lucru. Limbajul C lasă programatorul sa scrie programul într-un timp minim fără sa intervină în calea lui.
C este simplu deoarece numărul de componente al limbajului este relativ mic. Spre exemplu dacă doua funcţii ale limbajului realizează mai mult sau mai puţin acelaşi lucru, C va include doar o funcţie.   C are anumite avantaje şi dezavantaje: • este extrem de flexibil, o secventa putând fi codificata în mai multe moduri; aşadar putem scrie acelaşi program în mai multe feluri, el executând aceiaşi funcţie. • permite o scriere compactă, instrucţiunile putând fi scrise pe acelaşi rând; însa acest lucru nu este recomandat deoarece corectarea programului se face mai greu iar după o perioada nici creatorul nu îşi mai înţelege propriul cod. • programul poate fi scris într-o maniera apropiata de pseudocod (gr.pseudo=fals), conceperea algoritmilor fiind mult mai uşoara şi eficienta. • permite scrierea a aproape orice, greşelile de sintaxa fiind iminente.
C este folosit în general în proiecte de mici dimensiuni unde se pune accent pe performanta codului. Ex. Programarea microcontrolerelor. În orice caz limbajul C este un limbaj de programare foarte influent şi în acela şi timp foarte popular. Pentru a realiza un program în C este nevoie de un program pentru scrierea codului (editor de text) şi de un compilator. Compilatorul este un software care transforma codul scris în C (limbaj înţeles de noi) în cod binar (limbaj înţeles de calculator). Compilarea unui program consta în verificarea codului (greşeli de sintaxă), transformarea lui în cod binar şi creerea unui executabil sau a unui fişier în urma compilării programului.   2. Structura unui program în C Orice program C este alcătuit din una sau mai multe funcţii. Un program C poate fi asemănat cu o clădire de birouri. Avem biroul fiecărui angajat şi avem biroul şefului. Numărul de birouri ale angajaţilor este nelimitat, fiecare reprezentând o anumita funcţie, iar biroul şefului este numai unul singur el coordonând funcţiile subalternilor. Biroul şefului din exemplul anterior este funcţia main, ea fiind nelipsita din orice program C, execuţia programului începând automat cu ea.


Aşadar putem trage anumite concluzii :

– programul este alcătuit doar din funcţia principală main. – funcţia principală este de tipul void – adică programul nu întoarce nici un rezultat. – cele doua paranteze ( ) sunt nelipsite oricărei funcţii; intre ele se pot pune anumiţi parametrii, în acest caz ei lipsesc. – cele doua acolade reprezinta corpul funcţiei (sau noţiunea de bloc) şi intre ele se scriu instrucţiunile programului, în acest caz mulţimea lor fiind vida. Înainte de a trece mai departe trebuie făcute câteva observaţii : – limbajul face distincţie intre literele mari şi cele mici




Asa arata structura de baza a unui program în C :

 

3. Vocabularul limbajului Vocabularul oricărui limbaj este alcătuit din : • setul de caractere; • identificatori; • separatori; • comentarii; Setul de caractere. Reprezinta totalitatea caracterelor cu ajutorul cărora se poate realiza un program. El este alcătuit din : • litere mari şi mici ale alfabetului englez (a-z si A-Z) • cifrele sistemului de numeraţie în baza 10 (0-9) • caractere speciale : +, -, *, /, =, ^, <, >, (, ), [, ], {, }, ., ,, :, ; , #, $, @, _ şi blank (spaţiu) ; O categorie speciala de identificatori este data de cuvintele cheie ale limbajului, care au un înţeles bine definit şi nu pot fi folosite în alt context.

Identificatori. Cu ajutorul identificatorilor se asociază un nume constantelor, variabilelor, procedurilor etc. Prin identificator înţelegem o succesiune de litere, cifre sau caracterul ‘_’, din care prima nu trebuie sa fie o cifra .


Contra exemple : 1def, m&it (primul începe cu o cifra al doilea conţine un caracter special)

Separatori. Aceştia pot fi mai mult blancuri (spatii libere), caracterul CR, sfârşit de linie sau caracterul ‘;’. Orice instrucţiune în C se va termina cu ‘;’ Comentarii. Pentru a înţelege mai uşor un program sau pentru a fi înţeles uşor de mai multi programatori se folosesc comentariile. Acestea pot fi de doua feluri : • pe o singura linie

• pe mai multe linii

4. Header Pentru a utiliza funcţiile din cod, compilatorul are nevoie de anumite informaţii referitoare la ele. Acestea se găsesc într-un fişier header (antet). Prin directiva #include se solicita ca fişierul header sa fie inclus înaintea codului scris de noi. Fişierul obţinut nu va fi vizualizat de programator decât în cazuri speciale. In programarea AVR astfel de headere sunt necesare pentru a micşora volumul codului şi de a permite utilizarea a unor noi funcţii personalizate.

Programul de mai sus citeşte un număr de la tastatura (funcţia cin) şi mai apoi îl afi şează (func ţia cout). S-a inclus headerul iostream.h pentru a putea folosi cele doua funcţii (cin, respectiv cout). Noţiunea de header este sinonima cu cea de librărie sau bibliotecă. Orice mediu de dezvoltare C are incluse anumite headere. Însă acest tip de fişier poate fi creeat şi de programator. În acest caz, programul devine neportabil deoarece headerul creeat este unic, aflându-se numai pe mediul de dezvoltare al creatorului acestuia.   5. Algoritm Noţiunea de algoritm. Un algoritm este o succesiune de etape care se pot aplica mecanic pentru ca, pornind de la datele de intrare sa se obţină datele de ieşire. Dacă nu sunt specificate clar datele de intrare şi datele de ieşire nu se poate vorbi de algoritm. Obiecte cu care lucrează algoritmii. În general algoritmii lucrează cu doua tipuri de obiecte : • date ; • variabile ; Date. Datele pot fi clasificate după tipul lor : Întregi – sunt numere aparţinând mulţimii numerelor întregi. – tipuri întregi – unsigned char – caracter fără semn/8 biţi/0 la 225 – char– caracter/8 biţi/-128 la127 – unsigned int – întreg fără semn/16 biţi/0 la 65535 – short int – întreg scurt/16 biţi/ -32768 la 32767 – int – întreg/16 biţi/ -32768 la 32767 – unsigned long – întreg lung fără semn/32 biţi – 0 la 4.294.967.295 – long – întreg lung cu semn/32 biţi – -2.147.483.648 la 2.147.483.647 Reale – sunt date cu un număr finit de zecimale, virgula fiind înlocuită de punct. -tipuri reale – float – 32 biţi/3.4×10^-38 la 3.4×10^38 – double – 64 biţi/ 1.7×10^-308 la 1.7×10^308 – long double – 80 biţi/3.4×10^-4932 la 3.4×10^4932 Logice – au două valori : adevărat (valoare >=1) şi fals (valoare=0). Sir de caractere – şiruri de caractere cuprinse intre apostrof ‘ ’ ’. – este asimilat tipului int. Tot aici mai putem vorbi şi de constante. Acestea sunt date utilizate în algoritm fără a fi citite sau obţinute prin calcule iar pe parcursul rulării programului acestea nu se modifică Variabile. Variabilele pot fi asemănate cu nişte «cutiuţe » care reţin date, fiecare având cate un nume. O variabilă poate retine date numai de un anume tip.   6. Operatori C În C exista mai multe tipuri de operatori : • operatori aritmetici • operatori relaţionali • operatori de egalitate • operatori incrementare/decrementare • operatori logici/logici pe biţi • operatori de atribuire Operatori aritmetici. Acest tip de operatori este folosit mai mult in calcule matematice. Ei pot fi unari (când acţionează asupra unui singur operand) sau binari. • – minus (unar) ; • + plus (unar) ; • – minus (binar) ; • + plus (binar) ; • * înmulţire (binar) ; • / împărţire (binar) ; • % restul împărţirii întregi (binar) ; Operatori relaţionali. Operanţii pot şi constante, variabile sau funcţii care returnează tipuri numerice. • < (mai mic) ; • <= (mai mic sau egal) ; • > (mai mare) ; • >= (mai mare sau egal) ; În cazul unei operaţii logice, rezultatul este 1 dacă inegalitatea este respectata şi 0 în caz contrar. Operatori de egalitate. Ca şi operatorii relaţionali acest tip returnează 1 sau 0 în funcţie de modul în care este respectata sau nu egalitatea (inegalitatea), iar operatorii pot fi constante , variabile, funcţii. • = = pentru egalitate ; • != pentru inegalitate ; Operatori de incrementare şi decrementare. Aceşti operatori sunt unari şi au rolul de a incrementa/decrementa (de a aduna cu 1/ scădea cu 1) conţinutul unei variabile. • ++ pentru incrementare ; • — pentru decrementare ; Operatorii de incrementare/decrementare pot prefixaţi (++a) sau post fixaţi (a++). Dacă operatorul este prefixat, valoarea variabilei este incrementata înainte ca aceasta sa intre în calcul, iar în cazul în care operatorul este post fixat valoarea variabilei este incrementata după ce a ieşit din calcul. Se aplica şi în cazul incrementării (–a şi a–). Operatori logici. Exista trei tipuri de operatori logici : • ! negare logică ; • && şi logic ; • || sau logic ; Negare logică – dacă operandul este o valoare diferita de 0 atunci rezultatul este 0, în caz contrar este 1 ; SI logic – dacă ambii operanţi sunt diferiţi de 0 atunci rezultatul este 1, în caz contrar este 0. SAU logic – dacă cel puţin unul dintre operanţi este diferit de 0, rezultatul este 1 iar în caz contrar este 0. Operatori logici pe biţi. C are un set de operatori care permit accesul la biţi : • << , >> operatori de deplasare ; • & SI pe biţi ; • | SAU pe biţi ; • ^ SAU exclusiv pe biţi ; • ~ negare pe biţi (unar) Operatorii de deplasare sunt binari şi au rolul de a deplasa conţinutul tuturor biţilor cu un număr de pozi ţii egal cu valoarea reţinuta de al doilea operand. (1<<3) – reprezentarea lui 1 în baza doi (0b00000001) o deplasez în stânga cu 3 poziţii (0b00001000) ~(1<<2) – reprezentarea lui 1 în baza doi o deplasez în stânga cu doua poziţii şi to ţi bi ţii 1 vor fi seta ţi ca 0 şi viceversa. (0b11111011). În cazul operatorilor & , | şi ^ se aplica regulile din următorul tabel:

OP1 OP2 OP1&OP2 OP1^OP2 OP1|OP2
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 0 1

Operatorul ~ are rolul de a inversa conţinutul unui bit. Dacă un bit are valoarea 1 după aceasta operaţie va avea valoarea 0. Operatori de atribuire. In limbajul C exista mai multi operatori de atribuire: • a=a+b sau a+=b • a=a-b sau a-=b • a=a*b sau a*=b • a=a/b sau a/=b • a=a=b • a=a^b sau a^=b • a=a|b sau a|=b A=A operator(expresie) sau A operator (expresie)   7. Vectori În C un vector reprezinta o colecţie de elemente de acelaşi tip, sub denumirea aceleiaşi variabile, unde adresarea se face cu ajutorul unui index. Vectorii sunt utilizaţi pe scara larga în programare în special pentru funcţii de sortare, căutare etc. Spre exemplu mai puteţi folosii vectorii pentru a stoca coordonatele unei hărţi bidimensionale, sau puteţi stoca coordonatele unei matrice multidimensionale pentru calcule de algebra liniara. Vectorii sunt de doua tipuri: • unidimensionali • multidimensionali (matrice) Oricare din aceste tipuri enumerate mai sus pot fi cu dimensiune alocata dinamic(dimensiunea vectorului este variabila), sau cu număr de elemente fix(dimensiunea lor este declarata la începutul programului iar aceasta nu poate fi modificată pe parcurs).


Modul de adresare a vectorilor:

Vectorul ‘note’

index 0 1 2 3 4 5
continut 10 5 7 8 9 10

După cum se vede în tabelul de mai sus numerotarea elementelor vectorului începe tot timpul de la 0. Astfel dacă definim un vector cu dimensiunea de 6 elemente pentru adresarea primului element vom folosi valoarea 0 iar pentru adresarea ultimului element vom folosi valoarea 5.


8. Instrucţiunile limbajului C

Limbajul C este foarte flexibil, de aceea permite anumite instrucţiuni precum : •instrucţiunea expresie •instrucţiunea if •instrucţiunea whileexpresiile condiţionate •instrucţiunea do while •instrucţiunea for •instrucţiunea switch   Instrucţiunea expresie. Deşi pare inutila ea are o importanta foarte mare. Ea ilustrează flexibilitatea limbajului C.

Instrucţiunea IF. Exista doua forme alea acestei instrucţiuni : • if (expresie) {instructiune1} else {instructiune2} • if (expresie) {instrucţiune} În cazul primei forme se evaluează expresia, iar dacă rezultatul este diferit de 0 se executa instruc ţiune 1, în caz contrar, se trece la instrucţiune 2. În cazul celei de-a doua forme se evaluează expresia, iar dacă rezultatul este diferit de 0 se executa instrucţiune, altfel se trece la instrucţiunea următoare.


Expresiile condiţionate. Aceste expresii pot fi folosite pentru a elimina anumite structuri if else. Forma

acestora este : • expresie1 ? expresie2 : expressie3


Instrucţiunea WHILE. Aceasta executa o instrucţiune cat timp este îndeplinită expresia (cat timp valoarea ei este diferita de 0). Forma generala :


Instrucţiunea DO WHILE. Este asemănătoare cu cea prezentata mai sus însă singura diferenţa este ca instrucţiunea se executa înainte de a fi verificata condiţia. Instrucţiunea se executa cel puţin o data, fata de cazul while in care se poate sari peste instrucţiune. Forma generala :

 


Instrucţiunea FOR. Are forma generala :

 


Se evaluează expresia de iniţializare, se verifica testul, iar în cazul în care rezultatul este diferit de 0 se executa instrucţiunea subordonata funcţiei for. Apoi se evaluează expresia de incrementare/decrementare si se revine la test. Aşadar acest for se va executa atât timp cât se verifică testul.


Instrucţiunea SWITCH. Are forma generala :

 


Se evaluează expresia iar în cazul în care coincide cu exp i se va executa instrucţiunea corespunzătoare ( i ). Funcţia break are rolul de a a ieşi din programul antecedent (switch). Func ţia default este facultativa. Ea se foloseşte în cazul în care valoarea expresiei nu corespunde cu nici o exp i.

Programarea Arduino in C
Etichetat pe:        

3 gânduri despre „Programarea Arduino in C

  • 19/12/2014 la 11:08
    Legătură permanentă

    Foarte interesant mi-a placut de mic nu am avut posibilitatea astazi am 53 de ani si citesc foarte mult , incerc si eu sa fac un proiect sa vadf daca cand-va voi reusi . sa pun doua motoare sa se miste stanga dreapta. folosind Arduino.

    Răspunde
  • 07/06/2016 la 05:45
    Legătură permanentă

    buna ziua
    ma bucur tare mult ca ai deschis acest tutorial !
    eu sunt electronist ,am evitat pina acum programarea pentru ca mi s-a parut mai simplu sa folosesc electronica clasica (integrate si restul ) acum citind despre arduino am tras concluzia ca trebuie sa invat neaparat programare ,asa ca am sa te rog sa continui sa scrii si daca se poate sa dai si exemple practice

    Răspunde
  • 22/06/2018 la 18:51
    Legătură permanentă

    Am probleme cu o matrice led max7219 8×8 ,afiseaza cifre si litere invers folosesc o placa arduino uno. Un sfat ar fi util pentru rezolvare.

    Multumesc

    Răspunde

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.