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 přešli k programování mikrokontrolerů, především ATmega644 a ovládá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---programator- GALu.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í V CC 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ý V CC, 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 V CC 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. RA 0 -RA 5 =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 RA 0 -RA 5 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 RA 0 -RA 5 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 STB=1 do neaktivního stavu. 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 RA 0 -RA 5 nastavíme adresu odpovídajícího řádku konfigurační EEPROM. 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 (0-32 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 RA 0 -RA 5 nastavíme adresu požadovaného řádku konfigurační EEPROM. 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 (0-32 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 -RA 5 =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í V CC =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í V CC =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í V CC. 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 2.3.4. Plánek osazení Obázek 4: Výkres plošného spoje Obrázek 5: Plánek osazení plošného spoje 22
2.3.5. Seznam součástek Part Value Device Package Library C1 E470M/25V CPOL-EUE5-13 E5-13 rcl C2 E22V/16V CPOL-EUE2.5-5 E2,5-5 rcl C3 E22V/16V CPOL-EUE2.5-5 E2,5-5 rcl C4 CK 100N C-EU050-025X075 C050-025X075 rcl C5 CK 100N C-EU050-025X075 C050-025X075 rcl C6 CK 100N C-EU050-025X075 C050-025X075 rcl C7 CK 100N C-EU050-025X075 C050-025X075 rcl C8 E22V/16V CPOL-EUE2.5-5 E2,5-5 rcl C9 E22V/16V CPOL-EUE2.5-5 E2,5-5 rcl C10 E22M/16V CPOL-EUE2.5-5 E2,5-5 rcl C11 CK 100N C-EU050-025X075 C050-025X075 rcl C12 CK 100N C-EU050-025X075 C050-025X075 rcl C13 CK 100N C-EU050-025X075 C050-025X075 rcl D1 1N4007 1N4004 DO41-10 diode D2 1N4148 1N4148DO35-7 DO35-7 diode IC1 7812 78XXL 78XXL v-reg IC2 7805 78XXL 78XXL v-reg IC3 MAX232 MAX220CPE DIL16 maxim IC4 ATMEGA16-16PU ATMEGA644-10PU DIL40 atmel IC5 DIL20 DIL20 ic-package LED1 LED5MM LED5MM led Q1 BC548 BC548 TO92-EBC transistor-npn Q2 11,059MHz CRYSTALHC18U-V HC18U-V crystal Q3 BC558A BC558A TO92-EBC transistor-pnp Q4 BC548 BC548 TO92-EBC transistor-npn Q5 BC548 BC548 TO92-EBC transistor-npn Q6 BC558A BC558A TO92-EBC transistor-pnp R1 RR 100K R-EU_0207/10 0207/10 rcl R2 RR 1K R-EU_0207/10 0207/10 rcl R3 RR 1K R-EU_0207/10 0207/10 rcl R4 RR 10K R-EU_0207/10 0207/10 rcl R5 RR 100K R-EU_0207/10 0207/10 rcl R6 RR 1K R-EU_0207/10 0207/10 rcl R7 RR 100K R-EU_0207/10 0207/10 rcl R8 RR 1K R-EU_0207/10 0207/10 rcl R9 RR 1K R-EU_0207/10 0207/10 rcl R10 RR 10K R-EU_0207/10 0207/10 rcl R11 RR 10K R-EU_0207/10 0207/10 rcl R12 RR 100K R-EU_0207/10 0207/10 rcl R13 RR 1K R-EU_0207/10 0207/10 rcl R14 RR 100K R-EU_0207/10 0207/10 rcl R15 RR 10K R-EU_0207/10 0207/10 rcl R16 RR 10K R-EU_0207/10 0207/10 rcl R17 RR 10K R-EU_0207/10 0207/10 rcl R18 RR 10K R-EU_0207/10 0207/10 rcl R19 RR 10K R-EU_0207/10 0207/10 rcl R20 RR 10K R-EU_0207/10 0207/10 rcl R21 RR 10K R-EU_0207/10 0207/10 rcl X1 ARK500/2 AK500/2 AK500/2 con-ptr500 X2 CAN9Z90 F09H F09H con-subd 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í (V CC, 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 <avr/io.h> 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<<RXEN) (1<<TXEN); // povolení zápisu do registru UCSRS a nastavení 8 bitového přenosu UCSRC = (1<<URSEL) (1<<UCSZ1) (1<<UCSZ0); // nastavení rychlosti přenosu na 9600 UBRRL = 64; UBRRH = 0; 25
// tělo programu while(1) { if(ucsra&(1<<rxc)) // pokud je příjem dat dokončen... { data=udr; //... načtu přijatá data do proměnné data if(data&128) // pokud nejvyšší bit je 1... { A... port C... PORTA=(PORTA&0b10000000) (data&0b01111000); //... nastavím port PORTC=(PORTC&0b11111000) (data&0b00000111); //... nastavím 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 // pokud 2 nejvyšší bity jsou 00, jedná se o adresu { if(data&32) PORTC=PORTC 0b00001000; zbytek PC neměnit // pokud RAG5=1 nastav PC3=1, else PORTC=PORTC&0b11110111; // pokud RAG5=0 nastav PC3=0, zbytek PC neměnit if(data&16) PORTC=PORTC 0b00010000; zbytek PC neměnit 26 // pokud RAG4=1 nastav PC4=1,
else PORTC=PORTC&0b11101111; // pokud RAG4=0 nastav 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; // pokud RAG3=0 nastav PC5=0, zbytek PC neměnit if(data&4) PORTC=PORTC 0b01000000; zbytek PC neměnit // pokud RAG2=1 nastav PC6=1, else PORTC=PORTC&0b10111111; // pokud RAG2=0 nastav PC6=0, zbytek PC neměnit if(data&2) PORTC=PORTC 0b10000000; zbytek PC neměnit // pokud RAG1=1 nastav PC7=1, else PORTC=PORTC&0b01111111; // pokud RAG1=0 nastav PC7=0, zbytek PC neměnit if(data&1) PORTA=PORTA 0b10000000; zbytek PC neměnit // pokud RAG0=1 nastav PA7=1, else PORTA=PORTA&0b01111111; // pokud RAG0=0 nastav PA7=0, zbytek PC neměnit 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<<txc)) // pokud je vysilani dat dokonceno... { UCSRA =(1<<TXC); //... vynuluji priznak dokonceneho vysilani } } } 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í V CC 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 V CC 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í V CC, 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 // 12V + STB x=ovladani+vcc+edit12v; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); 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 // 12V + STB } } return Data; x=ovladani+vcc+edit12v+sclk+stb; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); x=ovladani+vcc+edit12v+stb; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); Data=Data+String(x); 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 // 14V + P/V + SDIN + STB } x=ovladani+vcc+edit14v+pv+sclk+stb+y; WriteFile(Port,&x,1,&p,NULL); ReadFile(Port,&x,1,&p,NULL); 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] LÍŠKA, Miroslav; ŠULO, Vladimír; STRELEC Josef: Programovatelná logická pole 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/diagramafuncional.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