Cíl návrhu
K programování jednočipových mikrokontrolérů firmy Atmel řady ATmega a ATtiny se používá sériový programátor, který pomocí 4 signálů programuje obsah programové a datové paměti a nastavení pojistek cílového obvodu. Sériový způsob programování je u obvodů ATtiny obohacen o vysokonapěťové programování, které nepotřebuje dedikovaný vstup RESET a šetří tak počet vývodů obvodu, které jsou rezervovány a nemohou plnit uživatelskou funkci. Existuje řada programátorů včetně programového vybavení, které pomocí sériového nebo paralelního portu programují cílový obvod. Mezi nejjednodušší programátory patří PonyProg, který vyžaduje pouze minimum diskrétních součástek. Cílem návrhu programátoru je pomocí obvodu ATmega8 vytvořit programátor připojitelný přes rozhraní USB.
Výhody:
- připojení programátoru přes rozhraní USB
- autodetekce cílového programovatelného obvodu
- identifikace zařízení jako USB CDC (Communication Device Class), virtuální COM port s generickými ovladači (usbser.sys)
- programování bez software na straně PC - pouze pomocí poslání HEX souboru do COM portu
- vysokonapěťové programování obvodů ATtiny
- portovatelnost, platformově nezávislý návrh
- malé rozměry, nízká cena
Nevýhody:
- omezený počet cílových obvodů (ATmega, ATtiny)
- výroba programátoru vyžaduje jiný programátor (PonyProg)
- data nelze číst, pouze ověřovat
Rozhraní
Programovací vodiče se skládají s datového vstupního (MISO) a výstupního (MOSI), hodinového (SCK) a řídícího (RESET) vodiče. U vysokonapěťového programování je RESET nahrazen zdrojem +12V a přibývá instrukční datový vodič (INSTR).
Konektor má rozměr 2x5 pinů a vychází z PonyProg ISP konektoru (vstup/výstup z pohledu programátoru):
2
CLKI
|
4
MOSI
|
6
MISO
|
8
SCK
|
10
RST
+12V
|
1
Vcc
|
3
Xtal1
|
5
Xtal2
|
7
GND
|
9
GND
|
Programátor je opatřen dvěma LED indikátory: červeným a zeleným. V případě chyby v datech poslaných do programátoru nebo při chybě cílového zařízení svítí červená LED. Při USB komunikaci svítí zelená LED.
Komunikace s programátorem probíhá jako zápis na COM port. Existuje více způsobů, jak na port zapisovat. Jedním z nich může být použití programu Hyperterminal, univerzálnější je však příkazová řádka:
C:\>echo PROG >> COM3
C:\>type program.hex >> COM3
Příkazy
FP | nastaví režim zápisu programové paměti (Flash Programming). Sám zjistí typ cílového obvodu. Následně očekává zaslání HEX souboru. |
DP | nastaví režim zápisu datové paměti (Data Progamming). Následně očekává zaslání HEX souboru. |
FT | nastaví režim ověřování (testování) správnosti zápisu programové paměti (Flash Testing). Následně očekává HEX soubor, který porovná s obsahem cílové paměti. V případě neshody se rozsvítí červená LED. | |
DT | nastaví režim ověřování (testování) správnosti zápisu datové paměti (Data Testing). Následně očekává HEX soubor, který porovná s obsahem cílové paměti. V případě neshody se rozsvítí červená LED. | |
HV | nastaví vysokonapěťové programování (High Voltage). |
FU 0xAABBCC | zapíše/ověří pojistky obvodu (FUses). CC=low, BB=high, AA=extended |
LK 0xAA | zapíše/ověří zámky obvodu (LocK). |
CL 0xAA | zapíše/ověří kalibrační byte obvodu (CaLibration byte). |
ER | vymaže obvod (ERase) |
OK | ukončí programování, vypne programovací napětí. |
: | dvojtečkou začínají HEX soubory a zahajují programování/ověřování |
Příklad
V souboru program.hex a eeprom.hex je uložen program, který chceme nahrát do ATtiny15 pomocí vysokonapěťového programování:
C:\>echo HIVOLT >> COM3
C:\>echo FP >> COM3
C:\>type program.hex >> COM3
C:\>echo FT >> COM3
C:\>type program.hex >> COM3
C:\>echo DP >> COM3
C:\>type eeprom.hex >> COM3
C:\>echo DT >> COM3
C:\>type eeprom.hex >> COM3
C:\>echo FU 0xABCDEF >> COM3
C:\>echo OK >> COM3
V souboru program.hex je uložen program, který chceme nahrát do ATmega8. Pojistky nenastavujeme, předpokládáme, že jsou nastaveny od minulého programování správně. Tento příklad je typický pro ladění programů, kdy je programová paměť přepisována velmi často:
C:\>echo WPROG >> COM3
C:\>type program.hex >> COM3
C:\>echo TPROG >> COM3
C:\>type program.hex >> COM3
C:\>echo OK >> COM3
Deskriptory zařízení
Device Descriptor
Offset | Popis | Hodnota |
0 | bLength | 0x12 |
1 | bDescriptorType | 0x01 |
2,3 | bcdUSB | 0x0110 |
4 | bDeviceClass | 0x02 |
5 | bDeviceSubClass | 0x00 |
6 | bDeviceProtocol | 0x00 |
7 | bMaxPacketSize | 0x08 |
8,9 | idVendor | 0x065d |
10,11 | idProduct | 0x1021 |
12,13 | bcdDevice | 0x0004 |
14 | iManufacturer | 0x00 |
15 | iProduct | 0x01 |
16 | iSerialNumber | 0x00 |
17 | bNumConfigurations | 0x01 |
Configuration Descriptor (spojení Configuration, Interface a Endpoint descriptoru)
Offset | Popis | Hodnota |
Configuration Descriptor |
0 | bLength | 0x09 |
1 | bDescriptorType | 0x02 |
2,3 | wTotalLenght | 0x0043 |
4 | bNumInterfaces | 0x02 |
5 | bConfigurationValue | 0x01 |
6 | iConfiguration | 0x00 |
7 | bmAttributes | 0x80 |
8 | bMaxPower | 0x32 |
Interface 0 Descriptor |
9 | bLength | 0x09 |
10 | bDescriptorType | 0x04 |
11 | bInterfaceNumber | 0x00 |
12 | bAlternateSetting | 0x00 |
13 | bNumEndpoints | 0x01 |
14 | bInterfaceClass | 0x02 |
15 | bInterfaceSubClass | 0x02 |
16 | bInterfaceProtocol | 0x01 |
17 | iInterface | 0x00 |
CDC - Header Functional Descriptor |
18 | bLength | 0x05 |
19 | bDescriptorType | 0x24 |
20 | bDescriptorSubtype | 0x00 - Header Functional Descriptor |
21,22 | bcdCDC | 0x0110 |
CDC - Call Management Functional Descriptor |
23 | bLength | 0x05 |
24 | bDescriptorType | 0x24 |
25 | bDescriptorSubtype | 0x01 - Call Management Functional Descriptor |
26 | bmCapabilities | 0x01 |
27 | bDataInterface | 0x01 |
CDC - Abstract Control Management Functional Descriptor |
28 | bLength | 0x04 |
29 | bDescriptorType | 0x24 |
30 | bDescriptorSubtype | 0x02 - Abstract Control Management Functional Descriptor |
31 | bmCapabilities | 0x08 |
CDC - Union Functional Descriptor |
32 | bLength | 0x05 |
33 | bDescriptorType | 0x24 |
34 | bDescriptorSubtype | 0x06 - Union Functional Descriptor |
35 | bMasterInterface | 0x00 |
36 | bSlaveInterface | 0x01 |
Endpoint 3 Descriptor |
37 | bLength | 0x07 |
38 | bDescriptorType | 0x05 |
39 | bEndpointAddress | 0x83 |
40 | bmAttributes | 0x03 |
41,42 | wMaxPacketSize | 0x0008 |
43 | bInterval | 0xff |
Interface 1 Descriptor |
44 | bLength | 0x09 |
45 | bDescriptorType | 0x04 |
46 | bInterfaceNumber | 0x01 |
47 | bAlternateSetting | 0x00 |
48 | bNumEndpoints | 0x02 |
49 | bInterfaceClass | 0x0A |
50 | bInterfaceSubClass | 0x00 |
51 | bInterfaceProtocol | 0x00 |
52 | iInterface | 0x00 |
Endpoint 1 Descriptor |
53 | bLength | 0x07 |
54 | bDescriptorType | 0x05 |
55 | bEndpointAddress | 0x81 |
56 | bmAttributes | 0x02 |
57,58 | wMaxPacketSize | 0x0008 |
59 | bInterval | 0x00 |
Endpoint 2 Descriptor |
60 | bLength | 0x07 |
61 | bDescriptorType | 0x05 |
62 | bEndpointAddress | 0x02 |
63 | bmAttributes | 0x02 |
64,65 | wMaxPacketSize | 0x0001 |
66 | bInterval | 0x00 |
Deskriptory budou odeslány v následujících paketech:
Device Descriptor:
4B 12 01 10 01 02 00 00 08 10 CF
C3 5D 06 21 10 04 00 00 01 1A D3
4B 00 01 3F 8F
|
Configuration Descriptor:
4B 09 02 43 00 02 01 00 80 03 75
C3 32 09 04 00 00 01 02 02 74 DC
4B 01 00 05 24 00 10 01 05 CE 3C
C3 24 01 01 01 04 24 02 08 D1 53
4B 05 24 06 00 01 07 05 83 E9 63
C3 03 08 00 FF 09 04 01 00 21 F8
4B 02 0A 00 00 00 07 05 81 E6 DC
C3 02 08 00 00 07 05 02 02 26 39
4B 01 00 00 DF FF
|
Schéma
 | Schéma zapojení programátoru |
 | Připojení cílových obvodů |
