VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky Obor: Počítačové systémy
Programátor obvodů GAL16V8 bakalářská práce
Autor: Miroslav Bílek Vedoucí práce: Ing.Bc. David Matoušek Jihlava 2014
Anotace Vytvořte funkční vzorek jednoúčelového programátoru obvodů GAL16V8. Připojení k počítači bude řešeno pomocí sériového portu, napájení bude zajištěno z vnějšího zdroje. Hardwarová část bude řešena vhodným mikrokontrolérem a přídavnými obvody. Musí být zajištěna ochrana proti poškození (ochrana vstupů před přepětím, ochrana proti zkratu, atp.). Ovládání bude řešeno programem ve vývojovém prostředí C++ Builder. Naprogramování proběhne pomocí hotového JEDEC souboru, který bude vytvořen pomocí běžných nástrojů.
Klíčová slova GAL16V8, programovatelná logická pole, programátor, programování C++ builder
Abstract Create a functional model of a dedicated programmer of GAL16V8 circuits. Connecting to a computer will be addressed via the serial port, power will be provided from an external source. The hardware part will be dealt with appropriately microcontroller and auxiliary circuits. They must be protected against damage (inputs against overvoltage protection, short circuit protection, etc..). Control program will be created in the development environment C++ Builder. Programming will be done using JEDEC file that will be created using common tools.
Key words GAL16V8, programmable logic array, programmer, C++ builder programming
Prohlašuji, že předložená bakalářská práce je původní a zpracoval/a jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil/a autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ. Byl/a jsem seznámen/a s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že souhlasím s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom/a toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutí licence. V Jihlavě dne
............................................... Podpis
Poděkování Na tomto místě bych rád poděkoval svému vedoucímu práce Ing. Bc. Davidu Matouškovi za poskytnutí tématu k vytvoření bakalářské práce a za všemožnou pomoc při jeho zpracovávání. Dále bych rád poděkoval svojí rodině za veškerou podporu a za všechna omezení a nepohodlí zapříčiněná mým studiem. Nejvíce bych chtěl poděkovat svojí úžasné manželce, bez které bych se až k napsání bakalářské práce nikdy nedostal.
Obsah 1. Úvod..............................................................................................................................8 1.1. Motivace................................................................................................................8 1.2. Současný stav.........................................................................................................8 1.3. Analýza zadání.......................................................................................................9 2. Návrh fyzického zařízení.............................................................................................10 2.1. Parametry obvodu GAL16V8..............................................................................10 2.1.1. Historie programovatelných obvodů..............................................................10 2.1.2. Co jsou to programovatelné obvody typu GAL.............................................10 2.1.3. Typy a značení obvodů GAL16V8................................................................12 2.1.4. Zvolený typ obvodu GAL16V8 a jeho architektura.......................................12 2.1.5. Význam vývodů obvodu GAL16V8 v režimu programování........................13 2.1.6. Struktura konfigurační EEPROM obvodu GAL16V8...................................14 2.1.7. Datasheet obvodu GAL16V8.........................................................................14 2.2. Algoritmy pro práci s obvodem GAL16V8.........................................................16 2.2.1. Vložení obvodu GAL16V8 do patice programátoru......................................16 2.2.2. Připojení napájení k obvodu GAL16V8.........................................................16 2.2.3. Inicializace obvodu GAL16V8......................................................................16 2.2.4. Načtení programovací značky obvodu GAL16V8.........................................16 2.2.5. Vymazání obvodu GAL16V8........................................................................16 2.2.6. Zápis dat do konfigurační EEPROM obvodu GAL16V8..............................17 2.2.7. Ověření správnosti zapsaných dat..................................................................17 2.2.8. Nastavení zabezpečovacího bitu....................................................................18 2.2.9. Odpojení napětí ze všech vývodů patice a vyjmutí obvodu GAL16V8.........18 2.3. Zvolený způsob řešení.........................................................................................19 2.3.1. Návrh plošného spoje programátoru..............................................................19 6
2.3.2. Schéma zapojení programátoru......................................................................21 2.3.3. Výkres plošného spoje...................................................................................22 2.3.4. Plánek osazení................................................................................................22 2.3.5. Seznam součástek...........................................................................................23 2.3.6. Návrh programu pro mikroprocesor Atmega16.............................................24 2.3.7. Výpis programu pro mikroprocesor Atmega16.............................................25 3. Návrh ovládacího programu pro počítač.....................................................................28 3.1. Testování programátoru GAL16V8 pomocí multimetru.....................................28 3.2. Načtení dat ze souboru JEDEC............................................................................29 3.3. Aplikace algoritmů pro práci s obvodem GAL16V8...........................................30 3.3.1. Výpis funkce pro čtení řádku EEPROM matice obvodu GAL16V8.............31 3.3.2. Výpis funkce pro zápis dat do řádku EEPROM matice obvodu GAL16V8. .32 3.4. Dokončení ovládacího programu.........................................................................34 3.5. Ovření funkčnosti.................................................................................................35 4. Závěr............................................................................................................................37 Seznam použité literatury................................................................................................38 Seznam obrázků...............................................................................................................39 Obsah přiloženého CD.....................................................................................................40
7
1. Úvod 1.1. Motivace Když jsem se ve třetím semestru studia setkal v předmětu Číslicové systémy s problematikou programovatelných polí GAL, byla to pro mě zcela nová zkušenost. Od programovatelných
polí
jsme
v dalších
semestrech
mikrokontrolerů, především ATmega644 a ovládání
přešli
k programování
různých periferií, ať už
připojených ke zmiňovaným mikrokontrolerům, nebo přímo k počítači. Když jsem v průběhu pátého semestru studia narazil mezi vypsanými tématy bakalářské práce na téma vytvořit funkční vzorek jednoúčelového programátoru obvodů GAL16V8, příliš jsem neváhal. Tím spíše, že jsem již zpracovával pro předmět „Návrh plošných spojů“ návrh podobného plošného spoje, který se dal s drobnými úpravami použít i pro tento účel. Zadané téma v sobě ovšem kromě vyrobení fyzické součástky zahrnuje také vytvoření jednoduchého vývojového kitu v programu C++ builder.
1.2. Současný stav V současnosti existuje ve světě několik výrobců zařízení, sloužících k programování obvodů typu GAL. Jedná se například o značky Atmel, Xeltec, Altera, Lattice, Genius. Ceny vyráběných zařízení se pohybují od cca 75 až do několika tisíc dolarů. Tato profesionálně vyráběná zařízení v sobě kombinují několik funkcí. Kromě již zmíněného programování obvodů typu GAL umožňují naprogramovat většinu sériově vyráběných programovatelných obvodů a pamětí, umožňují též testovat jejich funkčnost, stejně jako umožňují testovat funkčnost řady dalších sériově vyráběných integrovaných obvodů. Součástí dodávky je kromě samotného fyzického zařízení, v dnešní době již většinou určených pro připojení přes USB rozhraní počítače, také vybavení programové. Kromě samotných ovladačů zařízení pro příslušný operační systém počítače, je k dispozici také více či méně sofistikované uživatelské rozhraní a vývojové prostředí.
8
Jako příklad bych zde uvedl jeden z nejlacinějších nalezených programátorů s označenícm Genius G540. Dle informací z manuálu a recenzí uživatelů toto zařízení umožňuje testování funkčnosti integrovaných obvodů TTL CMOS (74xx a 4xxx, programování obvodů EEPROM a FLASH (řady 28C, 28F, 29F, 24xx), programování MCU (např. Atmel 89C2051 a 89C4051), programování a čtení obvodů GAL (např. nejčastější typy 22V10 a 16V8) a programování klasických EPROM pamětí (2716 – 271001) [3] [4] [5]. Kromě nabídky profesionálních zařízení je na Internetu k dispozici řada různých návodů a schémat, podle kterých je možné vyrobit potřebné zařízení i amatérsky doma. Za všechny bych zde uvedl odkaz na zařízení připojitelné k počítači pomocí paralelního portu: http://www.hw.cz/Teorie-a-praxe/Konstrukce/ART644-GALblast---ProgramatorGALu.html
1.3. Analýza zadání Z názvu práce jasně vyplývá rámec, kterému se budu věnovat. Cílem bude vytvořil fyzické zařízení, schopné přijmout pomocí sériového portu předem připravený program z počítače a uložit jej do paměti obvodu GAL16V8. Pro návh fyzického zařízení je třeba se seznámit s parametry obvodu GAL16V8, s funkcí jednotlivých vývodů, úrovněmi pacovních napětí a s algoritmy připojení a odpojení programovaného obvodu a s algoritmy čtení a zápisu dat do paměti programovaného obvodu. Dále je třeba vytvořit programové vybavení, schopné načíst v počítači předem připravený program ze souboru typu JEDEC, zpracovat jej do formy vhodné k přenosu přes sériový port, navázat spojení s vytvořeným zařízením a předat mu příslušný program. Pro vytvoření potřebného programového vybavení je třeba získat detailní znalost struktury souboru typu JEDEC, ze kterého budou data pro programovaný obvod získávána. Obsahem práce nebude teorie tvorby programů pro obvod GAL16V8.
9
2. Návrh fyzického zařízení 2.1. Parametry obvodu GAL16V8 2.1.1. Historie programovatelných obvodů První programovatelné elektronické součástky byly zkonstruovány začátkem 70 let 20. století. Jednalo se jednak o programovatelné paměti PROM (později EPROM a EEPROM), které ovšem nebyly určeny pro programování logických funkcí, jednak tzv. FPLA (Field Programmable Logic Array) obvody, které byly ovšem drahé a pomalé. Z těchto FPLA obvodů se koncem 70. let 20. století vyvinuly tzv. PAL (Programmable Array Logic) obvody s programovatelnou maticí logických součinů a fixní maticí logických součtů, dosahující podstatně vyšších rychlostí. Do této kategorie se řadí též programovatelné obvody typu GAL (Generic Array Logic). Zlepšující se technologie umožnily v polovině 80. let 20. století skládání více matic do jednoho pouzdra v takzvaných CPLD (Complex Programmable Logic Device) obvodech a postupně i vznik tzv. FPGA (Field Programmable Gate Array) obvodů s nejobecnější strukturou. [8]
2.1.2. Co jsou to programovatelné obvody typu GAL Obvody typu GAL jsou univerzální reprogramovatelné součástky obsahující programovatelnou matici logických součinů (AND) a pevnou maticí logických součtů (OR), které umožnují vytvářet libovolné uživatelsky definované kombinační a sekvenční funkce. Obvody GAL se skládají ze dvou hlavních stavebních částí: •
programovatelné pole AND hradel
•
konfigurovatelné logické výstupní makrobuňky OLMC (Output Logic Macrocell)
Obvody GAL mají dva základní typy signálových vývodů - vstupy a výstupy Vstupy jsou přímo zavedeny do programovatelné matice AND a jejich funkce nemůže být uživatelem změněna. Všechny vstupy jsou shodné, v každé definiční rovnici pro matici AND je možno použít libovolný vstupní signál v přímé nebo negované formě. 10
Výstupy mohou být použity ve více funkcích: •
přímý kombinační výstup, jehož funkce je zadána logickou rovnicí. Lze uživatelsky nastavovat stav vysoké impedance.
•
výstup registru D. Vstupní funkce registru je definována logickou rovnicí. Lze ovládat vysokoimpedanční stav ( /OE ).
•
jako další rozšiřující vstupní pin do matice AND
Obrázek 1: Vnitřní schéma obvodu GAL16V8 [15] 11
Výběr funkce výstupního pinu automaticky provádí překladač na základě definičních rovnic, příp. klíčových slov. Pokud je pin použit jen jako vstupní proměnná v logických rovnicích, je odpovídající OLMC buňka zablokována. Pokud je pin použit ve funkci výstupu, je současně také zaveden zpět do matice AND, kde může být použit pro definici dalších rovnic nebo i pro vlastni definici. Naprogramovaný obvod GAL je možné elektricky vymazat a opět naprogramovat. Navíc díky vysoké flexibilitě je možno jedním obvodem GAL emulovat řadu obvodů typu PAL. [7] [9] [10]
2.1.3. Typy a značení obvodů GAL16V8 Jelikož se vyrábí více typů obvodů GAL16V8 s různými vlastnostmi, uvedu zde krátký návod, jak se orientovat ve značení těchto typů. Na každém obvodu je označení, skládající se ze znaků před pomlčkou, pomlčky a znaků za pomlčkou: XXXXXXXX-XX X X X Znaky před pomlčkou označují typ obvodu. Existují 4 typy obvodu GAL16V8. Jsou to GAL16V8A, GAL16V8B, GAL16V8C a v dnešní době nejběžnější GAL16V8D. První 2 znaky za pomlčkou udávají zpoždění obvodu v ns. Třetí znak udává spotřebu obvodu, L pro nízkou a Q pro čtvrtinovou. Čtvrtý znak udává typ pouzdra. Obvod GAL16V8 se vyrábí ve třech variantách pouzder, v pouzdru typu DIP, pouzdru typu SOIC a typu PLCC. Všechny typy pouzder obsahují 20 vývodů a vnitřní architektura i funkce jednotlivých vývodů jsou totožné. Poslední znak udává provedení obvodu. Pokud není, jedná se o komerční provedení, I znamená, že se jedná o průmyslové provedení.
2.1.4. Zvolený typ obvodu GAL16V8 a jeho architektura Pro svou práci jsem si zvolil obvod GAL16V8D v provedení DIP. Obvod obsahuje: •
vstup pro připojení hodinového signálu CLK, který lze případně použít jako vstup
•
8 vývodů, které lze použít pouze jako vstupy
•
vývod pro připojení země 12
•
vývod pro vstup řízení třístavových oddělovačů výstupů OE, který lze případně použít jako vstup
•
8 vývodů, které lze použít buď jako vstupy, nebo jako výstupy synchronní, nebo asynchronní s hodinovým signálem CLK
•
vývod pro připojení napájení VCC
Obrázek 2: Schéma obvodu GAL16V8D [14]
2.1.5. Význam vývodů obvodu GAL16V8 v režimu programování Vývody 1, 13, 14, 15, 16 a 17, označené V IL, nejsou při programování obvodu GAL16V8 aktivní, je však třeba je přes vhodný rezistor připojit na zem, aby se zabránilo poškození obvodu vlivem statické elektřiny. Vývod 2, označený EDIT, slouží pro připojení programovacího napětí. Pro programování je třeba přivést na tento vývod napětí 12V. Vývody 18, 3, 4, 5, 6 a 7, označené RAx jsou určeny pro vystavení adresy řádku konfigurační EEPROM, na který se mají zapsat data, nebo ze kterého se mají přečíst data. Vývod 8, označený SCLK, slouží pro potvrzování datových bitů při zápisu nebo čtení dat. Vývod 9, označený SDIN, má funkci vstupu. Na tomto vývodu jsou vystavovány jednotlivé datové bity pro zápis dat. Vývod 10, označený GND, je zem. Vývod 11, označený STB, slouží pro potvrzování adresy řádku při zápisu nebo čtení dat. 13
Vývod 12, označený SDOUT, má funkci výstupu. Na tomto vývodu jsou vystavovány jednotlivé datové bity, čtené z konfigurační EEPROM. Vývod 19, označený P/V, slouží pro nastavení módu čtení ( P/V=0 – verify), nebo zápisu ( P/V=1 – programme) dat. Vývod 20, označený VCC, je napájení obvodu GAL16V8. Na tento vývod je třeba přivést napětí 5V.
2.1.6. Struktura konfigurační EEPROM obvodu GAL16V8 Konfigurační EEPROM obvodu GAL16V8 obsahuje 64 řádků, číslovaných od 0 a rozdělených do skupin podle významu uložených dat. Prvních 32 řádků konfigurační matice (číslování 0-31), 64 bitů na každém řádku, obsahuje konfiguraci propojek programovatelné AND matice. Další řádek (32) obsahuje opět 64 bitů a slouží jako elektronická značka (User Electronic Signature – UES) a slouží k označení obvodu. Řádky 33-59 jsou vyhrazeny a nelze na ně zapisovat. Každý řádek obsahuje 64 bitů. Speciální význam má řádek 58, kde je uložena programovací značka (Programmers Electronic Signature – PES), která obsahuje informace týkající se programování. Řádek 60 je dlouhý 82 bitů a obsahuje konfiguraci obvodu. Řádky 61-63 jsou dlouhé vždy 1 bit, významné pro programování jsou bity na řádcích 61 a 63. Na řádku 61 je bezpečnostní bit, který, pokud je nastaven, zakazuje čtení konfigurace obvodu. Po každém mazání obvodu je automaticky nastaven na 0. Řádek 63 obsahuje mazací bit. Pokud sem zapíšeme 1, vymažeme obsah celé konfigurační EEPROM obvodu, kromě informací uložených na řádku 58 (PES). Teprve po smazání je možné obvod opět naprogramovat.
2.1.7. Datasheet obvodu GAL16V8 Každý výrobce integrovaných obvodů vydává ke svým výrobkům tzv. datasheet, kde jsou uvedeny technické parametry konkrétního integrovaného obvodu. Na Internetu existuje několik velkých databází, odkud se tyto datasheety dají získat. Já jsem pro získání datasheetu k obvodu GAL16V8 použil Internetovou databázi na adrese http://www.alldatasheet.com/view.jsp?Searchword=GAL16V8 V datasheetu lze najít jak mezní údaje pro napětí, tak doporučené pracovní podmínky a dynamické charakteristiky. 14
Mezní údaje: napájecí napětí Vcc: -0,5V - +7V vstupní napětí: -2,5V – Vcc+1V Doporučené pracovní podmínky: provozní teplota: 0-75 °C napájecí napětí: 4,75V - 5,25V Vstupní napětí pro: log 0: -0,5V – 0,8V log 1: 2,0V – Vcc+1V Dynamické parametry: zpoždění mezi náběžnými hranami různých signálů: ~10ns maximální frekvence: ~40MHz V datasheetu se bohužel neudávají hodnoty pro programovací napájení EDIT. Ty jsem našel ve zdroji [12] a [13] str.136. Pro čtení je hodnota programovacího napájení EDIT 12V, pro zápis se hodnota papájecího napětí EDIT pohybuje v rozmezí 14V – 16,5V v závislosti na hodnotách uložených na 58. řádku (PES) konfigurační EEPOM matice obvodu.
15
2.2. Algoritmy pro práci s obvodem GAL16V8 2.2.1. Vložení obvodu GAL16V8 do patice programátoru Před vložením obvodu GAL16V8 do patice programátoru je třeba zajistit, aby se napětí na všech vývodech patice lišilo maximálně o 0,7V. Toto se zajistí logickým odpojením všech signálů a napájení a navíc fyzickým propojením vývodů přes snižovací odpory (vhodná hodnota je například 10kΩ) na zem.
2.2.2. Připojení napájení k obvodu GAL16V8 Po vložení obvodu GAL16V8 do patice programátoru je třeba nejprve připojit napájení obvodu VCC a teprve potom je možné připojit programovací napájení 12V na vývod EDIT a přepnout tím obvod GAL16V8 do programovacího módu.
2.2.3. Inicializace obvodu GAL16V8 Po připojení napájení je třeba nejprve nastavit všechny datové vstupy do neaktivního stavu, tzn. RA0-RA5=0, SCLK=0, SDIN=0, STB=1, P/V=0.
2.2.4. Načtení programovací značky obvodu GAL16V8 programovací značka obvodu - PES (Programmers Electronic Signature) 1. Na vývody RA0-RA5 nastavíme adresu řádku konfigurační EEPROM, obsahující PES informace (58=0b111010) při nastaveném příznaku pro čtení dat (P/V=0) a hodnoty SCLK=0 a STB=1 do neaktivního stavu. 2. Nastavením signálu STB=0 a opětovným nastavením STB=1 potvrdíme vystavenou adresu řádku a obsah požadovaného řádku se načte do registru PISO. 3. Nastavení signálu SCLK=1 a opětovné nastavení SCLK=0 vystaví hodnotu 1 bitu registru PISO na vývod SDOUT. Toto opakujeme, dokud nejsou postupně získány všechny bity z registru PISO. Jelikož se v této práci zabývám jednoúčelovým programátorem pouze pro obvody typu GAL16V8, je možné tento krok vynechat.
2.2.5. Vymazání obvodu GAL16V8 Vymazání obvodu se provede zapsáním log. 1 na 63. řádek konfigurační EEPROM: 1. Zkontrolujeme správnou hodnotu programovacího napětí EDIT 12V. 2. Nastavíme příznak zápisu dat ( P/V=1), hodnoty SCLK=0 a STB=1 do neaktivního stavu a na vývod SDIN vystavíme hodnotu, kterou chceme zapsat do PISO registru (SDIN=1). 16
3. Nastavení signálu SCLK=1 a opětovné nastavení SCLK=0 zapíše hodnotu z vývodu SDIN do registru PISO. 4. Na vývody RA0-RA5 nastavíme adresu odpovídajícího řádku konfigurační EEPROM (63=0b111111). 5. Nastavením signálu STB=0 a opětovným nastavením STB=1 potvrdíme vystavenou adresu řádku a obsah registru PISO je zapsán na tento řádek. 6. Změníme příznak zápisu dat opět na příznak čtení dat (P/V=0).
2.2.6. Zápis dat do konfigurační EEPROM obvodu GAL16V8 1. Zkontrolujeme správnou hodnotu programovacího napětí EDIT 14V. 2. Nastavíme příznak zápisu dat ( P/V=1) a hodnoty SCLK=0 a neaktivního stavu.
STB=1 do
3. Na vývod SDIN vystavíme hodnotu, kterou chceme zapsat do PISO registru. 4. Nastavení signálu SCLK=1 a opětovné nastavení SCLK=0 zapíše hodnotu z vývodu SDIN do registru PISO. Kroky 2 a 3 opakujeme, dokud nejsou v registru PISO zapsaná všechna potřebná data. 5. Na vývody EEPROM.
RA0-RA5 nastavíme adresu odpovídajícího řádku konfigurační
6. Nastavením signálu STB=0 a opětovným nastavením STB=1 potvrdíme vystavenou adresu řádku a obsah registru PISO je zapsán na tento řádek. Vracíme se k bodu 2 a celý postup opakujeme postupně pro všechny potřebné řádky (032 a 60). 7. Změníme příznak zápisu dat opět na příznak čtení dat (P/V=0).
2.2.7. Ověření správnosti zapsaných dat Ověření správnosti zapsaných dat lze provést jejich přečtením a porovnáním se zapisovanými daty: 1. Nastavíme příznak pro čtení dat (P/V=0) a hodnoty SCLK=0 a STB=1 do neaktivního stavu. 2. Na vývody EEPROM.
RA0-RA5 nastavíme adresu požadovaného řádku konfigurační
3. Nastavením signálu STB=0 a opětovným nastavením STB=1 potvrdíme vystavenou adresu řádku a obsah požadovaného řádku se načte do registru PISO. 17
4. Nastavení signálu SCLK=1 a opětovné nastavení SCLK=0 vystaví hodnotu 1 bitu registru PISO na vývod SDOUT, odkud ji načteme do paměti ovládacího programu programátoru. Toto opakujeme, dokud nejsou postupně získány všechny bity z registru PISO. Vracíme se k bodu 2 a celý postup opakujeme postupně pro všechny potřebné řádky (032 a 60).
2.2.8. Nastavení zabezpečovacího bitu Pokud chceme ochránit naprogramovaný obvod GAL16V8 před přečtením (a případným zkopírováním), nastavíme zabezpečovací bit tak, že zapíšeme do konfigurační EEPROM na řádek 61 hodnotu 1. Postup je totožný s postupem při mazání obvodu GAL16V8 (viz výše).
2.2.9. Odpojení napětí ze všech vývodů patice a vyjmutí obvodu GAL16V8 Nejprve odpojíme napětí ze všech datových vývodů patice, tzn. RA 0-RA5=0, SCLK=0, SDIN=0, STB=0, P/V=0. Potom odpojíme napájení na vývodu EDIT. Nakonec odpojíme napájení na vývodu VCC. Nyní je na všech vývodech patice nulové napětí, takže můžeme obvod GAL16V8 vyjmout a použít v aplikaci, pro kterou jsme jej programovali.
18
2.3. Zvolený způsob řešení Při návrhu programátoru jsem vycházel z materiálů k předmětu Návrh plošných spojů a z [1] str. 49-53, 136-138, [2], [6] a [10] str 76-92, 121-133, 427-428
2.3.1. Návrh plošného spoje programátoru V průběhu studia jsem se seznámil s programováním 8 bitového mikroprocesoru Atmega16, jehož pracovní napětí 0V a 5V odpovídá pracovním parametrům obvodu GAL16V8. Proto jsem se rozhodl použít pro konstrukci programátoru tento mikroprocesor, který bude nastavovat piny adresy, piny řídící a bude ovládat přívod napájecího a programovacího napětí. V obvodu programátoru je potřeba získat 3 úrovně napájecího napětí. 5V pro napájení obvodu GAL16V8 a pro napájení samotného mikroprocesoru, dále 12V programovací napětí pro čtení dat z obvodu GAL16V8 a 14V programovací napětí pro zápis dat do obvodu GAL16V8. Pro přívod napájecího napětí do obvodu programátoru jsem se rozhodl použít starší napájecí adaptér od laptopu s výkonem 65W a úrovní napájecího napětí 20V. Pro získání napájecího napětí VCC=5V, resp. programovacího napětí EDIT=12V jsem do obvodu programátoru zapojil stabilizátor napětí 5V, resp. 12V. Přívod obou úrovní napětí k obvodu GAL16V8 je otevírán a uzavírán bipolárním tranzistorem, který je ovládán pomocí 2 vývodů mikroprocesoru. Problémem bylo získání programovacího napětí 14V. Toto jsem vyřešil zapojením diody s úbytkem 2V mezi nulovou úroveň obvodu programátoru a nulovou úroveň stabilizátoru napětí 12V a paralelním zapojením bipolárního tranzistoru k této diodě, který je ovládán jedním vývodem mikroprocesoru. Při uzavřeném tranzistoru prot0k8 proud tranzistorem, dioda je zkratována, k úbytku napětí na ní nedochází a na výstupu stabilizátoru napětí 12V je vzhledem k nulové úrovni programátoru napětí 12V. Pokud je tranzistor otevřen, protéká proud diodou, na které dojde k úbytku napětí 2V, takže na výstupu stabilizátoru napětí 12V je vzhledem k nulové úrovni programátoru napětí 14V. Kromě 3 vývodů mikroprocesoru ovládajících přívod napájecího napětí VCC=5V a programovacích napětí EDIT=12V, resp. EDIT=14V, je pro programování obvodu 19
GAL16V8 třeba 6 vývodů pro nastavení adresy, 4 vývody řídící – SCLK, SDIN, P/V, STB a 1 vývod pro čtení výstupu obvodu GAL16V8 SDOUT. Kvůli co nejsnadnější výrobě základní desky pro programátor jsem u mikroprocesoru využil 7. pin portu D pro čtení dat z obvodu GAL16V8, všechny piny portu C a dva nejvyšší piny portu A pro nastavení adresy a řídících vývodů obvodu GAL16V8, 5. pin portu A pro volbu úrovně programovacího napětí (12V, resp. 14V) a piny 3 a 4 portu A pro ovládání přívodu programovacího napětí EDIT, resp. Napájecího napětí VCC. Komunikace se sériovým portem počítače je řešena klasicky pomocí integrovaného obvodu MAX232 propojeným na RxD/TxD vývody mikroprocesoru. Pro mikroprocesor Atmega16 je potřeba napsat program, který bude přijímat data z počítače prostřednictvím sériového portu, přijatá data zpracuje a na jejich základě nastaví příslušné vývody patice s vloženým obvodem GAL16V8. Dále bude odečítat stav na vývodu SDOUT obvodu GAL16V8 a na základě přijatých dat z počítače a stavu vývodu SDOUT obvodu GAL16V8 bude prostřednictvím sériového portu odesílat příslušná hlášení do počítače. Plošný spoj programátoru byl navržen v programu Eagle. Po vyrobení plošného spoje jsem jej osadil příslušnými součástkami, zapájel a
následně pomocí multimetru
proměřil, že spoje, které mají být vodivé opravdu vodivé jsou, body, které nemají být vodivě propojeny opravdu propojeny nejsou a že všechny pájené spoje funkční.
20
2.3.2. Schéma zapojení programátoru
Obrázek 3: Schéma zapojení programátoru GAL16V8 21
2.3.3. Výkres plošného spoje
Obázek 4: Výkres plošného spoje
2.3.4. Plánek osazení
Obrázek 5: Plánek osazení plošného spoje 22
2.3.5. Seznam součástek Part
Value
Device
Package
Library
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 D1 D2 IC1 IC2 IC3 IC4 IC5 LED1 Q1 Q2 Q3 Q4 Q5 Q6 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R18 R19 R20 R21 X1 X2
E470M/25V E22V/16V E22V/16V CK 100N CK 100N CK 100N CK 100N E22V/16V E22V/16V E22M/16V CK 100N CK 100N CK 100N 1N4007 1N4148 7812 7805 MAX232 ATMEGA16-16PU
CPOL-EUE5-13 CPOL-EUE2.5-5 CPOL-EUE2.5-5 C-EU050-025X075 C-EU050-025X075 C-EU050-025X075 C-EU050-025X075 CPOL-EUE2.5-5 CPOL-EUE2.5-5 CPOL-EUE2.5-5 C-EU050-025X075 C-EU050-025X075 C-EU050-025X075 1N4004 1N4148DO35-7 78XXL 78XXL MAX220CPE ATMEGA644-10PU DIL20 LED5MM BC548 CRYSTALHC18U-V BC558A BC548 BC548 BC558A R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 R-EU_0207/10 AK500/2 F09H
E5-13 E2,5-5 E2,5-5 C050-025X075 C050-025X075 C050-025X075 C050-025X075 E2,5-5 E2,5-5 E2,5-5 C050-025X075 C050-025X075 C050-025X075 DO41-10 DO35-7 78XXL 78XXL DIL16 DIL40 DIL20 LED5MM TO92-EBC HC18U-V TO92-EBC TO92-EBC TO92-EBC TO92-EBC 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 0207/10 AK500/2 F09H
rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl diode diode v-reg v-reg maxim atmel ic-package led transistor-npn crystal transistor-pnp transistor-npn transistor-npn transistor-pnp rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl rcl con-ptr500 con-subd
BC548 11,059MHz BC558A BC548 BC548 BC558A RR 100K RR 1K RR 1K RR 10K RR 100K RR 1K RR 100K RR 1K RR 1K RR 10K RR 10K RR 100K RR 1K RR 100K RR 10K RR 10K RR 10K RR 10K RR 10K RR 10K RR 10K ARK500/2 CAN9Z90
23
2.3.6. Návrh programu pro mikroprocesor Atmega16 Při návrhu programu pro mikroprocesor Atmega16 se nabízely 2 možnosti, jak postupovat. První možnost byla vytvořit komplexní program, který by v sobě obsahoval veškeré potřebné algoritmy pro programování obvodu GAL16V8 a z počítače by přijímal pouze základní požadavky a data. Tato možnost se mi zpočátku jevila jako výhodná, neboť minimalizuje komunikaci s počítačem prostřednictvím sériového portu a umožňuje využít potenciál mikroprocesoru Atmega16. Brzy jsem však tuto možnost zavrhl, neboť bylo obtížné takový program účinně otestovat a jakákoliv úprava kódu programu vyžadovala vyjmutí mikroprocesoru Atmega16 z obvodu programátoru, jeho vložení do zařízení pro programování mikroprocesorů Atmega, zapsání nového kódu programu, opětovné vyjmutí mikroprocesoru z programovacího zařízení a vložení do obvodu programátoru GAL16V8. Rozhodl jsem se tedy jít druhou cestou, a to cestou co nejjednodušího programu pro mikroprocesor Atmega16. Tento program jsem navrhl tak, abych přímo z počítače dokázal nastavovat jednotlivé vývody prostřednicvím komunikace po sériovém portu. Tento způsob sice zvyšuje potřebu komunikace mezi programátorem GAL16V8 a počítačem prostřednictvím sériového portu a poněkud degraduje funkci mikroprocesoru Atmega16 v obvodu programátoru GAL16V8, je však jednoduchý na otestování funkčnosti a po zavedení do mikroprocesoru Atmega16 nevyžaduje žádné další úpravy kódu programu. Nejprve jsem se musel rozhodnout, jakým způsobem bude komunikovat počítač s mikroprocesorem Atmega16. Jelikož mikroprocesor Atmega16 dokáže komunikovat buď po osmi, nebo po devíti bitech, zatímco vývodů pro ovládání je dohromady 13, musel jsem pro komunikaci použít 2x8 bitů, tedy 2 bajty. Prvních 8 bitů jsem vyhradil pro posílání adresy, která má pro obvod GAL16V8 6 bitů, druhých 8 bitů jsem vyhradil pro ovládání 4 vývodů řídících (P/V, SCLK, SDIN a STB) a 3 vývodů pro ovládání přívodu napětí (VCC, EDIT 12V a EDIT 14V). Nejvyšší bit jsem použil pro rozlišení,
24
zda zasílaná data jsou bitem nesoucím informaci o adrese (0), nebo o nastavení řídících vývodů (1). Protože při nejvyšším bitu nastaveném na 0 využívá adresa pouze nejnižších 6 bitů v komunikačním bajtu, zůstává nevyužitý 7. bit, který jsem se rozhodl použít pro identifikaci programátoru GAL16V8. Pokud tedy mikroprocesor obdrzí z počítače v komunikačním bajtu číslo větší než 127, nastaví řídící vývody, přečte stav vývodu SDOUT a pošle přečtený bit do počítače. Pokud mikroprocesor obdrzí z počítače v komunikačním bajtu číslo menší než 64, použije toto jako adresu. Pokud mikroprocesor obdrzí z počítače v komunikačním bajtu číslo z intervalu 64-127, pošle zpět do počítače identifikační bajt.
2.3.7. Výpis programu pro mikroprocesor Atmega16 #define __AVR_ATmega16__ 1 #include
int main() { unsigned char data; // konfigurace portu mikroprocesoru DDRA = 0b11111000; DDRC = 0b11111111; DDRD = 0b00000010; // povoleni přijímání a vysílání dat UCSRB = (1<
// tělo programu while(1) { if(UCSRA&(1<
// ... načtu přijatá data do proměnné data
if(data&128)
// pokud nejvyšší bit je 1 ...
{ PORTA=(PORTA&0b10000000)|(data&0b01111000); // ... nastavím port A ... PORTC=(PORTC&0b11111000)|(data&0b00000111); // ... nastavím port C ... UDR=PIND>>7; // ... pošlu nazpět hodnotu přečtenou na SDOUT } else if(data==127) { PORTA=0b10000000; PORTC=0b11111000; UDR=PORTC; } else if(data&64) UDR=2; hodnotu 2
// pokud 2 nejvyšší bity jsou 01, pošlu nazpět
else jedná se o adresu
// pokud 2 nejvyšší bity jsou 00,
{ if(data&32) PORTC=PORTC|0b00001000; zbytek PC neměnit
// pokud RAG5=1 nastav PC3=1,
else PORTC=PORTC&0b11110111; PC3=0, zbytek PC neměnit if(data&16) PORTC=PORTC|0b00010000; zbytek PC neměnit 26
// pokud RAG5=0 nastav
// pokud RAG4=1 nastav PC4=1,
else PORTC=PORTC&0b11101111; PC4=0, zbytek PC neměnit if(data&8) PORTC=PORTC|0b00100000; zbytek PC neměnit
// pokud RAG3=1 nastav PC5=1,
else PORTC=PORTC&0b11011111; PC5=0, zbytek PC neměnit if(data&4) PORTC=PORTC|0b01000000; zbytek PC neměnit
// pokud RAG2=0 nastav
// pokud RAG1=1 nastav PC7=1,
else PORTC=PORTC&0b01111111; PC7=0, zbytek PC neměnit if(data&1) PORTA=PORTA|0b10000000; zbytek PC neměnit
// pokud RAG3=0 nastav
// pokud RAG2=1 nastav PC6=1,
else PORTC=PORTC&0b10111111; PC6=0, zbytek PC neměnit if(data&2) PORTC=PORTC|0b10000000; zbytek PC neměnit
// pokud RAG4=0 nastav
// pokud RAG1=0 nastav
// pokud RAG0=1 nastav PA7=1,
else PORTA=PORTA&0b01111111; PA7=0, zbytek PC neměnit
// pokud RAG0=0 nastav
UDR=(data<<1)|(PIND>>7); // tady je v podstatě jedno, co pošlu zpátky, tak posílám adresa*2+SDOUT }
} if(UCSRA&(1<
27
3. Návrh ovládacího programu pro počítač Základem ovládacího programu je správné nastavení komunikace s programátorem GAL16V8 pomocí sériového portu a korektní ukončení všech činností při ukončení programu. Nastavení komunikace se provádí hned při startu programu, kdy je načten seznam všech dostupných sériových portů počítače, provede se kontrola zda a na kterém sériovém portu je programátor GAL16V8 připojen a tato informace je zobrazena pro uživatele. Pokud je programátor GAL16V8 na některém sériovém portu detekován, tento port je automaticky nastaven pro komunikaci. Při ukončení programu jsou automaticky provedeny kroky ke korektnímu odpojení programátoru GAL16V8. V první řadě jsou deaktivovány řídící a adresové vývody patice GAL16V8. Dále je odpojeno napájení EDIT od patice GAL16V8. Naposledy je odpojeno pracovní napájení VCC od patice GAL16V8. Tím dojde ke koretnímu odpojení patice GAL16V8. Nakonec je uzavřen sériový port počítače a ovládací program je ukončen. Při návrhu ovládacího programu jsem dále postupoval v několika krocích, které podrobněji rozepíši v následujících odstavcích. Nejprve jsem ovládací program použil pro otestování správné funkce programátoru GAL16V8 bez připojeného obvodu GAL16V8. Následně jsem do ovládacího programu přidal proceduru, která načte soubor ve formátu JEDEC a převede jej na data vhodná pro přenos do programátoru GAL16V8. V dalším kroku jsem do ovládacího programu přidal základní algoritmy pro práci s obvodem GAL16V8. Nakonec jsem doprogramoval část, které vezme data, získaná z JEDEC souboru a pomocí příslušných algoritmů je zapíše do programovaného obvodu GAL16V8.
3.1. Testování programátoru GAL16V8 pomocí multimetru Po úspěšném vyrobení, osazení a proměření obvodu programátoru GAL16V8 a po instalaci řídícího programu pro mikroprocesor Atmega16, bylo třeba ověřit, že vše funguje dle předpokladů. Rozhodl jsem se ověřit funkčnost nejprve pomocí multimetru bez připojeného obvodu GAL16V8, aby v případě špatné funkce neyl obvod GAL16V8 28
zničen. V ovládacím programu jsem vytvořil 2 pole, jedno pro zadání čísla dekadicky a druhé pro zadání čísla ve dvojkové soustavě a ke každému poli jsem vytvořil tlačítko, pomocí kterého bylo číslo z příslušného pole odesláno pomocí sériového portu do programátoru GAL16V8. Dále jsem vytvořil okno pro zobrazování informací, kde lze zjistit aktuální stav, data posílaná do programátoru GAL16V8 a data z tohoto programátoru přijímaná. Tímto způsobem jsem byl schopen ovládat jednotlivé řídící i adresové vývody patice obvodu GAL16V8 a ověřit, že reálné napětí na jednotlivých vývodech zcela odpovídá napětí, které na vývodech mělo být teoreticky.
3.2. Načtení dat ze souboru JEDEC Textový tvar JEDEC souboru vychází z implementace „JEDEC Standard No.3: Stadard Data Transfer Format Between Data Preparation System and Programmable Logic Devoce Programmer“ a má následující strukturu: 1. Příznak začátku souboru – znak {0x02} – toto pole je povinné 2. Identifikační pole – libovolný text ukončený znakem {0x2A} (hvězdička) 3. Pole přiřazení názvů pinů - text s příslušnou strukturou ukončený znakem {0x2A} 4. Pole názvu typu PLD - text s příslušnou strukturou ukončený znakem {0x2A} – toto pole je povinné 5. Pole bezpečnostního bitu - "G1*" (nastaven) / "G0*" (nenastaven) 6. Pole velikosti programovatelné paměti - "QF" + počet bitů (dekadicky) + "*" 7. Pole počtu pinů - "QP" + počet pinů (dekadicky) + "*" 8. Pole hodnot prog. paměti - "L" + adresa (4 čísla dekadicky) + " " + posloupnost znaků 0/1, které budou do uvedené adresy zapsány (implicitní hodnoty jsou 1) + "*" – toto pole je povinné 9. Ukončující pole - {03H} + celková kontrolní suma (4 čísla hexadecimálně) – toto pole je povinné 29
V závislosti na vývojovém systému mohou být v generovaném JEDEC souboru implementovány různé modifikace. [10] [11] Pro převod textového JEDEC souboru do formátu dat vhodného pro odeslání do programátoru GAL16V8 je nejprve vytvořena příslušná matice implicitních hodnot (pokud není některá hodnota v JEDEC souboru uvedena, bere se jako log1), odpovídající příslušným řádkům EEPROM obvodu GAL16V8 (32 řádků po 64 bitech a jeden řádek obsahující 80 bitů). Potom jsou čteny znaky ze souboru JEDEC a pokud je mezi daty nalezen znak 0, je zapsán na příslušné místo do matice implicitních hodnot. Tím jsou získána kompletní data pro zápis do obvodu GAL16V8. Pro kontrolu převáděných dat jsem do ovládacího programu přidal dvě textová pole, do jednoho je vypsán obsah JEDEC souboru, do druhého je vypsána aktualizovaná matice implicitních hodnot.
3.3. Aplikace algoritmů pro práci s obvodem GAL16V8 Detailní popis algoritmů pro práci s obvodem GAL16V8 jsem již uvedl dříve, zde se tedy zaměřím pouze na popis aplikace příslušných algoritmů do ovládacího programu. Nejprve jsem vytvořil 3 tlačítka pro korektní připojení a odpojení programátoru obvodu GAL16V8 a programovaného obvodu GAL16V8. Tlačítko nazvané Zapnout otevře sériový port pro komunikaci mezi počítačem a programátorem obvodu GAL16V8, nastaví všechny řídící a adresové vývody patice GAL16V8 do neaktivního stavu a odpojí napájecí napětí EDIT a VCC od patice GAL16V8, aby bylo možné vložit programovaný obvod GAL16V8 do patice programátoru. Tlačítko nazvané Inicializace přivede na vývod patice GAL16V8 pracovní napětí VCC, poté přivede na vývod patice GAL16V8 programovací napětí EDIT 12V. Tlačítko nazvané Konec nejprve nastaví všechny řídící a adresové vývody patice GAL16V8 do neaktivního stavu a odpojí od patice GAL16V8 programovací napětí EDIT. Poté odpojí od patice GAL16V8 i pracovní napětí VCC a uzavře Sériový port počítače. Dalším krokem bylo zajistit čtení dat z obvodu GAL16V8 a zápis dat do tohoto obvodu.Jelikož zápis i čtení probíhá po řádcích, rozhodl jsem se vytvořit funkci pro přečtení jednoho řádku dat z EEPROM matice obvodu GAL16V8 a funkci pro zápis jednoho řádku dat do EEPROM matice obvodu GAL16V8. Funkce pro čtení má jeden 30
parametr, kterým je adresa čteného řádku a návratová hodnota funkce je řetězec nul a jedniček obsahující přečtená data. Funkce pro zápis má parametry dva, jedním je adresa řádku, kam budou data zapsána a druhým parametrem je řetězec nul a jedniček obsahující zapisovaná data. V obou funkcích je aplikován příslušný algoritmus pro čtení, resp. zápis.
3.3.1. Výpis funkce pro čtení řádku EEPROM matice obvodu GAL16V8 UnicodeString TForm1::Precti_radek(int Adresa) { unsigned char Delka=82, x, OVLADANI=128, PV=64, VCC=16, EDIT12V=32+8, EDIT14V=8, SCLK=4, SDIN=2, STB=1; UnicodeString Data=""; if(Adresa < 60) Delka=64; else if(Adresa > 60) Delka=1; // 12V + STB - příprava ke čtení x=OVLADANI+VCC+EDIT12V+STB; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // Adresa - vystavím adresu řádku WriteFile(Port,&Adresa,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // 12V - vypnutím a zapnutím bitu STB potvrdím vystavenou adresu x=OVLADANI+VCC+EDIT12V; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // 12V + STB x=OVLADANI+VCC+EDIT12V+STB; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // smyčka pro přečtení bitů z celého řádku 31
while (Delka-- > 0) { // 12V + SCLK + STB ´- zapnutím a vypnutím bitu SCLK přečtu 1 bit z STDOUT x=OVLADANI+VCC+EDIT12V+SCLK+STB; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // 12V + STB x=OVLADANI+VCC+EDIT12V+STB; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); Data=Data+String(x); } return Data; } 3.3.2. Výpis funkce pro zápis dat do řádku EEPROM matice obvodu GAL16V8 void TForm1::Zapis_radek(int Adresa, UnicodeString Data) { unsigned char Delka=82, n=0, x, y, OVLADANI=128, PV=64, VCC=16, EDIT12V=32+8, EDIT14V=8, SCLK=4, SDIN=2, STB=1; if(Adresa < 60) Delka=64; else if(Adresa > 60) Delka=1; ListBox2->Items->Add("Zapisuji: Adresa="+String(Adresa)+" Data="+Data); // připojím napájení Vcc a programovací napětí EDIT 14V x=OVLADANI+VCC+EDIT14V; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // nastavím piny P/V a STB x=OVLADANI+VCC+EDIT14V+PV+STB; WriteFile(Port,&x,1,&p,NULL); 32
ReadFile(Port,&x,1,&p,NULL); // smyčka pro přenesení datových bitů celého řádku do registru PISO while (n < Delka) { // 14V + P/V + SDIN + STB - vystavím jeden bit dat pro přesun do redistru PISO if (Data[++n] == '0') y=0; else y=SDIN; x=OVLADANI+VCC+EDIT14V+PV+STB+y; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // 14V + P/V + SCLK + SDIN + STB - zapnutím a vypnutím bitu SCLK přesunu bit do registru PISO x=OVLADANI+VCC+EDIT14V+PV+SCLK+STB+y; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // 14V + P/V + SDIN + STB x=OVLADANI+VCC+EDIT14V+PV+STB+y; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); } // Adresa - vystavím adresu řádku WriteFile(Port,&Adresa,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // 14V + P/V - vypnutím a zapnutím bitu STB potvrdím vystavenou adresu x=OVLADANI+VCC+EDIT14V+PV; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); // 14V + P/V + STB x=OVLADANI+VCC+EDIT14V+PV+STB; 33
WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); }
3.4. Dokončení ovládacího programu Pro účely testování jsem do programu přidal tlačítka Přečíst řádek a Zapsat řádek a k nim příslušná pole pro zadání adresy řádku a testovacích dat pro zápis. Dále jsem přidal tlačítko Vypsat EEPROM, které postupně přečte a zobrazí všechny řádky EEPROM matice obvodu GAL16V8, které jsou zajímavé z hlediska programování obvodu. Pro funkci ovládacího programu jsem vytvořil ještě tlačítko Vymazat, které zapíše hodnotu 1 do řádku 63 EEPROM matice obvodu GAL16V8, čímž dojde k nastavení defaultních hodnot pro všechny prvky této matice.
Obrázek 6: Rozhraní ovládacího programu Posledním ovládacím prvkem, který jsem vytvořil je tlačítko Načíst data z JEDEC souboru a zapsat do obvodu GAL, které otevře soubor JEDEC, informace z něj převede 34
na data vhodná pro zápis do EEPROM matice obvodu GAL16V8, tato data po řádcích zapíše do EEPROM matice obvodu GAL16V8 a opětovným přečtením dat z EEPROM matice obvodu GAL16V8 a jejich porovnáním s daty zapisovanými ověří správnost zapsaných dat. Nakonec jsem upravil tlačítka ovládacího programu tak, aby v každé chvíli byla aktivní pouze ta tlačítka, která mohou být v daném okamžiku použita (například nelze použít tlačítko pro zápis dat ve chvíli, kdy ještě neproběhla inicializace).
3.5. Ovření funkčnosti Při ověřování správné funkce programátoru GAL16V8 a ovládacího programu jsem nejprve zkontroloval statické nastavení vývodů patice GAL16V8 (tzn. stav jednotlivých vývodů po zapnutí, inicializaci a vypnutí) pomocí multimetru. Tento test dopadl úspěšně a na všech vývodech patice GAL16V8 se objevilo předpokládané napětí. Další z testů byl zaměřen na správné převedení obsahu souboru JEDEC na data pro programátor GAL16V8. K tomuto ověření jsem použil textových polí ovládacího programu, kdy jsem vizuálně porovnával obsah souboru JEDEC zobrazeného v jednom textovém poli a data pro zápis do obvodu GAL16V8 zobrazená v druhém textovém poli. Při porovnávání si vždy obě textová pole odpovídala. Dalším krokem bylo testování funkce čtení z EEPROM matice obvodu GAL16V8. Funkci čtení jsem aplikoval na různé řádky EEPROM matice obvodu GAL16V8, včetně řádku obsahujícího data programovací značky (PES) a přečtená data odpovídala předpokládaným hodnotám. Pro otestování zápisu dat do EEPROM matice obvodu GAL16V8 jsem si nejprve navolil testovací data tak, aby obsahovala obě hodnoty, jak 0 tak 1, aby nebyla symetrická a aby bylo možné odhalit případné ztracené hodnoty. Tato data jsem pomocí funkce pro zápis zapsal na zvolený řádek EEPROM matice obvodu GAL16V8, potom jsem je opět přečetl a výsledky porovnal. Zjistil jsem, že přečtená data odpovídají zapisovaným datům, pouze jsou posunuta o jeden znak doleva, takže první znak zapisovaných dat se ztratil a na prvním místě přečtených dat se nachází druhý znak zapisovaných dat, atd. Na zjištění příčin tohoto jevu zatím stále pracuji. 35
Posledním testem byla funkce vymazání obvodu GAL16V8 zápisem hodnoty 1 na 63. řádek EEPROM matice obvodu GAL16V8. Předpokládaný výsledek je naplnění programovatelných řádků EEPROM matice obvodu GAL16V8 implicitními hodnotami 1 a další možnost zápisu dat na tyto řádky EEPROM matice. Tento test nedopadl dobře, neboť po zapsání hodnoty 1 na 63. řádek EEPROM matice obvodu GAL16V8 doslo k naplnění všech programovatelných řádků EEPROM matice obvodu GAL16V8 hodnotami 0 a dále se mi nepodařilo do EEPROM matice obvodu GAL16V8 zapsat žádné další hodnoty. Tento stav obvodu GAL16V8 se mi zatím nepodařilo opravit a obvod GAL16V8 zůstává tedy pro další testování zápisu nepoužitelný. Při dalším testování zápisu na náhradním obvodu GAL16V8 jsem bohužel dospěl ke stejnému výsledku a i tento náhradni obvod GAL16V8 je v současnosti zablokován.
36
4. Závěr Při tvoření této bakalářské práce jsem se více či méně úspěšně potýkal s několika problémy. Prvním problémem byla moje nedostatečná předchozí zkušenost s elektrickými obvody vůbec a s jejich navrhováním a ovládáním zvlášť. S tímto problémem mi velice pomáhal vedoucí mé práce a díky němu jsem byl nakonec schopen navrhnout fyzické zařízení a programové vybavení. Dalším problémem byl naprostý nedostatek volného času. S tímto problémem mi naprosto neuvěřitelným způsobem pomohla má skvělá manželka, která na sebe vzala veškerou starost o domácnost a o naše 3 malé děti a umožnila mi trávit nezbytný čas prací na vytvoření programátoru a této práce. Třetím problémem, se kterým jsem se snažil vypořádat byla nedostatečná vybavenost mojí dílny. Sice jsem si pořídil mikropájku a multimetr, ale chybělo mi zařízení na testování a programování obvodu GAL16V8, se kterým bych mohl porovnávat výsledky svého snažení. Díky podpoře jsem dokázal vyrobit, naprogramovat a otestovat zadané zařízení, na konci testování jsem však narazil na problém, se kterým jsem si zatím nedokázal poradit. Kvůli 2 zablokovaným obvodům GAL16V8 jsem nedokázal dokončit testování zápisu dat do obvodu GAL16V8 a tedy jsem zatím nedokázal plně zprovoznit vyrobené zařízení.
37
Seznam použité literatury [1] MATOUŠEK, David: Udělejte si z PC 1. díl – generátor, čítač, převodník, programátor... BEN – technická literatura, Praha 2001. ISBN 80-7300-036-9 [2]
MATOUŠEK, David: Práce s mikrokontroléry ATMEL AVR - ATmega 16
BEN – technická literatura, Praha 2006. ISBN 80-7300-174-8 [3]
http://www.nostalcomp.cz/g540.php
[4]
http://www.pic16.com/en/wzcapi/g540.htm
[5]
www.gbeshop.com/infobase/downloads/G540_840%20Manual.doc
[6]
http://www.hw.cz/Teorie-a-praxe/Konstrukce/ART644-GALblast---
Programator-GALu.html [7]
http://mcu.cz/print.php?news.131
[8]
http://cs.wikipedia.org/wiki/Programovateln%C3%A9_hradlov%C3%A9_pole
[9]
http://fpga.sweb.cz/
[10] pole
LÍŠKA, Miroslav; ŠULO, Vladimír; STRELEC Josef: Programovatelná logická
Grada, Praha 1993. ISBN 80-85623-26-9 [11]
http://measure.feld.cvut.cz/groups/edu/x38nrp/jedec.html
[12]
http://www.armory.com/~rstevew/Public/Pgmrs/GAL/algo.htm
[13]
MATOUŠEK, David: Číslicová technika
BEN – technická literatura, Praha 2001. ISBN 80-7300-025-3 [14]
http://www.eres.alpha.pl/elektronika/print.php?type=A&item_id=347
[15]
http://www.monografias.com/trabajos14/diagrama-funcional/diagrama-
funcional.shtml 38
Seznam obrázků Obrázek 1: Vnitřní schéma obvodu GAL16V8 [15]..............................................11 Obrázek 2: Schéma obvodu GAL16V8D [14]......................................................13 Obrázek 3: Schéma zapojení programátoru GAL16V8.........................................21 Obázek 4: Výkres plošného spoje..........................................................................22 Obrázek 5: Plánek osazení plošného spoje............................................................22 Obrázek 6: Rozhraní ovládacího programu...........................................................34
39
Obsah přiloženého CD Na přiloženém CD se v kořenovém adresáři v souboru Programator_GAL16V8.pdf nachází tato bakalářská práce a v souboru GAL16V8.exe se nachází ovládací program k programátoru
GAL16V8.
Dále
se
ve
složce
Prilohy
nachází
v
souboru
GAL16V8D_datasheet.pdf datasheet k obvodu GAL16V8D a v souboru jesd3c.pdf specifikace souborů JEDEC. V další složce Atmega16 se nachází v souboru Atmega16.c zdrojový kód programu pro mikroprocesor Atmega16. V poslední složce CPPbuilder je umístěn zdrojový kód ovládacího programu.
40