Low-level programiranje Arduina: Blinkanje LEDice

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, Croduino2, 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

 
Atmega328 pins mapping
 
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 Croduino Basic i Basic2 te Arduino nano
C7 = analogni pin 7, samo na Croduino Basic i Basic2 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 Croduino Basic ili drugu pločicu s Atmega328 mikrokontrolerom.
 
Kopirajte i uploadajte ovaj kod u Arduino IDE. Paliti ćemo internu LED diodu na 13 pinu Croduina, 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:
 
PORT B tablica
 
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

 
Arduino vs low-level

Leave a Reply