Skip to content

Programarea placii cu AVR in C, cu Eclipse IDE si Atmel toolkit

Pagina in lucru! Cand acest titlu dispare, pagina este complet actualizata. Nu o folositi pana atunci.

Nota 1: Urmatorul tutorial se adreseaza doar persoanelor avansate, care programeaza microcontrolere AVR in sistemul de operare Linux pe 64 biti (la momentul reeditarii tutorialului, folosesc Linux Fedora 26 cu managerul de ferestre KDE). Nu mai sunt de foarte multi ani un utilizator Windows (nu imi face trebuinta), asa ca nu voi oferi sfaturi cu privire la instalarea in acest sistem – daca puteti folosi tutorialul ca sablon, foarte bine.  Referitor la link-urile vechi (care nu mai erau valabile), am decis sa-mi gazduiesc software-ul necesar pe contul personal de pe Google Drive. Daca aveti vreo problema cu asta, incercati sa gasiti echivalentele de pe siturile de origine sau evitati acest tutorial.

Nota 2: Tot acest proiect, de programare a placilor compatibile Arduino folosind limbajul C, se bazeaza pe o biblioteca de functii mai veche, foarte simpla si care oferea putine facilitati. Sistemul de configurare specific fiecarui proiect in parte, oferit de autorul original, nu se mai preteaza la proiecte mari, cu functii din ce in ce mai complexe. Este necesara o rescriere majora, insa nu am timp de ea, poate o voi face candva si atunci, intregul tutorial va fi rescris inca o data. Sau poate o faceti voi, pornind de la proiectul original si inspirandu-va atat din lucrarea mea, cat si din bibliotecile scrise in C++ pentru Arduino, pe care le veti porta in C.

0. Instalare compilator gcc pentru AVR

Personal, prefer sa am distributia oficiala (una din ele, de la Microchip) instalata in folderul „acasa” – $HOME, pentru un mai bun control. Desigur, s-ar putea ca la data la care cititi acest articol, sa fie deja disponibila o versiune noua, insa asta nu inseamna ca cea veche nu este functionala. Versiunea pe care o ofer, este gcc 4.9.2 pentru Linux 64bit si o descarcati de aici.

Odata ce ati descarcat fisierul, dezarhivati-l in folderul $HOME si redenumiti subfolderul compilatorului in avr8. Este mai usor de lucrat cu nume scurte.

IMPORTANT! Utilitarul avrdude il instalati din repozitoriul distributiei voastre de Linux, versiunea trebuie sa fie mai mare sau egala cu 6.1 (in distributia mea de Linux, este disponibila versiunea 6.3). Apelati la managerul de pachete cu interfata GUI, este mai comod.

1. Instalare Eclipse IDE in Linux

Vom folosi Eclipse IDE versiunea Luna pentru ca lucreaza cel mai bine cu plug-in-ul pentru AVR si este si mai usor in utilizare (pentru ce avem nevoie, este arhisuficient). Il descarcati de aici si il dezarhivati in folderul $HOME. Folderul rezultat il veti redenumi din eclipse, in eclipse_avr. Daca se intampla sa aveti deja un eclipse instalat local (de exemplu, o versiune si mai veche, pe care o folositi cu SDCC pentru programare PIC, sau una mai noua, cu care programati ARM-uri ca STM32) in folderul $HOME, redenumiti-l temporar in altceva. De asemenea, la lansarea in executie a Eclipse IDE, redenumiti folderul de lucru in workspace_avr.

2. Instalare plugin avr-eclipse 2.4.1-beta

Exact versiunea asta si descarcati fisierul de aici.

Si cu aceasta gata, plugin-ul este instalat. Vom trece la configurarea lui.

3. Configurare plugin avr-eclipse

 

….

Apasati butonul [OK] si in momentul acesta avem configurat avr-eclipse si un toolchain functional.

4. Instalare Subclipse

… decideti singuri daca va setati un manager de versiune pentru proiectele voastre. Vom importa biblioteca de functii si toate proiectele disponibile folosind o procedura mai simpla.

5. Importare biblioteca ATmega-CLib si proiectele aferente

a. Compilare proiect

