Rev 381 Rev 414
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2 <html> 2 <html>
3 <head> 3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5 <title> Programování AVR </title> 5 <title> Programování AVR </title>
6 <meta name="keywords" content="stavebnice MLAB programování procesoru ATMEL ATmega8"> 6 <meta name="keywords" content="stavebnice MLAB programování procesoru ATMEL ATmega8">
7 <meta name="description" content="Projekt MLAB, programování ATmega8"> 7 <meta name="description" content="Projekt MLAB, programování ATmega8">
8 <!-- AUTOINCLUDE START "Page/Head.cs.ihtml" DO NOT REMOVE --> 8 <!-- AUTOINCLUDE START "Page/Head.cs.ihtml" DO NOT REMOVE -->
9 <link rel="StyleSheet" href="../../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB základní styl"> 9 <link rel="StyleSheet" href="../../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB základní styl">
10 <link rel="StyleSheet" href="../../../../../Web/CSS/MLAB_Print.css" type="text/css" media="print"> 10 <link rel="StyleSheet" href="../../../../../Web/CSS/MLAB_Print.css" type="text/css" media="print">
11 <link rel="shortcut icon" type="image/x-icon" href="../../../../../Web/PIC/MLAB.ico"> 11 <link rel="shortcut icon" type="image/x-icon" href="../../../../../Web/PIC/MLAB.ico">
12 <script type="text/javascript" src="../../../../../Web/JS/MLAB_Menu.js"></script> 12 <script type="text/javascript" src="../../../../../Web/JS/MLAB_Menu.js"></script>
13 <!-- AUTOINCLUDE END --> 13 <!-- AUTOINCLUDE END -->
14 </head> 14 </head>
15   15  
16 <body lang="cs"> 16 <body lang="cs">
17   17  
18 <!-- AUTOINCLUDE START "Page/Header.cs.ihtml" DO NOT REMOVE --> 18 <!-- AUTOINCLUDE START "Page/Header.cs.ihtml" DO NOT REMOVE -->
19 <!-- ============== HLAVICKA ============== --> 19 <!-- ============== HLAVICKA ============== -->
20 <div class="Header"> 20 <div class="Header">
21 <script type="text/javascript"> 21 <script type="text/javascript">
22 <!-- 22 <!--
23 SetRelativePath("../../../../../"); 23 SetRelativePath("../../../../../");
24 DrawHeader(); 24 DrawHeader();
25 // --> 25 // -->
26 </script> 26 </script>
27 <noscript> 27 <noscript>
28 <p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p> 28 <p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
29 </noscript> 29 </noscript>
30 </div> 30 </div>
31 <!-- AUTOINCLUDE END --> 31 <!-- AUTOINCLUDE END -->
32   32  
33 <!-- AUTOINCLUDE START "Page/Menu.cs.ihtml" DO NOT REMOVE --> 33 <!-- AUTOINCLUDE START "Page/Menu.cs.ihtml" DO NOT REMOVE -->
34 <!-- ============== MENU ============== --> 34 <!-- ============== MENU ============== -->
35 <div class="Menu"> 35 <div class="Menu">
36 <script type="text/javascript"> 36 <script type="text/javascript">
37 <!-- 37 <!--
38 SetRelativePath("../../../../../"); 38 SetRelativePath("../../../../../");
39 DrawMenu(); 39 DrawMenu();
40 // --> 40 // -->
41 </script> 41 </script>
42 <noscript> 42 <noscript>
43 <p><b> Pro zobrazení (vložení) menu je potřeba JavaScript </b></p> 43 <p><b> Pro zobrazení (vložení) menu je potřeba JavaScript </b></p>
44 </noscript> 44 </noscript>
45 </div> 45 </div>
46 <!-- AUTOINCLUDE END --> 46 <!-- AUTOINCLUDE END -->
47   47  
48 <!-- ============== TEXT ============== --> 48 <!-- ============== TEXT ============== -->
49 <div class="Text"> 49 <div class="Text">
50 <p class="Title"> 50 <p class="Title">
51 Programování procesorů ATMEL AVR 51 Programování procesorů ATMEL AVR
52 </p> 52 </p>
53 <p class=Autor> 53 <p class=Autor>
54 Milan Horkel 54 Milan Horkel
55 </p> 55 </p>
56 <p class="Subtitle"> 56 <p class="Subtitle">
57 Procesor bez programu je jako motor bez paliva. Tento text uvádí 57 Procesor bez programu je jako motor bez paliva. Tento text uvádí
58 přehled potřebných nástrojů pro napsání programu pro procesory AVR a 58 přehled potřebných nástrojů pro napsání programu pro procesory AVR a
59 pro jejich naprogramování. 59 pro jejich naprogramování.
60 </p> 60 </p>
61 <p> 61 <p>
62 <a href="../Programovani AVR.cs.pdf"><img class="NoBorder" 62 <a href="../Programovani AVR.cs.pdf"><img class="NoBorder"
63 src="../../../../../Web/PIC/FileIco_PDF.ico" 63 src="../../../../../Web/PIC/FileIco_PDF.ico"
64 alt="Acrobat">&nbsp;PDF verze</a> 64 alt="Acrobat">&nbsp;PDF verze</a>
65 </p> 65 </p>
66   66  
67 <h1> Programování procesoru </h1> 67 <h1> Programování procesoru </h1>
68   68  
69 <p> 69 <p>
70 Aby jednočipový mikrořadič dělal to, co od něho chceme je třeba udělat 70 Aby jednočipový mikrořadič dělal to, co od něho chceme je třeba udělat
71 dvě věci: 71 dvě věci:
72 </p> 72 </p>
73   73  
74 <ul> 74 <ul>
75 <li>Napsat program pro procesor a přeložit jej do strojového kódu </li> 75 <li>Napsat program pro procesor a přeložit jej do strojového kódu </li>
76 <li>Výsledný strojový kód naprogramovat do cílového procesoru </li> 76 <li>Výsledný strojový kód naprogramovat do cílového procesoru </li>
77 </ul> 77 </ul>
78   78  
79 <p> 79 <p>
80 Velkou výhodou procesorů ATMEL AVR je skutečnost, že obě výše zmíněné 80 Velkou výhodou procesorů ATMEL AVR je skutečnost, že obě výše zmíněné
81 činnosti můžeme zajistit pomocí free nástrojů a experimentovat tak 81 činnosti můžeme zajistit pomocí free nástrojů a experimentovat tak
82 můžeme bez dalších nákladů na vývojové nástroje. Část prostředků 82 můžeme bez dalších nákladů na vývojové nástroje. Část prostředků
83 pochází přímo od firmy ATMEL a část od GNU komunity. Jsou k dispozici 83 pochází přímo od firmy ATMEL a část od GNU komunity. Jsou k dispozici
84 tyto nástroje: 84 tyto nástroje:
85 </p> 85 </p>
86   86  
87 <ul> 87 <ul>
88 <li>Integrované prostředí a simulátor procesorů (ATMEL) </li> 88 <li>Integrované prostředí a simulátor procesorů (ATMEL) </li>
89 <li>Překladač jazyka C (GNU) </li> 89 <li>Překladač jazyka C (GNU) </li>
90 <li>Programátor procesorů (GNU) </li> 90 <li>Programátor procesorů (GNU) </li>
91 <li>Programovací kabel (GNU) </li> 91 <li>Programovací kabel (GNU) </li>
92 </ul> 92 </ul>
93   93  
94 <p> 94 <p>
95 Příslušné nástroje jsou pro Windows 98 až Windows XP, GNU nástroje 95 Příslušné nástroje jsou pro Windows 98 až Windows XP, GNU nástroje
96 samozřejmě i pro LINUX. Nástroje jsou přátelské a bez problémů funkční. 96 samozřejmě i pro LINUX. Nástroje jsou přátelské a bez problémů funkční.
97 Kromě těchto základních komponent jsou k dispozici i ladící nástroje. 97 Kromě těchto základních komponent jsou k dispozici i ladící nástroje.
98 </p> 98 </p>
99   99  
100 <p> 100 <p>
101 Kromě volných nástrojů existuje samozřejmě i spousta vysoce kvalitních 101 Kromě volných nástrojů existuje samozřejmě i spousta vysoce kvalitních
102 komerčních nástrojů renovovaných firem. Těmi se zde nebudeme zabývat i 102 komerčních nástrojů renovovaných firem. Těmi se zde nebudeme zabývat i
103 když pro vážnou práci mohou být vhodné (kvalita kódu, záruky, technická 103 když pro vážnou práci mohou být vhodné (kvalita kódu, záruky, technická
104 podpora, dokumentace a podobně). 104 podpora, dokumentace a podobně).
105 </p> 105 </p>
106   106  
107 <h2> Volné nástroje </h2> 107 <h2> Volné nástroje </h2>
108   108  
109 <h3> Integrované prostředí – AVR Studio </h3> 109 <h3> Integrované prostředí – AVR Studio </h3>
110   110  
111 <p> 111 <p>
112 <a href="http://www.atmel.com/">http://www.atmel.com</a> 112 <a href="http://www.atmel.com/">http://www.atmel.com</a>
113 </p> 113 </p>
114   114  
115 <p> 115 <p>
116 Jedná se o integrované vývojové prostředí pro vývoj programů pro 116 Jedná se o integrované vývojové prostředí pro vývoj programů pro
117 procesory ATMEL AVR (assembler, linker) s možností integrace překladačů 117 procesory ATMEL AVR (assembler, linker) s možností integrace překladačů
118 jazyka C/C++. Prostředí obsahuje rovněž simulátor procesorů AVR a přímo 118 jazyka C/C++. Prostředí obsahuje rovněž simulátor procesorů AVR a přímo
119 podporuje základní druhy ladících nástrojů ATMEL. 119 podporuje základní druhy ladících nástrojů ATMEL.
120 </p> 120 </p>
121   121  
122 <p> 122 <p>
123 Do AVR studia lze přímo integrovat GNU překladač jazyka C/C++ pro AVR 123 Do AVR studia lze přímo integrovat GNU překladač jazyka C/C++ pro AVR
124 procesory. Je vhodné nejprve nainstalovat WinAVR a teprve poté 124 procesory. <b>Je vhodné nejprve nainstalovat WinAVR a teprve poté
125 instalovat AVR Studio. 125 instalovat AVR Studio.</b>
126 </p> 126 </p>
127   127  
128 <p> 128 <p>
129 Balík AVR Studio potřebuje ke své činnosti IE5.0 (raději 6.0, nebo 129 Balík AVR Studio potřebuje ke své činnosti IE5.0 (raději 6.0, nebo
130 balík XML od MS). 130 balík XML od MS).
131 </p> 131 </p>
132   132  
133 <h3> Překladač C/C++ – WinAVR </h3> 133 <h3> Překladač C/C++ – WinAVR </h3>
134   134  
135 <p> 135 <p>
136 <a href="http://winavr.sourceforge.net/">http://winavr.sourceforge.net</a> 136 <a href="http://winavr.sourceforge.net/">http://winavr.sourceforge.net</a>
137 </p> 137 </p>
138   138  
139 <p> 139 <p>
140 Toto je připravený balík GNU nástrojů pro AVR procesory připravený pro 140 Toto je připravený balík GNU nástrojů pro AVR procesory připravený pro
141 instalaci do Windows (používá knihovny CIGWIN). Při instalaci balíku na 141 instalaci do Windows (používá knihovny CIGWIN). Při instalaci balíku na
142 WindowsNT/2000/XP je třeba instalaci provádět pod účtem administrátora 142 WindowsNT/2000/XP je třeba instalaci provádět pod účtem administrátora
143 jinak se nenastaví cesta do BIN adresáře tohoto balíku. 143 jinak se nenastaví cesta do BIN adresáře tohoto balíku.
144 </p> 144 </p>
145   145  
146 <p> 146 <p>
147 Překladač může fungovat sám o sobě nebo se může integrovat s balíkem 147 Překladač může fungovat sám o sobě nebo se může integrovat s balíkem
148 AVR Studio. 148 AVR Studio.
149 </p> 149 </p>
150   150  
151 <h3> AVRDUDE – programátor AVR procesorů </h3> 151 <h3> AVRDUDE – programátor AVR procesorů </h3>
152   152  
153 <p> 153 <p>
154 <a href="http://savannah.nongnu.org/projects/avrdude">http://savannah.nongnu.org/projects/avrdude</a><br> 154 <a href="http://savannah.nongnu.org/projects/avrdude">http://savannah.nongnu.org/projects/avrdude</a><br>
155 <a href="http://sourceforge.net/projects/avrdude-gui">http://sourceforge.net/projects/avrdude-gui</a> 155 <a href="http://sourceforge.net/projects/avrdude-gui">http://sourceforge.net/projects/avrdude-gui</a>
156 </p> 156 </p>
157   157  
158 <p> 158 <p>
159 Program AVRDUDE je jeden z volných programátorů procesorů AVR a je 159 Program AVRDUDE je jeden z volných programátorů procesorů AVR a je
160 součástí balíku WinAVR. K programu je připravena grafická nadstavba 160 součástí balíku WinAVR. K programu je připravena grafická nadstavba
161 AVRDUDE-GUI, která usnadňuje použití programu. 161 AVRDUDE-GUI, která usnadňuje použití programu.
162 </p> 162 </p>
163   163  
164 <p> 164 <p>
165 Program má svůj konfigurační soubor, ve kterém jsou nadefinovány jednak 165 Program má svůj konfigurační soubor, ve kterém jsou nadefinovány jednak
166 parametry mnoha programovacích kabelů (včetně čísel vývodů LPT portu 166 parametry mnoha programovacích kabelů (včetně čísel vývodů LPT portu
167 pro jednotlivé funkce) tak i parametry jednotlivých procesorů. 167 pro jednotlivé funkce) tak i parametry jednotlivých procesorů.
168 </p> 168 </p>
169   169  
170 <h4> Konfigurační slova </h4> 170 <h4> Konfigurační slova </h4>
171   171  
172 <p> 172 <p>
173 Současná verze má drobný problém při programování a čtení 173 Současná verze má drobný problém při programování a čtení
174 konfiguračních slov procesoru z grafické nadstavby (grafická nadstavba 174 konfiguračních slov procesoru z grafické nadstavby (grafická nadstavba
175 není ještě dodělaná a dle slov autora možná vznikne nová verze 175 není ještě dodělaná a dle slov autora možná vznikne nová verze
176 programu, která bude rovnou plně grafická). Při čtení slov se nepřenáší 176 programu, která bude rovnou plně grafická). Při čtení slov se nepřenáší
177 přečtená data do grafického programu a při zápisu se zadané hexa 177 přečtená data do grafického programu a při zápisu se zadané hexa
178 parametry chybně chápou jako jména souborů. Naštěstí se zápis do 178 parametry chybně chápou jako jména souborů. Naštěstí se zápis do
179 konfiguračních slov procesoru neprovádí často. 179 konfiguračních slov procesoru neprovádí často.
180 </p> 180 </p>
181   181  
182 <h4> Čtení konfiguračních slov </h4> 182 <h4> Čtení konfiguračních slov </h4>
183   183  
184 <p> 184 <p>
185 Konfigurační slova nelze číst z grafické nadstavby ale grafickou 185 Konfigurační slova nelze číst z grafické nadstavby ale grafickou
186 nadstavbu můžeme použít pro sestavení příkazové řádky, kterou pak jen 186 nadstavbu můžeme použít pro sestavení příkazové řádky, kterou pak jen
187 opravíme. Viz příklad, opravy jsou zvýrazněny: 187 opravíme. Viz příklad, opravy jsou zvýrazněny:
188 </p> 188 </p>
189   189  
190 <p> 190 <p>
191 <samp>"avrdude" -p m8 -c picoweb -P lpt1 -U lfuse:r:con:<b>i</b> -U hfuse:r:con:<b>i</b></samp> 191 <samp>"avrdude" -p m8 -c picoweb -P lpt1 -U lfuse:r:con:<b>i</b> -U hfuse:r:con:<b>i</b></samp>
192 </p> 192 </p>
193   193  
194 <p> 194 <p>
195 Přečtená data jsou ve formátu INTEL HEX (parametr i): 195 Přečtená data jsou ve formátu INTEL HEX (parametr i):
196 </p> 196 </p>
197   197  
198 <p> 198 <p>
199 <samp>:01000000<b>EF</b>10</samp> -- lfuse (spodní konfigurační slovo)<br> 199 <samp>:01000000<b>EF</b>10</samp> -- lfuse (spodní konfigurační slovo)<br>
200 <samp> :00000001FF<br> 200 <samp> :00000001FF<br>
201 :01000000<b>D9</b>26</samp> -- hfuse (horní konfigurační slovo)<br> 201 :01000000<b>D9</b>26</samp> -- hfuse (horní konfigurační slovo)<br>
202 <samp> :00000001FF</samp> 202 <samp> :00000001FF</samp>
203 </p> 203 </p>
204   204  
205 <p> 205 <p>
206 Příčinou je to, že program AVRDUDE vypisuje všechno do standardního 206 Příčinou je to, že program AVRDUDE vypisuje všechno do standardního
207 chybového výstupu a tak výpisy na zařízení CON pak padají do kanálu 207 chybového výstupu a tak výpisy na zařízení CON pak padají do kanálu
208 místo do AVRDUDE-GUI (který chytá jen chybové výstupy). 208 místo do AVRDUDE-GUI (který chytá jen chybové výstupy).
209 </p> 209 </p>
210   210  
211 <h4> Programování konfiguračních slov </h4> 211 <h4> Programování konfiguračních slov </h4>
212   212  
213 <p> 213 <p>
214 Pro přeprogramování konfiguračního slova vyžaduje AVRDUDE dodatečný 214 Pro přeprogramování konfiguračního slova vyžaduje AVRDUDE dodatečný
215 parametr „-u“. Je to z bezpečnostních důvodů aby nedošlo k 215 parametr „-u“. Je to z bezpečnostních důvodů aby nedošlo k
216 přeprogramování omylem. Pro zápis není třeba příkazovou řádku spouštět 216 přeprogramování omylem. Pro zápis není třeba příkazovou řádku spouštět
217 z konsole, stačí ji jen opravit dle příkladu: 217 z konsole, stačí ji jen opravit dle příkladu:
218 </p> 218 </p>
219   219  
220 <p> 220 <p>
221 <samp>"avrdude" -p m8 -c picoweb -P lpt1 -U lfuse:w:<b>0x</b>ef:<b>m</b></samp> 221 <samp>"avrdude" -p m8 -c picoweb -P lpt1 -U lfuse:w:<b>0x</b>ef:<b>m</b></samp>
222 </p> 222 </p>
223   223  
224 <p> 224 <p>
225 Doplněný parametr zajistí, že místo jména souboru je parametr chápán 225 Doplněný parametr zajistí, že místo jména souboru je parametr chápán
226 přímo jako hodnota (nutno doplnit 0x protože je hodnota hexadecimální). 226 přímo jako hodnota (nutno doplnit 0x protože je hodnota hexadecimální).
227 Výše uvedená řádka naprogramuje do procesoru ATmega8 pomocí kabelu typu 227 Výše uvedená řádka naprogramuje do procesoru ATmega8 pomocí kabelu typu
228 picoweb přes LPT1 spodní konfigurační slovo na hodnotu 0xEF (krystalový 228 picoweb přes LPT1 spodní konfigurační slovo na hodnotu 0xEF (krystalový
229 oscilátor). 229 oscilátor).
230 </p> 230 </p>
231   231  
232 <h3> Paralelní programovací kabel </h3> 232 <h3> Paralelní programovací kabel </h3>
233   233  
234 <p> 234 <p>
235 Nejjednodušší programátor procesorů AVR sestává z kabelu, který se 235 Nejjednodušší programátor procesorů AVR sestává z kabelu, který se
236 zapojuje do LPT portu počítače na jednom konci a do programovacího 236 zapojuje do LPT portu počítače na jednom konci a do programovacího
237 konektoru u procesoru na konci druhém. Kromě drátů neobsahuje žádnou 237 konektoru u procesoru na konci druhém. Kromě drátů neobsahuje žádnou
238 další elektroniku. Jedním z možných kabelů je tento: 238 další elektroniku. Jedním z možných kabelů je tento:
239 </p> 239 </p>
240   240  
241 <p> 241 <p>
242 <img width="258" height="326" src="Pictures/Programator.gif" 242 <img width="258" height="326" src="Pictures/Programator.gif"
243 alt="Schema programátoru"> 243 alt="Schema programátoru">
244 </p> 244 </p>
245   245  
246 <p> 246 <p>
247 Propojovací dráty je vhodné udělat přiměřené délky cca 1/2 metru. 247 Propojovací dráty je vhodné udělat přiměřené délky cca 1/2 metru.
248 Nezapomeňte výrazně označit vývod 1 ISP konektoru protože konektor nemá 248 Nezapomeňte výrazně označit vývod 1 ISP konektoru protože konektor nemá
249 žádný klíč. 249 žádný klíč.
250 </p> 250 </p>
251   251  
252 <p> 252 <p>
253 Při použití se zadává v programu AVRDUDE jako PicoWeb kabel. 253 Při použití se zadává v programu AVRDUDE jako PicoWeb kabel.
254 </p> 254 </p>
255   255  
256 <p> 256 <p>
257 Pokud máte nějaký jiný kabel/programátor je možné kouknout se do 257 Pokud máte nějaký jiný kabel/programátor je možné kouknout se do
258 konfiguračního souboru programu AVRDUDE a vybrat vhodný kabel nebo svůj 258 konfiguračního souboru programu AVRDUDE a vybrat vhodný kabel nebo svůj
259 kabel doplnit do konfigurace. 259 kabel doplnit do konfigurace.
260 </p> 260 </p>
261   261  
262 <h2> Konfigurační slova procesoru </h2> 262 <h2> Konfigurační slova procesoru </h2>
263   263  
264 <p> 264 <p>
265 Konfigurační slova procesoru určují (mimo jiné) jaký se použije 265 Konfigurační slova procesoru určují (mimo jiné) jaký se použije
266 oscilátor pro procesor. Pokud skutečná konfigurace neodpovídá 266 oscilátor pro procesor. Pokud skutečná konfigurace neodpovídá
267 naprogramovanému slovu (například je nastaven externí krystalový 267 naprogramovanému slovu (například je nastaven externí krystalový
268 oscilátor ale krystal není připojen) procesor se nerozběhne a nepůjde 268 oscilátor ale krystal není připojen) procesor se nerozběhne a nepůjde
269 ani přeprogramovat. Pozor tedy při programování konfiguračních slov 269 ani přeprogramovat. Pozor tedy při programování konfiguračních slov
270 procesoru. 270 procesoru.
271 </p> 271 </p>
272   272  
273 <p> 273 <p>
274 Jednotlivé procesory mají různá konfigurační slova a různý počet 274 Jednotlivé procesory mají různá konfigurační slova a různý počet
275 konfiguračních slov (například spodní a horní označená lfuse a hfuse). 275 konfiguračních slov (například spodní a horní označená lfuse a hfuse).
276 </p> 276 </p>
277   277  
278 </div> 278 </div>
279   279  
280 <!-- AUTOINCLUDE START "Page/Footer.cs.ihtml" DO NOT REMOVE --> 280 <!-- AUTOINCLUDE START "Page/Footer.cs.ihtml" DO NOT REMOVE -->
281 <!-- ============== PATIČKA ============== --> 281 <!-- ============== PATIČKA ============== -->
282 <div class="Footer"> 282 <div class="Footer">
283 <script type="text/javascript"> 283 <script type="text/javascript">
284 <!-- 284 <!--
285 SetRelativePath("../../../../../"); 285 SetRelativePath("../../../../../");
286 DrawFooter(); 286 DrawFooter();
287 // --> 287 // -->
288 </script> 288 </script>
289 <noscript> 289 <noscript>
290 <p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p> 290 <p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
291 </noscript> 291 </noscript>
292 </div> 292 </div>
293 <!-- AUTOINCLUDE END --> 293 <!-- AUTOINCLUDE END -->
294   294  
295 </body> 295 </body>
296 </html> 296 </html>