LOW-LEVEL PROGRAMIRANJE ARDUINA: BLINKANJE LEDICE

LOW-LEVEL PROGRAMIRANJE ARDUINA: BLINKANJE LEDICE-Uncategorized

UVOD

Ako koristimo Arduino IDE s Atmelovim mikrokontrolerima pocesi će se odvijati vrlo brzo, ali isto ne možemo tvrditi za input/output pinove (GPIO). Kako bismo ubrzali ove procese možemo koristiti lower level naredbe.

NAPOMENA: stvari koje ćemo u početku raditi nisu u potpunosti čisti C, a i programirati ćemo iz Arduino IDE-a. Cilj je postepeno objasniti pozadinu “grafičkog” programiranja koje nam nudi Arduino.

Atmega328 najčešće je korišteni Atmelov mikrokontrole s Arduino platformom (Croduino, Dasduino, Arduino Uno i td.). Tri su serije pinova, tzv. porta, na ovom mikrokontroleru:

Port B su digitalni pinovi 8 – 13
Port C su analogni ulazni pinovi
Port D su digitalni pinovi 0 – 7.

Svaki od ovih serija pinova ima 3 8-bitna registra za kontrolu:

DDR (Data Direction) registar kooji određuje piše li se ili čita s pina, 0 = input 1 = output.
PIN registar se koristi za čitanje digitalne vrijednosti pina
PORT registar ima dvije funkcije: ako je DDR postavljen kao output: 0 postalja pin u low stanje te 1 u high stanje. ako je DDR postavljen kao input: 1 uključuje unutrašnju pull-up otpornik.

Nazive ovih registara pronaći ćete i kao DDRB, DDRC, DDRD i td., gdje B,C i D oznaćuju portove.

REGISTARI ZA KONTROLU PINOVA

Svaki pin je jedan bit na kontrolnim registrima. Ovo je lista prema mapi iznad:

B0 = digitalni pin 8
B1 = digitalni pin 9
B2 = digitalni pin 10
B3 = digitalni pin 11
B4 = digitalni pin 12
B5 = digitalni pin 13
B6 = rezerviran za kristal, ne koristiti
B7 = rezerviran za kristal, ne koristiti

C0 = analogni pin 0
C1 = analogni pin 1
C2 = analogni pin 2
C3 = analogni pin 3
C4 = analogni pin 4
C5 = analogni pin 5
C6 = analogni pin 6, samo na Dasduino Core te Arduino nano
C7 = analogni pin 7, samo na Dasduino Core te Arduino nano

D0 = digitalni pin 0, koristi se za serijsku komunikaciju nije preporučeno koristiti
D1 = digitalni pin 1, koristi se za serijsku komunikaciju nije preporučeno koristiti
D2 = digitalni pin 2
D3 = digitalni pin 3
D4 = digitalni pin 4
D5 = digitalni pin 5
D6 = digitalni pin 6
D7 = digitalni pin 7

BLINKANJE LEDICE

Za ovaj kod trebate Dasduino Core ili drugu pločicu s Atmega328 mikrokontrolerom.

Kopirajte i uploadajte ovaj kod u Arduino IDE. Paliti ćemo internu LED diodu na 13 pinu Dasduina, pin B5.

void setup()
{
  // postavljamo DDRB kao output
  DDRB = B00100000;
}
void loop()
{
  PORTB = B00100000; // Pali LEDicu
  delay(1000);
  PORTB = B00000000; // Gasi LEDicu
  delay(1000);
}
Prije objašnjenja neka nam pri ruci bude Atmega328 datasheet, odnosno tablica registra za port B:

Kao što smo rekli u uvodu DDR (u ovom slučaju DDRB) postavlja pin kao input odnosno output.. Iz tablice 13.4.3. iznad vidimo da se B5 pin nalazi na poziciji 5 ovog registra, te 1 (high) označava da je pin postavljen kao izlazni (output). Stoga mijenjamo stanje DDRB registra u B00100000. “B” ispred nula i jedinica označava da koristimo binarni broj. Isto smo mogli napisati kao broj 32 u dekadskom zapisu ili 0x20 u heksadekadskom.

Sljedeći korak je paliti, ondnosno gasiti pin B5 (digitalni pin13). Kao što smo već rekli, za pisanje pinova koristimo registar PORT (u ovom slučaju PORTB), te “1” označava HIGH, a “0” LOW. Pogledajmo tablicu 13.4.2. Pin B5 ponovno se nalazi na poziciji 5, pa će tako stanje pina B00100000 postaviti pin u high stanje, a B00000000 pin u low stanje.

NAPOMENA: mijenjanje stanja ostalih bitova u registrima neće utjecati na stanje ovoga pina, B5.

USPOREDBA ARDUINO LIBRARYA I LOW-LEVEL KODA