Asigurati-va ca proiectul are setat acelasi tip de microcontroller ca si biblioteca ATmegaCLib – sau invers. Din nou, ca in cazul bibliotecii, nu mai este necesar sa facem nici o setare in Eclipse, pentru ca au fost facute deja la crearea proiectului (intr-un tutorial viitor, vom vedea cum se creaza un proiect de la zero, proiect care foloseste biblioteca ATmegaCLib).

Este foarte posibil ca setarile din header-ul bibliotecii sa nu mai corespunda cu cerintele programului pentru ca le schimb de fiecare data cand lucrez cu alt program, si poate diferi de la un update de SVN, la altul. Deci, facem clic pe proiectul ATmegaCLib din stanga, il expadam, si deschidem header-ul atmegaclib.h pentru editare. In prealabil, am studiat cerintele programului care sunt specificate sub forma de comentariu in fisierul pwmofledexample.c – dar le specific si mai jos:

//Activate the following definitions on "atmegaclib.h" header:

//#define UART_BAUD_RATE      57600 // default is 57600
//#define UART_BAUD_SELECT    (F_CPU / (UART_BAUD_RATE * 16L) - 1)
//#define ENABLE_SERIAL_POLL  // require CONVERSION, conflicts with SERIAL
//#define ENABLE_PWM          // motor or led control (conflicts with pwmservo)
//#define ENABLE_CONVERSION   // useful for Serial, LCD and 7SEG Display
//#define ENABLE_MILLIS       // enable millis()

Cu alte cuvinte trebuie sa ne asiguram ca in headerul atmegaclib.h, definitiile de mai sus sunt activate, iar toate celelalte sunt dezactivate (nu stergeti absolut nimic, si atentie la baud rate ca si aia o schimb din cand in cand). Deci headerul editat, ar arata cam asa

// *****************************************************************************
// Enabling/disabling additional functionality
// *****************************************************************************
#define UART_BAUD_RATE            57600 // default is 57600
#define UART_BAUD_SELECT        (F_CPU / (UART_BAUD_RATE * 16L) - 1)
//#define ENABLE_SERIAL // Interrupt based, require CONVERSION, conflicts with SERIAL_POLL
#define ENABLE_SERIAL_POLL // require CONVERSION, conflicts with SERIAL
//#define ENABLE_PWMSERVO // servo control (conflicts with regular pwm)
#define ENABLE_PWM      // motor or led control (conflicts with pwmservo)
//#define ENABLE_IR       // infrared receiver, SONY protocol- it use TIMER0
//#define IR_DEBOUNCE     // uncomment to debounce IR with a delay
//#define ENABLE_ADC      // analog to digital converter
//#define ENABLE_TWI        // hardware I2C
//#define ENABLE_I2C_SOFTWARE // software I2C
#define ENABLE_CONVERSION // useful for Serial, LCD and 7SEG Display
//#define ENABLE_PCF8583    // require CONVERSION and I2C
//#define ENABLE_ONE_WIRE // one wire protocol
//#define ENABLE_DALLAS_TEMP // Dallas temperature sensors, require ONE_WIRE
#define ENABLE_MILLIS     // enable Arduino millis() - it use TIMER0
//#define ENABLE_LCD      // require CONVERSION
//#define ENABLE_7SEG     // starting from one digit, up to eight digits.
//#define ENABLE_SPI      // hardware SPI (master)
//#define ENABLE_SD_CARD  // raw SD Card operations; require SPI
//#define ENABLE_FAT32    // require SPI and SD_CARD
//#define OPTIMIZE_SPEED
// *****************************************************************************
// End block of "enable/disable" features
// *****************************************************************************

Deci, cele sase definitii ale noastre sunt active, iar celelalte sunt dezactivate.

Salvati fisierul (plugin-ul avr-eclipse nu va salva automat un fisier nesalvat in timpul compilarii). Selectati in Project Explorer proiectul ATmega_PWM_LED si selectati „Build Project„. Daca totul este ok, ar trebui sa se compileze fara probleme.

example-in-action

b. Configurare hardware

Initial, programul a fost scris de autorul bibliotecii libarduino (atmega-clib este un fork al acelui proiect) si demonstra doar PWM-ul; eu l-am modificat sa mai execute in paralel si clipirea unui al doilea LED (folosind functia millis), si transmitere pe serial a valorilor PWM-ului. Este prezentata functionarea in filmuletul de mai jos