Signatury obvodů
Typ | Flash [B] | EEPROM [B] | Flash Page | EEPROM Page | S0 | S1 | S2 |
ATmega8 | 8192 | 512 | 64 | 4 | 0x1E | 0x93 | 0x07 |
ATmega16 | 16384 | 512 | 128 | 4 | 0x1E | 0x94 | 0x03 |
ATmega32 | 32768 | 1024 | 128 | 4 | 0x1E | 0x95 | 0x02 |
ATmega64 | 65536 | 2048 | 256 | 8 | 0x1E | 0x96 | 0x02 |
ATmega128 | 131072 | 4096 | 256 | 8 | 0x1E | 0x97 | 0x02 |
ATmega640 | 65536 | 4096 | 256 | 8 | 0x1E | 0x96 | 0x08 |
ATmega1280 | 131072 | 4096 | 256 | 8 | 0x1E | 0x97 | 0x03 |
ATmega1281 | 131072 | 4096 | 256 | 8 | 0x1E | 0x97 | 0x04 |
ATmega2560 | 262144 | 4096 | 256 | 8 | 0x1E | 0x98 | 0x01 |
ATmega2561 | 262144 | 4096 | 256 | 8 | 0x1E | 0x98 | 0x02 |
ATmega48 | 4096 | 256 | 64 | 4 | 0x1E | 0x92 | 0x05 |
ATmega88 | 8192 | 512 | 64 | 4 | 0x1E | 0x93 | 0x0A |
ATmega168 | 16384 | 512 | 128 | 4 | 0x1E | 0x94 | 0x06 |
ATtiny13 | 1024 | 64 | 32 | 4 | 0x1E | 0x90 | 0x07 |
ATtiny15L | 1024 | 64 | - | - | 0x1E | 0x90 | 0x06 |
ATtiny2313 | 2048 | 128 | 32 | 4 | 0x1E | 0x91 | 0x0A |
AT90USB64 | 65536 | 2048 | 256 | 8 | 0x1E | 0x96 | 0x82 |
AT90USB128 | 131072 | 4096 | 256 | 8 | 0x1E | 0x97 | 0x82 |
|