Programovanie mikrokontroléra ATmega 328P, ktorý je aj v Arduine

článku sme ukázali ako naprogramovať čipy ATtiny45 a ATtiny85. Ak potrebujete viac portov, alebo komunikačných rozhraní, môžete pre svoju konštrukciu použiť aj mikrokontrolér ATmega328 – rovnaký ako je vo vývojovej doske Arduino.

Program aj zapojenie periférií môžete odladiť na Arduine a potom naprogramovať mikrokontrolér na plošnom spoji vašej konštrukcie. Pýtate sa prečo nepoužiť priamo Arduino, veď je lacné? Ak nezáleží na rozmeroch a úspornej prevádzke, tak prečo nie. Ale konštrukcia priamo s čipom môže byť podstatne menšia, ľahšia a bude mať podstatne menšiu spotrebu. Typický prúdový odber Arduina je 50 mA, pretože na ňom sú aj obvody pre programovanie cez USB. Odber samotného čipu je okolo 15 mA, a ak použijete knižnicu na prepínanie do úsporných módov, tak aj podstatne nižší.

Postup programovania ATmega328

ATmega 328

Pre jednoduché bastlenie, alebo spájkovanie predpokladáme čip ATmega328P v puzdre DIL (Dual In Lina) s 28 vývodmi umiestnenými po 14 na každej strane. K dispozícii je aj čip v puzdre pre plošnú montáž, ten si však vyžaduje zručnosť pri spájkovaní a do prepojovacieho poľa sa použiť nedá.

Ak budeme popisovať obvod situovaný na šírku s vývodom 1 vľavo dole, tak v hornej rade vývodov zľava je:

  • A6-A0 je 6 pinov fungujúcich aj ako analógové vstupy vstupov
  • GND, čiže elektrická zem, alebo mínus pól pri batériovom napájaní
  • AREF a AVCC
  • D13-D9 – digitálne piny

V spodnej rade zľava sú piny

  • RST – signál reset
  • RX a TX – piny pre sériovú komunikácii. Môžu fungovať aj ako digitálne piny 0 a 1.
  • D2-D4 digitálne piny
  • VCC napájacie napätie 5V
  • GND elektrická zem
  • XTL 1 a 2 – vývody na pripojenie externého 16 MHz kryštálu. Ten pri využití interného oscilátora nepotrebujete pripájať
  • D5-D8 digitálne piny

Väčšina pinov má aj alternatívne funkcie ako signály komunikačných rozhraní.

Arduino ako programátor pre ATmega

Aby ste mohli čip ATmega 328 použiť samostatne, potrebujete do nich nahrať program. Ako programátor môžete použijť ľubovoľné Arduino a pomocou niekoľkých vodičov ho pripojíte na piny mikrokontroléra.

Potrebujete pripojiť:

Na naprogramovanie potrebujete prepojiť:

Medzi piny RESET a GND na Arduine pripojte 10 uF elektrolytický kondenzátor. Plus pól kondenzátora je pripojený  na RESET. Ostatné piny prepojte podľa tabuľky

Arduino ATMega328P
5 V VCC PIN 7 a AVCC PIN 20
GND GND PIN 8 a PIN 22
PIN10 RESET PIN 1
PIN11 PIN 17
PIN12 PIN 18
PIN13 PIN 19

V tabuľke sú označené aj porty aj PINy, čiže v prípade Arduina číslovanie na systémovom konektore a v prípade integrovaného obvodu ATmega jeho „nožičky“.

Aby ste mohli sledovať fungovanie programátora, môžete, ale nemusíte pripojiť aj tri LED diódy k pinom Arduina:

  • PIN7 – bliká počas programovania podriadeného Mikrokontroléra.
  • PIN8 – signalizuje chybu.
  • PIN9 – Blikanie so stmievaním pomocou PWM signalizujem že programátor je funkčný

Konfigurácia vývojového prostredia Arduino IDE

Ak nemáte nainštalované vývojové prostredie Arduino IDE stiahnete si ho na stránke https://www.arduino.cc v sekcii Software. K dispozícii je pre platformy Windows, Mac OS aj Linux. Vývojové prostredie sa neinštaluje, z internetu si stiahnete priamo aplikáciu, ktorú vo Windows umiestnite do vhodného adresára a na platforme Mac OS ju z adresára Stiahnuté prekopírujete do adresára Aplikácie. V novom MacOS Catalina je potrebné povoliť fungovanie aplikácie tretej strany.

Do vývojového prostredia je potrebné doplniť podporu pre samostatný obvod AT Mega 328P. Stiahnite si zo stránky https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard súbory podpory, konkrétne https://www.arduino.cc/en/uploads/Tutorial/breadboard-1-6-x.zip V adresári, kde sú projekty Arduino IDE, implicitne je to C:\Users\MenoPouzivatela\Documents\Arduino vytvorte zložku hardware a prekopírujte sem rozbalenú zložku breadboard zo stiahnutého archívu, kde je bootloader a konfiguračný súbor.

Po spustení Arduino IdE zistíte, že do menu Tools/Boards pribudne nová položka pre obvod ATmega 328.

Aby ste mohli použiť Arduino ako programátor pre samostatný obvod ATmega spustite vývojové prostredie  Arduino IDE a otvorte príklad File>Examples>ArduinoISP. Tento program nahrajte do Arduina. Nemusíte riešiť ako program funguje, je to len nástroj na nahratie kódu do mikrokontroléra ATmega.

Ako prvý je potrebné do mikrokontroléra zaviesť bootloader, čiže zavádzač pomocou menu Nástroje > Vypáliť zavádzač (bootloader). Mikrokontrolér, či už je to ATtiny, alebo ATmega má totiž z výroby pamäť flash, pre používateľský kód úplne prázdny. Výrobca predpokladá, že obvod sa bude programovať pomocou špeciálneho programátora. V Arduine a aj v našich zapojeniach však programujeme mikrokontrolér zapojený v obvode, čiže používame metódu ISP (In-System Programmer). Ten umožňuje programovanie mikrokontroléra cez sériové rozhranie. Vo flash pamäti  je špeciálny kód nazývaný bootloader, umiestnený na konci pamäti. Na začiatku pamäti sa predpokladá umiestnenie používateľského kódu. Po resete sa spustí bootloader, ktorý zistí, či na piny sériového rozhrania prišla špeciálna postupnosť znakov signalizujúca, že sa bude programovať. Ak áno, bootloader číta zo sériového rozhrania údaje a programuje nimi flash pamäť.

Predpokladajme, že vo vývojovom prostredí máte program pre ATmega, trebárs príklad blinky z ponuky príkladov, ktorý bliká lED diódou, modifikovaný tak, aby blikal LED diódou na niektorom výstupe, napríklad na D8, ktorý je posledný v dolnej rade vývodov integrovaného obvodu.

void setup() {
pinMode(8, OUTPUT);
}

void loop() {
digitalWrite(8, HIGH);
delay(300);
digitalWrite(8, LOW);
delay(300);
}

V menu vyberte Tools>Programmer>Arduino as ISP. Následne v menu vyberte položku Sketch>Upload Using Programmer, alebo v slovenskej verzii Projekt>Nahrať Pomocou Programátora.

Ak všetko dopadlo dobre a aplikáciu máte odladenú odpojte programovacie vodiče a prípadne doplňte súčiastky a prepojenia, ktoré by prípadne bránili programovaniu. Programovanie bude vo väčšine prípadov fungovať aj v prípade ak máte k pinom ATmega 17, 18 a 19 pripojené súčiastky. V našom prípade bude Arduino pri programovaní môcť bez problémom meniť logické úrovne na pinoch. Len keby bol niektorý z pinov pripojený natvrdo k napájaciemu napätiu, alebo GND, programovanie by nefungovalo.

POZOR: Určite vás napadlo odladiť kód na Arduine, čo je správna myšlienka a následne vybrať naprogramovaný integrovaný obvod z pätice Arduina a použiť ho vo vlastnej konštrukcii. Toto fungovať nebude. Mikrokontrolér v Arduine funguje na frekvencii 16 MHz a k tomu potrebuje externý oscilátor. Interný oscilátor ATmega funguje len na 8 MHz.  Ak má byť mikrokontrolér fungovať na frekvencii 16 MHz, je potrebné ešte pripojiť k čipu ešte kryštál a dva kondenzátory, tak ako je to v Arduine. Len na doplnenie, ak používate interný 8 MHz oscilátor, budete mať pre svoj program k dispozícii asi o 2 kB menšiu kapacitu, namiesto 32 kilobajtov, budete mať k dispozícii len 30.

Sériová komunikácia s vývojovým prostredím

Ukážeme aj možnosť ladenia cez sériové rozhranie. Budeme prenášať počítadlo cyklov a zobrazovať ich v okne monitorovania sériovej komunikácie. Na prenos údajov je potrebný prevodník z USB na RS232. Najjednoduchšie ho získate ak z vývojovej dosky Arduino UNO vyberiete čip ATmega328, ktorý je v týchto doskách v pätici. Následne prepojíte signály RX a TX na portoch 0 a 1 Arduina s pinmi 1 a 2 na čipe ATmega328 vo vašej konštrukcii.  Zapojenie je prekrížené, čiže na pin 1 čipu RX sa privedie signál TX z Arduina a na pin 2 TX sa privedie signál RX z Arduina. Priklad výpisu počítadla cyklu cez sériové rozhranie:

int nPocitadlo;
void setup()
{

Serial.begin(9600);
pinMode(8, OUTPUT);
nPocitadlo = 0;
}

void loop() {
digitalWrite(8, HIGH);
delay(300);
digitalWrite(8, LOW);
delay(300);
nPocitadlo++;
Serial.print("cyklus: ");
Serial.println(nPocitadlo);
}

Obsluha alfanumerického LCD displeja

Ukážeme aj pripojenie alfanumerického displeja cez komunikačné rozhranie I2C. Prepojte signály takto:

GND <—> GND

VCC <—> 5V

SDA <—> A4

SCL <—> A5

Budete potrebovať knižnicu Wire s funkciami komunikačného rozhrania I2C napríklad z tohoto zdroja https://www.resistorpark.com/content/Arduino_Libraries/wire.zip

a taktiež knižnicu na obsluhu displeja pripojeného cez rozhranie I2C, napríklad http://downloads.arduino.cc/libraries/github.com/marcoschwartz/LiquidCrystal_I2C-1.1.2.zip

Príklad na zobrazenie statického textu

</pre>

#include
#include

LiquidCrystal_I2C lcd(0x3F, 16, 2);  // Adresa LCD displeja  16 znakov x 2 riadky

void setup()
{
lcd.init();                      // inicializacia
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("NEXTECH - IoT");
lcd.setCursor(0,1);
lcd.print("obvod ATmega328P");
}

void loop() {}