Programátor
V pravom zmysle slova programátor je človek, ktorý programuje, ale ja mám na mysli elektronický obvod, pomocou ktorého zapíšeme program do flash pamäte mikrokontroléra. Elektrickú schému programátora vidíte na obrázku.Je to veľmi jednoduché zapojenie, nemusíte ani vyrábať dosku plošných spojov. Ja som použil dosku z iného zapojenia, na ktorej som pílkou na železo prerušil medené „cestičky”, aby som mal medené ostrovčeky. Na tie som prispájkoval súčiastky a drôty s napájacím napätím a vodiče kábla na paralelný port. Pätica mikrokontroléra držala len na drôtoch (vo vzduchu) . Na stránke s návodom sa spomína, že kábel medzi konektorom na paralelný port a programátorom musí byť čo najkratší. V mojom prípade mal dĺžku asi 1m a ešte to fungovalo bez problémov. Musím ešte poznamenať, že na týchto schémach je konektor na paralelný port nakreslený zo strany kolíkov, nie zo strany spájkovania (ja som to najskôr zapojil naopak a nefungovalo to). Do obvodu som prispájkoval päticu a mikrokontrolér som zasunul, až keď bol programátor hotový. Ako zdroj sa dá použiť hocičo, čo sa strká do zásuvky a má 7 až 35 V, napríklad nabíjačka na mobil. (Nenechajte sa popliesť údajom na nabíjačke, že jej napätie je 4 V. V skutočnosti nabíjačky Nokia i Motorola majú asi 11 V. Údaj o napätí platí pri odbere 300 mA.)
Neskôr som rovnaký obvod zapojil na skúšobnej doske (tzv. kontaktné pole), to tiež dobre funguje, hoci na spomenutej stránke sa neodporúča dávať kryštál na skúšobnú dosku, pretože vraj nie je vhodná pre vysokofrekvenčné obvody. Fotka obvodu na skúšobnej doske .
Programátor je jednoduchý a dokonca niektoré súčiastky sa ešte dajú vynechať. Ja som skúsil vynechať kondenzátory C1, C2 a kryštál a všetko fungovalo (mikrokontrolér má pri výrobe nastavené použitie vnútorného RC oscilátora s frekvenciou 1 MHz. Ak chcete, aby procesor mal frekvenciu kryštálu, musíte naprogramovať tzv. prepojky, viď stránku http://www.captain.at/electronics/atmel-programmer/ ). No a ak máte stabilizovaný zdroj 5 V, môžete vynechať súčiastky IO2, C3, C4 a C5.
Skúšal som programovať aj ATmega162 a fungovalo to. Najprv som však musel trochu zmeniť zapojenie (napájanie pripojiť na vývody 20 a 40, kryštál na vývody 18 a 19 a svetelnú diódu na vývod 15 — viď tento katalógový list).
Programy
Na mojom Xubuntu 6.10 som si inštaloval tieto balíky príkazomapt-get install
: gcc-avr, binutils-avr, avr-libc a uisp.
Vytvoril som adresár, kde som uložil súbory avrledtest.c a Makefile.
Sú to textové súbory a sú zo stránky
http://www.linuxfocus.org/English/March2002/article231.shtml,
ale trochu som ich zmenil. Funkcia delay_ms()
obsahovala chybu, v skutočnosti bolo jedno, aké číslo dostala ako argument, vždy spôsobila rovnaké oneskorenie. No a vyhol som sa funkciám cbi()
a sbi()
. Súbor avrledtest.c:
#include <avr/io.h> void delay_ms(unsigned short ms) { unsigned short outer1, outer2, bla; outer1 = 20; while (outer1) { outer2 = 10; while (outer2) { bla =0; while (bla<ms) bla++; outer2--; } outer1--; } } int main(void) { DDRD = 32; // šiesty vývod portu D je výstup (PD5) while (1) { PORTD = 0; // vypnutie LED — bity registra PORTD sa nastavia na 0 delay_ms(1000); PORTD = 32; // zapnutie LED — bit 5 registra PORTD sa nastaví na 1 delay_ms(1000); } return 0; }Súbor Makefile:
MCU=atmega16 CC=avr-gcc OBJCOPY=avr-objcopy CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues all: avrledtest.hex avrledtest.hex : avrledtest.out $(OBJCOPY) -R .eeprom -O ihex avrledtest.out avrledtest.hex avrledtest.out : avrledtest.o $(CC) $(CFLAGS) -o avrledtest.out -Wl,-Map,avrledtest.map avrledtest.o avrledtest.o : avrledtest.c $(CC) $(CFLAGS) -Os -c avrledtest.c -o avrledtest.o load: avrledtest.hex uisp -dlpt=/dev/parport0 --erase -dprog=dapa uisp -dlpt=/dev/parport0 --upload if=avrledtest.hex -dprog=dapa -v=3 --hash=32 clean: rm -f *.o *.map *.outFunkčnosť programátora vyskúšame príkazom
uisp -dprog=dapa
. Mali by sme dostať správu:Atmel AVR ATmega16 is found.
Mne však najprv uisp vyhlásil, že /dev/parport0 neexistuje. Musel som zadať:
sudo mknod /dev/parport0 c 99 0
sudo chmod 666 /dev/parport0
Ak sa tieto príkazy vykonali úspešne a aj potom uisp vyhlasuje chybu, skontrolujte, či máte mikrokontrolér pripojený na napájacie napätie. Mne to v prípade ATmega162 fungovalo aj bez toho (asi mu stačilo napájanie z paralelného portu PC). Po rozbehaní uisp a paralelného portu si spustíme terminál, nastavíme sa do adresára, kde máme avrledtest.c a Makefile a zadáme
make
Ak nedostaneme žiadne varovania ani chybové hlásenia, objaví sa súbor avrledtest.hex, ktorý zapíšeme do flash pamäte príkazom
make load
Neskôr bude možno šikovnejšie zadávať len
make load
, lebo aj tento príkaz porovná čas poslednej zmeny súboru avrledtest.c a avrledtest.hex a spustí avr-gcc, ak treba.
Pripomínam, že horeuvedený program avrledtest predpokladá, že ako zdroj hodinových impulzov používate vnútorný RC oscilátor s frekvenciou 1 MHz. Vtedy je perióda blikania LED asi 2 sekundy. V prípade, že budete chcieť naprogramovať napríklad komunikáciu USART, je lepšie použiť kryštálový oscilátor, ktorý vyžaduje, aby bol pripojený vonkajší kryštál. Tento oscilátor musíte umožniť naprogramovaním prepojky CKOPT (viď stránku http://www.captain.at/electronics/atmel-programmer/ ).
Bitové operácie v C
Na nastavenie bitov v registroch na žiadanú hodnotu používam v horeuvedenom programe iba operátor priradenia =, ale pri písaní programov pre mikroprocesory je takmer vždy potrebné používať aj operátor bitového logického súčtu (OR), súčinu (AND) a negácie (NOT). Operátor bitového súčtu je znak | a vykoná logický súčet bit po bite v dvoch číslach. Vo výsledku bude 1 na mieste, kde aspoň v jednom z čísel je 1 a nula len na mieste, kde je v obidvoch číslach 0. Napríklad100010002 | 111000002 je rovné 111010002
(Dolný index 2 za číslom znamená, že číslo je v dvojkovej sústave.) Teda napríklad ak chceme v jazyku C nastaviť piaty bit premennej number na 1 a ostatným ponechať pôvodnú hodnotu, robí sa to takto:
number = number | 32 ;
Čo je to isté ako number |= 32;
. Tak isto operátor logického súčinu — znak & vykoná logický súčin bit po bite. No a operátor bitovej negácie je ~.
Napríklad ak chceme v programe nastaviť piaty bit v čísle number na 0 a ostatné ponechať na pôvodnej hodnote, napíšeme
number = number & (~32);
Keďže 32 sa rovná 1000002, môžeme pre prehľadnejší zápis použiť operátor bitového posunu vľavo <<. Tento operátor posunie číslo vľavo o určený počet bitov. Napríklad 1<<5 sa rovná 32. Je to to isté ako vynásobenie čísla piatou mocninou dvojky.
Literatúra
- Dôkladný zdroj podrobností o ATmega16 je jeho katalógový list. Mne takmer stačil na vyriešenie mojej úlohy. Obsahuje ukážky kódu v asembleri i v jazyku C, použiteľné snáď pre všetky C prekladače.
- Celkom dobrá kniha o ATmega16 je „Práce s mikrokontroléry ATMEL AVR ATmega16”, autor David Matoušek. Ak si ju nechcete kúpiť, môžete si ju požičať z CVTI. Táto kniha je užitočná napriek tomu, že sa v nej píše o programovaní v asembleri, lebo podrobne opisuje mikrokontrolér, jeho AD prevodník, komunikáciu USART, prerušenia...
- V ponuke GM electronic som našiel knihu „Mikrokontroléry Atmel AVR — programování v jazyce C”, autor Vladimír Váňa. V tejto knihe sa píše o programovaní v prostredí Code Vision AVR.
- V knižnici CVTI je aj kniha „C pro mikrokontroléry”, autor Mann Burkhard. Píše sa v nej aj o AVR, ale nie v spojení s gcc-avr. Má kapitolu o sdcc (Small Device C Compiler), ktorá obsahuje viacero príkladov programov pre tento prekladač.
- priaznivci P2P programov si môžu nejakú dobrú knihu stiahnuť vo formáte djvu. Stačí vyhľadávať niečo ako
"Atmel AVR" djvu
v každej z tých hrubších kníh bude pravdepodobne aj kapitola o gcc-avr. - Dobrý zdroj inšpirácie je server www.hw.cz. Je tam aj článok o programe uisp .
- Na záver tejto časti uvádzam linky na dve stránky, z ktorých som vychádzal:
http://www.captain.at/electronics/atmel-programmer/ — návod na programovanie ATmega16 pomocou uisp a gcc-avr. Na stránke www.captain.at nájdete aj návod na rozbehanie komunikácie s počítačom (RS-232).
http://www.linuxfocus.org/English/March2002/article231.shtml — návod na programovanie AT90S4433 pomocou uisp a gcc-avr
A taktiez sa pozri ako by sa dalo rozchodit AVR studio pod Wine.
A v poslednom rade ATAVRDRAGON ako ho spojazdnit pod nejakou distribuciou.
Ja planujem prejst na Linux ale potrebujem poradit.
Dzairo
Tolko slovo odbornika.
je to avrstudio pre windows naozaj nenahraditelne emacsom a znalostou make? lebo mam kamosa, ktory sa tomu dost venuje a hovori mi, ze soft pre windows je lepsi (pritom tiez pouziva gcc).
okrem toho by mu chybali nejake programy na kreslenie dosiek (presedlal z eagle na nejaky profesionalny) takze ho urcite prehovarat nechcem, len ma to strasne zaujima (ja by som to urcite vymenil za emacs :))
Dlhe roky som pracoval len s ASM ale teraz pracujem aj s C.
No mne zatial robia problemy tvorit vlastne make file. nejak do toho este neviem vliezt.
regards
vim == 994
to len puntickarsky emacsisty oznacuju tak vim :)
http://www.stallman.org/saint.html
EMACS: Emacs Makes All Computing Simple
EMACS: Emacs Masquerades As Comfortable Shell
Ked som prvykrat videl tento programator na seriovy port som nechcel verit len neviem ci sa da programovat pomocou "uisp", poradte !!
uisp -dprog=dasa2 ....
. Vyčítal som to z helpu uisp:dasa serial (RESET=RTS SCK=DTR MOSI=TXD MISO=CTS)
dasa2 serial (RESET=!TXD SCK=RTS MOSI=DTR MISO=CTS)
dasa3 serial (RESET=!DTR SCK=RTS MOSI=TXD MISO=CTS)
inac nasiel som na nete zaujimave zapojenie a mozno by seklo ho urobit
www.kmit.sk/~peto/AVR/smallpmd/index.php
co k tomu dodat Kubuntu je super............
Andrej (autor článku)
Na stranke "www.lancos.com" su aj zdrojaky aj nejake verzie pre stary Redhat este s jadrom 2.4
jedine co som zistil z dokumentacie ze je nizko prikonovy Low Voltage
Len take drobne upozornenie - neodporucam sa hrat bez uvazenia s poistkami ktore ovladaju oscilator. Mne sa podarilo moj atmel pekne zablokovat, nastastie som ho ozivil druhym tak, ze som na Xtal1 priviedol striedave impulzy z at90s2313.
PS: prajem vsetkym atmelakom prijemnu zabavu s ich chrobakmi ;)
-
Ak si budete chcieť kúpiť v GM electronic v Bratislave nejaký ATmega alebo ATtiny, musíte si to objednať aspoň týždeň vopred. Taká je moja skúsenosť.
-
Skúsil som s týmto programátorom programovať ATtiny2313, ktorý tu bol spomenutý, ale neúspešne. Po príkaze
Pri programovaní ATtiny2313 som už skrátil kábel na asi 30 cm, skratoval 1k odpory, vyskúšal rôzne napájacie napätia a nič.uisp -dprog=dapa
sa síce objaví
Atmel AVR ATtiny2313 is found,
dajú sa aj čítať a programovať prepojky (fuse bytes), ale nedá sa zapísať program (vypisuje niečo ako "Attempt failed. Written 0x12, read 0xff, try to disable polling with the -dno-poll switch).
-
Ak si budete chcieť kúpiť v GM electronic v Bratislave nejaký ATmega alebo ATtiny, musíte si to objednať cez internet aspoň týždeň vopred. Taká je moja skúsenosť.
-
Skúsil som s týmto programátorom programovať ATtiny2313, ktorý tu bol spomenutý, ale neúspešne. Po príkaze
Pri programovaní ATtiny2313 som už skrátil kábel na asi 30 cm, skratoval 1k odpory, vyskúšal rôzne napájacie napätia a nič.uisp -dprog=dapa
sa síce objaví
Atmel AVR ATtiny2313 is found,
dajú sa aj čítať a programovať prepojky (fuse bytes), ale nedá sa zapísať program (vypisuje niečo ako "Attempt failed. Written 0x12, read 0xff, try to disable polling with the -dno-poll switch).
-dprog=stk200
www.olimex.com/dev/pdf/avr-pg1b.pdf
Keď som použil uisp s voľbami -dserial=/dev/ttyS0 -dasa2
tak to fungovalo tak isto ako ten paralelný programátor, že len zobrazilo typ procesora, ale nevedelo do neho zapísať program. Škoda. Musím teda počkať na ten 74xx244.
Ty si niekde spomenul, že paralelný port PC musí byť pri programovaní v režime ECP a píšu to aj na tej stránke. Čo to znamená? Ako sa to dá prepnúť do tohto režimu?
Asi ho vyhodím, aby ma to nepokúšalo dalej s ním strácať čas.
avrdude -c dapa -p t25
Konfiguračný súbor pre avrdude na rozhranie dapa sa nachádza v inštalácii WinAVR.
dakujem
Ešte jedna poznámka: v prípade použitia USB Tiny ISP bude v súbore Makefile príkaz na zápis programu (za make load:) nasledovný:
sudo avrdude -c usbtiny -p m16 -U flash:w:avrledtest.hex
Inak pri inštalácii SW pre programátor pod Ubuntu mám poznámku k návodu na stránke USB Tiny ISP. Je lepšie inštalovať Ubuntu balíky, než sťahovať tie programy zo stránok. Je to minimálne menej prácne, ale pravdepodobne je to aj lepšie kvôli kompatibilite s OS. Takže namiesto ručného sťahovania inštaluje jednoducho pomocou
sudo apt-get install binutils avr-libc gcc-avr
atď.