Deci, LED-ul PWM este conectat la canalul 1 (trebuie sa vedeti pe care pin este PWM1 la placa Arduino – armega328p, si pe care pin este PWM1 la placa Sanguino – atmega644p). LED-ul al doilea este conectat la PC6 in cazul Sanguino, si la PB1 in cazul Arduino UNO. Serialul este virtual, pe USB…

c. Upload-are program in microcontroller – configurare avrdude

Selectam proiectul ATmega_PWM_LED cu click-dreapta in panoul Project Explorer si alegem „Properties” de la sfarsitul proiectului. In fereastra in care apare, expandam „AVR” si selectam elementul „AVRDude„. In dreapta apasam pe butonul [New..] pentru a defini un nou tip de programator (fie el si doar un bootloader):

avrdude-prog-config

Introduceti datele ca in imaginea de mai jos: (stabiliti o denumire a programatorului, denumire ce va aparea in combobox, alegeti tipul de protocol din lista – in cazul nostru, Arduino, stabiliti portul ca fiind /dev/ttyACM0 sau /dev/ttyUSB0 si bauds de 115200, dar ultimii doi parametrii ii alegeti in functie de tipul de Arduino pe care-l aveti):

avrdude-valori-conf

In final, noul programator definit va aparea in combobox. Data viitoare, cand creati/editati un alt proiect, nu faceti decat sa selectati programatorul definit:

avrdude-final-conf

Apasati [OK], compilati proiectul, selectati-l in „Project Explorer” si apasati butonul [AVR] din Toolbar pentru a uploada programul in microcontroller.

NOTA: Este posibil ca sa nu mearga totul brici. Mai ales daca nu ati mai instalat pana acum o placa Arduino in linux. Pot fi doua motive principale:

a. Cerintele de sistem: este nevoie sa instalati libusb pentru comunicatia seriala pe USB, sa instalati doua fisiere pentru permisiuni si sa va asigurati ca user-ul pe care-l folositi in Linux apartine grupurilor plugdev, users, dial-up, uucp, lock – care grup plugdev trebuie sa aiba deasemenea ca membri uucp si pe care trebuie sa-l creati daca nu exista, asa cum este cazul in openSUSE linux. Cele doua fisiere necesare pentru permisiuni, se instaleaza in folderul /etc/udev/rules.d si se iau de aici. De regula, toate acestea se rezolva automat prin instalarea Arduino IDE din repozitoriul linuxului cu care lucrati. Vizitati si situl http://www.arduino.cc pentru detalii despre instalarea Arduino in Linux si permisiunile necesare pentru udev (sau vedeti captura de ecran de mai jos).

Screenshot_20171010_091050

b. Port blocat, nedisponibil: uneori, cand folositi un Terminal pentru comunicatia seriala, se intampla sa se blocheze si sa iasa fara sa inchida conexiunea. In acest moment, comunicatia cu placa nu este posibila si simpla deconectare si reconectare a cablului USB nu va ajuta pentru ca va fi creat un nou port, /dev/ttyACM1, pentru care noi nu avem setari. Solutia este sa reeditati setarile AVRDude pentru programatorul curent folosit, sau sa restartati linux.

Anunțuri
6 comentarii
  1. mirceacluj permalink

    in sfirsit dupa lungi cautari am gasit pagina aceasta in l.romana ..Felicitari !!

  2. ciobotaru permalink

    am cautat C-lib Atmega pe Github ( mi-am facut un cont acolo ) si pe siteul tau dar nu am gasit nicicum ,,downloadul ”Ar trebui sa corectezi tutorialul ,,fara sa ne mai trimiti la Google Code

  3. poti sa refaci acest tutorial cu linkurile actualizate ,,caut si dau de erori 404 pe google

Trackbacks & Pingbacks

  1. Atmel AVR Toolchain si Eclipse IDE | Luna Purpurie
  2. ATmegaCLib2 are prorpiul ArduinoISP “sketch” | Luna Purpurie
  3. avrdude 6.0.1 nu mai are probleme cu avr eclipse plugin | Luna Purpurie

Va rog, nu folositi limbaj de messenger. Multumesc!

Completează mai jos detaliile tale sau dă clic pe un icon pentru a te autentifica:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s

%d blogeri au apreciat asta: