<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Пещера отшельного фердопердозника</title>
	<atom:link href="http://blog.datacompboy.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.datacompboy.ru</link>
	<description>Учет минут секундами часов</description>
	<lastBuildDate>Mon, 12 Apr 2010 08:13:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP 5.2.13 for Debian Squeeze</title>
		<link>http://blog.datacompboy.ru/2010/04/12/php-5-2-13-for-debian-squeeze/</link>
		<comments>http://blog.datacompboy.ru/2010/04/12/php-5-2-13-for-debian-squeeze/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 08:12:20 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[administration]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[squeeze]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=222</guid>
		<description><![CDATA[Понадобилось тут. Заманался гуглить готовые решения &#8212; собрал.
Пакеты для amd64 лежат тут.
Для самостоятельной сборки под другие архитектуры, скачайте
  php5_5.2.13-1.diff.gz
  php5_5.2.13-1.dsc
  php5_5.2.13.orig.tar.gz
]]></description>
			<content:encoded><![CDATA[<p>Понадобилось тут. Заманался гуглить готовые решения &#8212; собрал.<br />
Пакеты для amd64 лежат <a href="/u/php2/index.html">тут</a>.<br />
Для самостоятельной сборки под другие архитектуры, скачайте<br />
  <a href="http://blog.datacompboy.ru/u/php2/php5_5.2.13-1.diff.gz">php5_5.2.13-1.diff.gz</a><br />
  <a href="http://blog.datacompboy.ru/u/php2/php5_5.2.13-1.dsc">php5_5.2.13-1.dsc</a><br />
  <a href="http://blog.datacompboy.ru/u/php2/php5_5.2.13.orig.tar.gz">php5_5.2.13.orig.tar.gz</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2010/04/12/php-5-2-13-for-debian-squeeze/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>МоеДело &#8212; спасение для бухгалтерии ИП</title>
		<link>http://blog.datacompboy.ru/2010/03/06/%d0%bc%d0%be%d0%b5%d0%b4%d0%b5%d0%bb%d0%be-%d1%81%d0%bf%d0%b0%d1%81%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-%d0%b1%d1%83%d1%85%d0%b3%d0%b0%d0%bb%d1%82%d0%b5%d1%80%d0%b8%d0%b8-%d0%b8%d0%bf/</link>
		<comments>http://blog.datacompboy.ru/2010/03/06/%d0%bc%d0%be%d0%b5%d0%b4%d0%b5%d0%bb%d0%be-%d1%81%d0%bf%d0%b0%d1%81%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-%d0%b1%d1%83%d1%85%d0%b3%d0%b0%d0%bb%d1%82%d0%b5%d1%80%d0%b8%d0%b8-%d0%b8%d0%bf/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 16:14:44 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[Бухгалтерия]]></category>
		<category><![CDATA[solutions]]></category>
		<category><![CDATA[ИП]]></category>
		<category><![CDATA[Отчетность]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=219</guid>
		<description><![CDATA[Как человек, пытающийся перейти на полную белую бухгалтерию во всех расчетах, не могу не сообщить всем, о существовании (пока зарождающегося, но явно отличного) сервиса МоеДело.
Полная отчетность, сдача налоговой отчетности онлайн, бух. и юр. консультация [я их уже замучал, наверное, но получил все ответы на все мучающие меня вопросы, правильно и в срок :)].
При оплате в [...]]]></description>
			<content:encoded><![CDATA[<p>Как человек, пытающийся перейти на полную белую бухгалтерию во всех расчетах, не могу не сообщить всем, о существовании (пока зарождающегося, но явно отличного) сервиса <a href="http://moedelo.org">МоеДело</a>.<br />
Полная отчетность, сдача налоговой отчетности онлайн, бух. и юр. консультация [я их уже замучал, наверное, но получил все ответы на все мучающие меня вопросы, правильно и в срок :)].<br />
При оплате <strong>в поле &laquo;промокод&raquo; введите цифры 074721, получите 10% скидки</strong>.<br />
Для ИП с микрооборотом (не более 5 счетов и актов в месяц) вообще бесплатно.<br />
Если вы только собираетесь открыть ИП &#8212; там же бесплатный мастер подготовки документов для регистрации.</p>
<p>Немного сумбурно, но всячески рекомендую &#8212; проверено, сервис супер!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2010/03/06/%d0%bc%d0%be%d0%b5%d0%b4%d0%b5%d0%bb%d0%be-%d1%81%d0%bf%d0%b0%d1%81%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-%d0%b1%d1%83%d1%85%d0%b3%d0%b0%d0%bb%d1%82%d0%b5%d1%80%d0%b8%d0%b8-%d0%b8%d0%bf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash Compiler as Is</title>
		<link>http://blog.datacompboy.ru/2010/02/21/flash-compiler-as-is/</link>
		<comments>http://blog.datacompboy.ru/2010/02/21/flash-compiler-as-is/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 18:24:07 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[low-level programming]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[assembler]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[haxe]]></category>
		<category><![CDATA[problems]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=217</guid>
		<description><![CDATA[Не могу молчать об этом!
Ковырялся тут с флешем. Это может шокировать любого IT специалиста.
Класс:
            var A : Number = 0.0;
            A = A*2*4;
И его дизассемблятина:
    5     [...]]]></description>
			<content:encoded><![CDATA[<p>Не могу молчать об этом!<br />
Ковырялся тут с флешем. Это может шокировать любого IT специалиста.<br />
Класс:<br />
<code>            var A : Number = 0.0;<br />
            A = A*2*4;</code><br />
И его дизассемблятина:<br />
<code>    5       pushdouble      0<br />
    7       convert_d<br />
    8       setlocal1<br />
    9       getlocal1<br />
    10      pushbyte        2<br />
    12      multiply<br />
    13      pushbyte        4<br />
    15      multiply<br />
    16      convert_d<br />
    17      setlocal1</code><br />
Даже в 21м веке остались подходы из 80ых! Долой оптимизаторы!<br />
На железе с гигафлопом итоговая производительность в районе полутора мегафлопов.</p>
<p>p.s.: haXe транслирует так же.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2010/02/21/flash-compiler-as-is/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WavPlayer 1.7.1 &#8212; full JS api and support for reversed order bits .lu and .la</title>
		<link>http://blog.datacompboy.ru/2010/01/27/wavplayer-1-7-1-full-js-api-and-support-for-reversed-order-bits-lu-and-la/</link>
		<comments>http://blog.datacompboy.ru/2010/01/27/wavplayer-1-7-1-full-js-api-and-support-for-reversed-order-bits-lu-and-la/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 10:30:46 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[voip]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[alaw]]></category>
		<category><![CDATA[au]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[g711]]></category>
		<category><![CDATA[gsm]]></category>
		<category><![CDATA[la]]></category>
		<category><![CDATA[lu]]></category>
		<category><![CDATA[pcm]]></category>
		<category><![CDATA[player]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>
		<category><![CDATA[ulaw]]></category>
		<category><![CDATA[wav]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=210</guid>
		<description><![CDATA[New version of WavPlayer, 1.7.1 released.

To get it, just press on snapshot link with wanted format
Changelog:
  * Fixed README
  * Full JS api: now pause/resume/seek available from external interface
  * New integration code, &#171;just for play&#187;. See in tinyembed.html
  * Hosted in online git store, so you can just download snapshot [...]]]></description>
			<content:encoded><![CDATA[<p>New version of <a href="http://git.datacompboy.ru/?p=WavPlayer.git;a=commit;h=b24cc6500058ec35c95953095c797865488416dd">WavPlayer, 1.7.1 released</a>.<br />
<span id="more-210"></span><br />
To get it, just press on snapshot link with wanted format<br />
Changelog:<br />
  * Fixed README<br />
  * Full JS api: now pause/resume/seek available from external interface<br />
  * New integration code, &laquo;just for play&raquo;. See in tinyembed.html<br />
  * Hosted in online git store, so you can just download snapshot of needed version, without git files itself.</p>
<p>Скачать теперь можно из <a href="http://git.datacompboy.ru/?p=WavPlayer.git;a=summary">git репозитория</a>, просто нажав на ссылку желаемого формата рядом со словом snapshot.<br />
Изменения:<br />
  * Обновлена информация в README файле<br />
  * Теперь из JS доступны все функции, включая паузу/продолжение/позиционирование<br />
  * Добавлен новый код интеграции, предназначенный для создания просто проигрывателя. Смотрите в tinyembed.html<br />
  * Теперь вместо постоянно увеличивающегося по размеру архива дерева, он доступен из онлайн репозитория.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2010/01/27/wavplayer-1-7-1-full-js-api-and-support-for-reversed-order-bits-lu-and-la/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Умножение</title>
		<link>http://blog.datacompboy.ru/2009/12/03/%d1%83%d0%bc%d0%bd%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5/</link>
		<comments>http://blog.datacompboy.ru/2009/12/03/%d1%83%d0%bc%d0%bd%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 09:13:08 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[low-level programming]]></category>
		<category><![CDATA[8051]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=208</guid>
		<description><![CDATA[16битная математика для 8051 / ADuC847. Обычная и стандартная задача, встречающаяся сплошь и рядом. Просто? Давайте посмотрим.
Пусть у нас есть два 16битных беззнаковых числа во внутренней памяти: U1:U0 и V1:V0. Нужно вычислить их произведение, результат сложить в регистрах R0-R3.

R3:R2:R1:R0 = U1:U0 * V1:V0
Рассмотрим классический алгоритм вычисления этого произведения &#171;в столбик&#187;:
      [...]]]></description>
			<content:encoded><![CDATA[<p>16битная математика для 8051 / ADuC847. Обычная и стандартная задача, встречающаяся сплошь и рядом. Просто? Давайте посмотрим.<br />
Пусть у нас есть два 16битных беззнаковых числа во внутренней памяти: U1:U0 и V1:V0. Нужно вычислить их произведение, результат сложить в регистрах R0-R3.<br />
<span id="more-208"></span><br />
R3:R2:R1:R0 = U1:U0 * V1:V0<br />
Рассмотрим классический алгоритм вычисления этого произведения &laquo;в столбик&raquo;:</p>
<pre>       U1:U0
*      V1:V0
 -----------
+      U0*V0
+   V0*V1
+   U1*V0
+U1*V1
 -----------
 R3:R2:R1:R0</pre>
<p>Теперь закодируем его &laquo;в лоб&raquo;, и подсчитаем число циклов, требующиеся для вычисления:</p>
<table>
<tr>
<th colspan=3>Classic</th>
<th colspan=3>Classic+</th>
</tr>
<tr>
<th>Code</th>
<th>8051</th>
<th>ADuC847</th>
<th>Code</th>
<th>8051</th>
<th>ADuC847</th>
</tr>
<tr>
<td>MOV A, U1</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV R4, #0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV B, V1</td>
<td align=right>2</td>
<td align=right>3</td>
<td>MOV A, U1</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
<td>MOV B, V1</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
</tr>
<tr>
<td>MOV R3, B</td>
<td align=right>2</td>
<td align=right>2</td>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, U1</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV R3, B</td>
<td align=right>2</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV B, V0</td>
<td align=right>2</td>
<td align=right>3</td>
<td>MOV A, U1</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
<td>MOV B, V0</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADD A, B</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADD A, B</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADDC A, R4</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, U0</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV B, V1</td>
<td align=right>2</td>
<td align=right>3</td>
<td>MOV A, U0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
<td>MOV B, V1</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>ADD A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADD A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, B</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADDC A, B</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADDC A, R4</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, U0</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV B, V0</td>
<td align=right>2</td>
<td align=right>3</td>
<td>MOV A, U0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
<td>MOV B, V0</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>MOV R0, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
</tr>
<tr>
<td>MOV A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MOV R0, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADD A, B</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADD A, B</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADDC A, R4</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
<td>ADDC A, R4</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td></td>
<td align=right><strong>56</strong></td>
<td align=right><strong>71</strong></td>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td><strong>57</strong></td>
<td><strong>69</strong></td>
</tr>
</table>
<p>Итак, на классическом ядре 8051 этот алгоритм потребует 56 циклов по 12 тактов каждый = 672 такта, что при осциляторе 11059200 составит 60.76 микросекунд.<br />
У однотактового ядра ADuC847 некоторые операции требуют больше циклов, но каждый цикл = 1 такту. Так что 71 цикл = 71 такт. При стандартном часовом осциляторе 32768 и стандартном множителе в 48 (1.57 мегагерца) время вычисления составит 45 микросекунд. На максимальной скорости (множитель 384, 12.58 мегагерца) время вычисления будет 5.64 микросекунды.<br />
Быстро? Очень быстро. Но если мы возьмём вместо операции <code>ADDC A, #0</code> (2 цикла) операцию <code>ADDC A, R4</code> (1 цикл), и предварительно обнулим R4, то в случае ADuC847 удастся сэкономить еще 2 цикла (колонка Classic+) если R4 придётся обнулить в этом месте, и 4 цикла, если он уже был обнулен где-то выше.</p>
<p>А можно ли быстрее? Часто встречающийся 8051Math считает именно таким образом. Во всех проектах, что я писал &#8212; вычислялось именно так. Но&#8230; <em>Порядок имеет значение</em>. Рассмотрим вот этот код:</p>
<table>
<tr>
<th colspan=3>Opt1</th>
<td colspan=3>Opt1+</td>
</tr>
<tr>
<th>Code</th>
<th>8051</th>
<th>ADuC847</th>
<th>Code</th>
<th>8051</th>
<th>ADuC847</th>
</tr>
<tr>
<td>MOV A, U1</td>
<td>1</td>
<td>2</td>
<td>MOV A, U1</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>MOV B, V1</td>
<td>2</td>
<td>3</td>
<td>MOV B, V1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td>1</td>
<td>1</td>
<td>MOV R2, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV R3, B</td>
<td>2</td>
<td>2</td>
<td>MOV R3, B</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>MOV A, U0</td>
<td>1</td>
<td>2</td>
<td>MOV A, U0</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>MOV B, V0</td>
<td>2</td>
<td>3</td>
<td>MOV B, V0</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>MOV R0, A</td>
<td>1</td>
<td>1</td>
<td>MOV R0, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV R1, B</td>
<td>2</td>
<td>2</td>
<td>MOV R1, B</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>MOV A, U1</td>
<td>1</td>
<td>2</td>
<td>MOV R4, #0</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>MOV B, V0</td>
<td>2</td>
<td>3</td>
<td>MOV A, U1</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
<td>MOV B, V0</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>ADD A, R1</td>
<td>1</td>
<td>1</td>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td>1</td>
<td>1</td>
<td>ADD A, R1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td>1</td>
<td>1</td>
<td>MOV R1, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>ADDC A, B</td>
<td>1</td>
<td>2</td>
<td>MOV A, R2</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td>1</td>
<td>1</td>
<td>ADDC A, B</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td>1</td>
<td>1</td>
<td>MOV R2, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td>1</td>
<td>2</td>
<td>MOV A, R3</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td>1</td>
<td>1</td>
<td>ADDC A, R4</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV A, U0</td>
<td>1</td>
<td>2</td>
<td>MOV R3, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV B, V1</td>
<td>2</td>
<td>3</td>
<td>MOV A, U0</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
<td>MOV B, V1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>ADD A, R1</td>
<td>1</td>
<td>1</td>
<td>MUL AB</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td>1</td>
<td>1</td>
<td>ADD A, R1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td>1</td>
<td>1</td>
<td>MOV R1, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>ADDC A, B</td>
<td>1</td>
<td>2</td>
<td>MOV A, R2</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td>1</td>
<td>1</td>
<td>ADDC A, B</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td>1</td>
<td>1</td>
<td>MOV R2, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td>1</td>
<td>2</td>
<td>MOV A, R3</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td>1</td>
<td>1</td>
<td>ADDC A, R4</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td></td>
<td><strong>50</strong></td>
<td><strong>62</strong></td>
<td>MOV R3, A</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td><strong>51</strong></td>
<td><strong>62</strong></td>
</tr>
</table>
<p>Вуаля! 50 циклов вместо 56 для классического ядра (600 тактов, 54 микросекунды) и 62 цикла (от 39.4 до 4.9 микросекунд) для ADuC847. 10% ускорение просто за счет смены порядка операций: вычисляем сперва старшую половину, которую можно сохранить просто через MOV, вычисляем младшую половину, которую так же можно просто сохранить через MOV, и потом две средних половины. В результате, вместо 3х длинных сложений &#8211; остаётся два. К тому же, так как сложений осталось только два, исчезла разница между сложением с прямым нулём или регистром. Сэкономить на ADuC847 можно только если уже есть какой-либо нулевой регистр Rn.</p>
<p>Вспомним еще о методике быстрого умножения. При этом, для вычисления U*V используется такая формула:<br />
<code>U*V = (2<sup>2n</sup>+2<sup>n</sup>)*(U<sub>1</sub>*V<sub>1</sub>)+2<sup>n</sup>*(U<sub>1</sub>-U<sub>0</sub>)*(V<sub>0</sub>-V<sub>1</sub>)+(2<sup>n</sup>+1)*U<sub>0</sub>*V<sub>0</sub></code><br />
В отличие от классической<br />
<code>U*V = 2<sup>2n</sup>*U<sub>1</sub>*V<sub>1</sub>+2<sup>n</sup>*U<sub>1</sub>*V<sub>0</sub>+2<sup>n</sup>*U<sub>0</sub>*V<sub>1</sub>+U<sub>0</sub>*V<sub>0</sub></code><br />
В ней требуется только 3 умножения. Однако схема не применима для случая 16битной арифметики на ядре 51го процессора:</p>
<pre>R3:R2:R1:R0 = 0
R3:R2 += U1*V1
R2:R1 += U1*V1
R2:R1 += U0*V0
R1:R0 += U0*V0
    R2:R1 += (U1-U0)*(V0-V1) ! Signed
X=|U1-U0|	sX=sign(U1-U0)
Y=|V0-V1|	sY=sign(V0-V1)
sX=sY ?	R2:R1 += XY
sX!=sY ?	R2:R1 -= XY</pre>
<p>Как видим, при вычислении потребуется одно _знаковое_ умножение, которое реализуется исключительно через вычисление модуля и знака по отдельности, сравнения знаков и сложения или вычитания результата.</p>
<table>
<tr>
<th colspan=3>Fast1</th>
</tr>
<tr>
<th>Code</th>
<th>8051</th>
<th>ADuC847</th>
</tr>
<tr>
<td>MOV A, U1</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV B, V1</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R3, B</td>
<td align=right>2</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADD A, B</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, U0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV B, V0</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
</tr>
<tr>
<td>MOV R0, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADD A, B</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV F0, C</td>
<td align=right>2</td>
<td align=right>2</td>
</tr>
<tr>
<td>ADD A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ORL C, F0</td>
<td align=right>2</td>
<td align=right>2</td>
</tr>
<tr>
<td>ADDC A, B</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>CLR C</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, U1</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>SUBB A, U0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV F0, C</td>
<td align=right>2</td>
<td align=right>2</td>
</tr>
<tr>
<td>JNC L1</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>CPL A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>INC A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>CLR C</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>L1: MOV B, A</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV A, V0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>SUBB A, V1</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>JNC L2</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>CPL A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>INC A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>JC AA</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>ANL C, /F0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>JMP BB</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>AA: ORL C, F0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>BB: MOV F0, C</td>
<td align=right>2</td>
<td align=right>2</td>
</tr>
<tr>
<td>MUL AB</td>
<td align=right>4</td>
<td align=right>4</td>
</tr>
<tr>
<td>JB F0, Lsub</td>
<td align=right>2</td>
<td align=right>4</td>
</tr>
<tr>
<td>ADD A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, B</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>ADDC A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>JMP END</td>
<td align=right>2</td>
<td align=right>3</td>
</tr>
<tr>
<td>Lsub:</td>
<td></td>
<td></td>
</tr>
<tr>
<td>XCH A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>SUBB A, R1</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R1, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, B</td>
<td align=right>2</td>
<td align=right>2</td>
</tr>
<tr>
<td>XCH A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>SUBB A, R2</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV R2, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>MOV A, R3</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>SUBB A, #0</td>
<td align=right>1</td>
<td align=right>2</td>
</tr>
<tr>
<td>MOV R3, A</td>
<td align=right>1</td>
<td align=right>1</td>
</tr>
<tr>
<td>END:</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td align=right><strong>80</strong></td>
<td align=right><strong>104</strong></td>
</tr>
</table>
<p>Как видим, одно умножение &#8212; это 4 такта. Одно знаковое умножение &#8212; гораздо больше. Поэтому, заменив два беззнаковых умножения одним знаковым, потери составили 30 циклов для 8051 (32.5 микросекунды) и 42 цикла для ADuC847 (от 26.7 до 3.3 микросекунд).</p>
<p>Мораль сей басни такова: порядок имеет значения, и не всегда прямой лучше кривого. Экономьте с нами! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/12/03/%d1%83%d0%bc%d0%bd%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk records flash player &#8212; WavPlayer 1.6.1</title>
		<link>http://blog.datacompboy.ru/2009/11/29/asterisk-records-flash-player-wavplayer-1-6-1/</link>
		<comments>http://blog.datacompboy.ru/2009/11/29/asterisk-records-flash-player-wavplayer-1-6-1/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 10:12:42 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[voip]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[alaw]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[au]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[g711]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pcm]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>
		<category><![CDATA[ulaw]]></category>
		<category><![CDATA[wav]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=201</guid>
		<description><![CDATA[Продолжаем эпопею с прямым проигрыванием записанных asterisk&#8217;ом файлов. Новый релиз WavPlayer: 1.6.1.
Скачать полно дерево исходников WavPlayer-src-1.6.1.7z(463Kb) либо просто пример интеграции: WavPlayer-sample-1.6.1.tar.bz2(30Kb).
Update: WavPlayer 1.7.1

В новой версии:

Добавлен выбор интерфейса: однокнопочный (gui=lite) или с полосой позиционирования по файлу (gui=full).
Добавлена возможность ставить проигрывание на паузу и возобновлять проигрывание
Добавлена возможность позиционирования по загруженной части файла. В пределах 5 секунд от [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаем эпопею с прямым проигрыванием записанных asterisk&#8217;ом файлов. Новый релиз WavPlayer: 1.6.1.<br />
Скачать полно дерево исходников <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/11/WavPlayer-src-1.6.1.7z'>WavPlayer-src-1.6.1.7z</a>(463Kb) либо просто <a href="/u/WavPlayer/sample.html">пример интеграции</a>: <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/11/WavPlayer-sample-1.6.1.tar.bz2'>WavPlayer-sample-1.6.1.tar.bz2</a>(30Kb).</p>
<p><strong>Update</strong>: <a href="http://blog.datacompboy.ru/2010/01/27/wavplayer-1-7-1-full-js-api-and-support-for-reversed-order-bits-lu-and-la/">WavPlayer 1.7.1</a><br />
<span id="more-201"></span><br />
В новой версии:</p>
<ul>
<li>Добавлен выбор интерфейса: однокнопочный (gui=lite) или с полосой позиционирования по файлу (gui=full).</li>
<li>Добавлена возможность ставить проигрывание на паузу и возобновлять проигрывание</li>
<li>Добавлена возможность позиционирования по загруженной части файла. В пределах 5 секунд от текущего положения переход сразу, дальше идёт заново перересемплинг, поэтому позиционируется на нужное количество времени раньше, заполняя тишиной.</li>
<li>В события play/stop/pause/buffering добавлена информация о положении по файлу, для точной привязки JS интерфейса</li>
<li>Исправлена внутренняя структура проигрывателя, теперь читалки файлов выглядят так:
<pre>
       IFile < - File
               / | \
         FileAu  |  FileWav
              FileRaw
              /  ||  \
       FileAlaw /  \  FileSln
          FileGsm  FileUlaw</pre>
<p>вся логика работы вынесена в общий File, читатели FileAu и FileWav определяют только чтение заголовков, а FileRaw вообще определяет только метод проверки готов ли файл к считыванию, его наследники определяют все параметры статически в конструкторе.</pre>
</li>
<li>Все операции, производимые декодером ограничены по количеству обрабатываемых данных, держится декодированным только кеш +-5 секунд от текущего проигрываемого положения, за один присест из входящего потока копируется не более 64К данных, данные копируются по таймеру а не по приходу (это исправляет проблему работы в IE)</li>
<li>Приложил пример интеграции проигрывателя в страницу просмотра: <a href="/u/WavPlayer/sample.html">смотреть</a>.<br />
Система интеграции:</p>
<ul>
<li>В некую папку (у меня это ec/res/) складываются domready.js swfobject.js expressInstall.swf wavplayer.swf и wavplayer.js.</li>
<li>На странице должен быть некий якорный элемент (у меня это заголовок h3), после (внутрь, до, итп) которого будет встроен проигрыватель</li>
<li>И на странице должны быть ссылки на файлы с записями</li>
<li>Настраиваем wavplayer.js в самом конце:
<ul>
<li>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">WavPlayer</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> WavPlayer<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'WavPlayerBlock'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;Play&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p> &#8212; меняем &laquo;Play&raquo; на любую строку, на которую будут заменяться ссылки после загрузки проигрывателя</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> hs <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'h3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>hs.<span style="color: #660066;">length</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    hs <span style="color: #339933;">=</span> hs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    attachPoint <span style="color: #339933;">=</span> hs.<span style="color: #660066;">parentElement</span> <span style="color: #339933;">?</span> hs.<span style="color: #660066;">parentElement</span> <span style="color: #339933;">:</span> hs.<span style="color: #660066;">parentNode</span><span style="color: #339933;">;</span>
    attachAnchor <span style="color: #339933;">=</span> hs.<span style="color: #660066;">nextSibling</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
attachPoint.<span style="color: #660066;">insertBefore</span><span style="color: #009900;">&#40;</span>Player<span style="color: #339933;">,</span> attachAnchor<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Определяет точку подключения флешпроигрывателя. В моем случае &#8212; проигрыватель встраивается после единственного h3 на странице. Для вашего случая, написать как потребуется.</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> vars <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #003366; font-weight: bold;">var</span> params <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'scale'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'noscale'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'bgcolor'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'#FFFFFF'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
swfobject.<span style="color: #660066;">embedSWF</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;ec/res/wavplayer.swf?gui=full&amp;w=600&amp;h=20&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;WavPlayerBlock&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;600&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;20&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;10.0.32.18&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;/ec/res/expressInstall.swf&quot;</span><span style="color: #339933;">,</span> vars<span style="color: #339933;">,</span> params<span style="color: #339933;">,</span> params<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p> &#8212; задать пусть до проигрывателя и инсталлятора, настроить ширину и высоту проигрывателя (в двух местах &#8212; w=&#8230;&#038;h=&#8230; и два аргумента после WavPlayerBlock). Задать тип интерфейса (gui=full или gui=lite). Задать цвет фона проигрывателя, чтобы &laquo;сливался с окружением&raquo;. Если требуется, чтобы флеш-интерфейс был невидимым, задайте w=40&#038;h=40, но размеры (после WavPlayerBlock) &#8212; &laquo;0&#8243;, &laquo;0&#8243;.</li>
</ul>
</li>
<li>Вписываем в страницу со списком записей вызов нужных скриптов:

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;ec/res/domready.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;ec/res/swfobject.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;ec/res/wavplayer.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

</li>
</ul>
</li>
<li>Любые вопросы приветствуются :)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/11/29/asterisk-records-flash-player-wavplayer-1-6-1/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Теория и практика применения термосопротивления на ADuC847</title>
		<link>http://blog.datacompboy.ru/2009/11/10/aduc847-thermistor/</link>
		<comments>http://blog.datacompboy.ru/2009/11/10/aduc847-thermistor/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 19:05:01 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[low-level programming]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[8051]]></category>
		<category><![CDATA[assembler]]></category>
		<category><![CDATA[problems]]></category>
		<category><![CDATA[solutions]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=196</guid>
		<description><![CDATA[В прошлый раз, было описано как измерить температуру с помощью термопары. Термопара позволяет производить измерение в довольно широком диапазоне, но в случае, когда нужна высокая стабильность измерения и чуствительность к малым изменениям &#8212; применяют термосопротивления.
Термосопротивления работают в меньшем диапазоне (до 600 градусов в пределе), зато они описываются полиномом второй степени (третьей, если включать отрицательный диапазон), [...]]]></description>
			<content:encoded><![CDATA[<p>В <a href="http://blog.datacompboy.ru/2009/08/13/aduc847-adc-thermocouple/">прошлый раз</a>, было описано как измерить температуру с помощью термопары. Термопара позволяет производить измерение в довольно широком диапазоне, но в случае, когда нужна высокая стабильность измерения и чуствительность к малым изменениям &#8212; применяют термосопротивления.<br />
Термосопротивления работают в меньшем диапазоне (до 600 градусов в пределе), зато они описываются полиномом второй степени (третьей, если включать отрицательный диапазон), имеют очень высокую стабильность считываемого показания (поскольку сигнал измеряется десятками Ом на градус, а не милливольтами).<br />
<span id="more-196"></span><br />
Чтобы измерить температуру с помощью термосопротивления, нужно замерить его сопротивление, и по его передаточной характеристике определить температуру. Для измерения сопротивления через резистор пропускают ток и с помощью АЦП замеряют напряжение на резисторе. Не вдаваясь в схемотехнику, примем следующее: к паре AIN1-AIN2 подведены выводы с термосопротивления, к паре AIN3-AIN4 подведены выводы с опорного стабильного сопротивления. Через оба резистора идёт один и тот же ток. Теперь, чтобы получить текущее сопротивление терморезистора нужно сделать следующее:<br />
1. Измеряем напряжение на опорном сопротивлении. Uo=I*Ro (где Uo &#8212; напряжение опоры, Ro &#8212; опорное сопротивление).<br />
2. Измеряем напряжение на термосопротивлении. Uт=I*Rт.<br />
3. I = Uo/Ro, Rт = Uт/I = Uт/Uo * Ro<br />
Таким образом, чтобы выяснить текущее сопротивление нам нужно измерить отношение напряжений между опорным и измерительным резисторами и домножить на сопротивление опорного резистора. Поскольку операция деления является черезвычайно дорогой, воспользуемся тем, что пара AIN3-AIN4 может использоваться как опора. При этом, снимаемый код будет ни чем иным, как &laquo;какое напряжение имеет сигнал с пары, считая что опора на REFIN(или REFIN2) равна 2.5В&raquo;. То есть, измеренный сигнал приводится к &laquo;известной&raquo; опоре.</p>
<p>При этом следует помнить, что мы так же можем включить умножение измеряемого сигнала такое, чтобы полный диапазон температур использовал все доступные эффективные биты ацп. Следует так же помнить, что напряжение с опорного сопротивления желательно иметь близким, но не большим чем 2.5В.</p>
<p>В моем случае, опорное сопротивление составляет 5КОм (2 резистора по 10КОм в параллель), напряжение с опорного сопротивления около 2В.<br />
При этом, включив делитель измерения 0.064, полный диапазон температур (до 600 градусов) умещается во все 24 разряда АЦП.</p>
<p>В результате исследования шумов измерительного тракта, оказалось, что &laquo;осмысленными&raquo; являются толькол 14.5 бит измеряемого сигнала, что означает, что из измеряемых 24 разрядов можно использовать только старшие 16, так как младшие представляют собой только шум.</p>
<p>Итак, у нас есть опорное напряжение около 2В на AIN3-AIN4, термосопротивление (платина 100Ом) подключено к паре AIN1-AIN2, и мы хотим узнать температуру в градусах. Первым делом, нам нужно измерить отношение напряжения на термосопротивлении к опорному напряжению. Для этого</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADC0CON2<span style="color: #339933;">,</span> #<span style="color: #0000ff;">10001010b</span> <span style="color: #666666; font-style: italic;">; Измерение AIN1-AIN2 относительно AIN3-AIN4 (REFIN2)</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADC0CON1<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100011b</span> <span style="color: #666666; font-style: italic;">; Измерение 0...160mV (REF*0.064)</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCSF<span style="color: #339933;">,</span> #REQ_SF
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100100b</span> <span style="color: #666666; font-style: italic;">; Калибровка нуля</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100101b</span> <span style="color: #666666; font-style: italic;">; Калибровка максимума</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100010b</span> <span style="color: #666666; font-style: italic;">; Запросить 1 измерение на основном АЦП</span></pre></div></div>

<p>настраиваем основной ацп на измерение отношения к REFIN2, включаем подходящее усиление, настраиваем ацп (загружая заводские настройки) и запускаем измерение. После измерения, будет вызвано прерывание от АЦП (вектор 33H), где</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">; INTERRUPT from ADC</span>
         <span style="color: #000000; font-weight: bold;">ORG</span> <span style="color: #0000ff;">0033H</span>
ADCInt<span style="color: #339933;">:</span>  <span style="color: #00007f; font-weight: bold;">MOV</span> DataH<span style="color: #339933;">,</span> ADC0H <span style="color: #666666; font-style: italic;">; Термопару сохраняем в DataH/M/L</span>
         <span style="color: #00007f; font-weight: bold;">MOV</span> DataM<span style="color: #339933;">,</span> ADC0M
         <span style="color: #00007f; font-weight: bold;">MOV</span> DataL<span style="color: #339933;">,</span> ADC0L
         <span style="color: #00007f; font-weight: bold;">SETB</span> ADCReady    <span style="color: #666666; font-style: italic;">; И ставим бит ADCReady. Бит ADCBusy сбросит основная программа</span>
         CLR RDY0
         RETI</pre></div></div>

<p>,<br />
считываем код ацп и выходим. Итак, у нас есть измеренное с АЦП значение (Кт), которое представляет собой Uт, считая что Uо=2.5В, еще и усиленное.<br />
В числах, после удаления делителей, некратных степени двойки, получаем:<br />
   8000*Rт = 2*Rо*Кт / 256<br />
Взяв 2*Rо за калибровочный коэффициент (в случае использования идеальных компонент 2Rо = 10000), построим таблицу соответствия 8000*Rт => Температура. Для этого накидаем маленькую простенькую программку, которая через каждые 65536 значений для 8000*Rт выдаст соответствующую температуру. Аналогично прошлому разу, температуру будем задавать в квантах по 1/32 градуса (фиксированная двоичная точка в 5 бит).</p>
<p>В сухом остатке, у нас есть: таблица из 40 точек термосопротивления, между каждой из которых 65536 отсчетов, а сама таблица содержит линейную температуру в кельвинах (чтобы работать с беззнаковыми числами), код с АЦП и калибровочный коэффициент наклона. Дальше вычисления просты:<br />
1. Перемножаем 16бит кода АЦП на 16бит коэффициент. Из результата оставляем только 3 старших байта (для деления на 256 нужно отбросить младший байт).<br />
2. Из полученных 24 бит, старшие 8 бит &#8212; точка входа в таблицу (она построена через 65536 значения)<br />
3. Из таблицы выбираем пару чисел в точке входа, выбираем следующую пару и вычисляем разницу между следующей парой и текущей &#8212; получаем температурную длину диапазона<br />
4. Умножаем разницу по таблице на младшие 16бит произведения, считая только старшие 16 бит результата &#8212; получаем фактическую добавку температуры внутри диапазона<br />
5. Прибавляем к фактической добавке начало диапазона &#8212; мы определили температуру.</p>
<p>В коде это выглядит примерно так:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">CalcMainRes<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; Вычислить как термосопротивление</span>
    <span style="color: #666666; font-style: italic;">; В Data1 - напряжение на терморезисторе, относительно опоры</span>
    <span style="color: #666666; font-style: italic;">; U0 = I*R0; }  I=U0/R0</span>
    <span style="color: #666666; font-style: italic;">; U1 = I*R1; }  R1=U1/U0*R0</span>
    <span style="color: #666666; font-style: italic;">; где Data1 &lt; =&gt; U1, R0 = 5K, U0=2.5В</span>
    <span style="color: #666666; font-style: italic;">; ================================= Таблица температур в 40 точках через</span>
    <span style="color: #666666; font-style: italic;">; == 8000*R1 = [2R0]*Data1 / 256 == 65535 от 8000*R1</span>
    <span style="color: #666666; font-style: italic;">; ================================= Калибровочный 2R0 изначально 10000</span>
    <span style="color: #666666; font-style: italic;">; R2:R1:R0 = Data1*Coeff/256</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> Data1H <span style="color: #666666; font-style: italic;">;  R2:R1 = Data1H*CoeffH</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> CoeffH
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB
    <span style="color: #00007f; font-weight: bold;">MOV</span> R2<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">MOV</span> R1<span style="color: #339933;">,</span> A
    <span style="color: #666666; font-style: italic;">; ---</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> Data1M <span style="color: #666666; font-style: italic;">; R1:R0 = Data1M*CoeffH</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> CoeffH
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB
    <span style="color: #00007f; font-weight: bold;">MOV</span> R0<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R1
    <span style="color: #00007f; font-weight: bold;">MOV</span> R1<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> CMRNoOv1
    <span style="color: #00007f; font-weight: bold;">INC</span> R2
CMRNoOv1<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; ---</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> Data1H <span style="color: #666666; font-style: italic;">; R1:R0 = Data1H*CoeffL</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> CoeffL
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R0
    <span style="color: #00007f; font-weight: bold;">MOV</span> R0<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">JNC</span> CMRNoOv2
    <span style="color: #00007f; font-weight: bold;">INC</span> A
    <span style="color: #00007f; font-weight: bold;">JNZ</span> CMRNoOv2
    <span style="color: #00007f; font-weight: bold;">INC</span> R2
CMRNoOv2<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R1
    <span style="color: #00007f; font-weight: bold;">MOV</span> R1<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> CMRNoOv3
    <span style="color: #00007f; font-weight: bold;">INC</span> R2
CMRNoOv3<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; ---</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> Data1M <span style="color: #666666; font-style: italic;">; R0:Tmp = Data1M*CoeffL</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> CoeffL
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB
    <span style="color: #00007f; font-weight: bold;">JNB</span> ACC<span style="color: #339933;">.</span>7<span style="color: #339933;">,</span> CMRNoOv4
    <span style="color: #00007f; font-weight: bold;">INC</span> R0
    CJNE R0<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span><span style="color: #339933;">,</span> CMRNoOv4
    <span style="color: #00007f; font-weight: bold;">INC</span> R1
    CJNE R0<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span><span style="color: #339933;">,</span> CMRNoOv4
    <span style="color: #00007f; font-weight: bold;">INC</span> R2
CMRNoOv4<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R0
    <span style="color: #00007f; font-weight: bold;">JNC</span> CMRNoOv5
    <span style="color: #00007f; font-weight: bold;">INC</span> R1
    CJNE R1<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span><span style="color: #339933;">,</span> CMRNoOv5
    <span style="color: #00007f; font-weight: bold;">INC</span> R2
CMRNoOv5<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; R2:R1:R0 = [2R0]*Data1/256.</span>
    <span style="color: #666666; font-style: italic;">; R2 = Вход в таблицу термосопротивления</span>
    <span style="color: #666666; font-style: italic;">; R1:R0 = интерполянт в таблице</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R2
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R2 <span style="color: #666666; font-style: italic;">; A=2*R2</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> #LOW<span style="color: #009900; font-weight: bold;">&#40;</span>RTD_100_385<span style="color: #009900; font-weight: bold;">&#41;</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> #HIGH<span style="color: #009900; font-weight: bold;">&#40;</span>RTD_100_385<span style="color: #009900; font-weight: bold;">&#41;</span>
    ADDC A<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPH<span style="color: #339933;">,</span> A <span style="color: #666666; font-style: italic;">; DPTR=таблица</span>
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    <span style="color: #00007f; font-weight: bold;">MOV</span> R4<span style="color: #339933;">,</span> A
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    <span style="color: #00007f; font-weight: bold;">MOV</span> R5<span style="color: #339933;">,</span> A <span style="color: #666666; font-style: italic;">; R5:R4 = текущая точка таблицы</span>
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    CLR <span style="color: #000000; font-weight: bold;">C</span>
    SUBB A<span style="color: #339933;">,</span> R4
    <span style="color: #00007f; font-weight: bold;">MOV</span> R6<span style="color: #339933;">,</span> A <span style="color: #666666; font-style: italic;">; R7:R6 = разница следующей и текущей точек таблицы</span>
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    SUBB A<span style="color: #339933;">,</span> R5
    <span style="color: #00007f; font-weight: bold;">MOV</span> R7<span style="color: #339933;">,</span> A
    <span style="color: #666666; font-style: italic;">; ThermoHL = R5:R4+(R7:R6*R1:R0)/65536</span>
    <span style="color: #666666; font-style: italic;">; R7*R1 =&gt; ThermoHL</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R7
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> R1
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoH<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoL<span style="color: #339933;">,</span> A
    <span style="color: #666666; font-style: italic;">; R6*R1 =&gt; ThermoL:Tmp</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R6
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> R1
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB
    <span style="color: #00007f; font-weight: bold;">MOV</span> Tmp1<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> CRMTNoOv1
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH
CRMTNoOv1<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; R7*R0 =&gt; ThermoL:Tmp</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R7
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> R0
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> Tmp1
    <span style="color: #00007f; font-weight: bold;">JNB</span> ACC<span style="color: #339933;">.</span>7<span style="color: #339933;">,</span> CRMTNoOv2
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">JNZ</span> CRMTNoOv2
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH
CRMTNoOv2<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    ADDC A<span style="color: #339933;">,</span> ThermoL
    <span style="color: #666666; font-style: italic;">;MOV ThermoL, A</span>
    <span style="color: #00007f; font-weight: bold;">JNC</span> CRMTNoOv3
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH
CRMTNoOv3<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; THermoHL += R5:R4</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R4
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> CRMTNoOv4
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH
CRMTNoOv4<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R5
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> ThermoH
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoH<span style="color: #339933;">,</span> A
    <span style="color: #666666; font-style: italic;">; ThermoH вычислено</span>
    <span style="color: #00007f; font-weight: bold;">JMP</span> CalcEnd</pre></div></div>

<p>Отдельного внимания, конечно, заслуживает генератор таблицы&#8230; Однако, поскольку &laquo;математик&raquo; у меня только слово в дипломе, пытаться вывести обратный полином я не стал, а нарисовал просто итерационный процесс, который пробегает по одному градусу весь диапазон, на границах диапазона уточняя числа до 1e-5.<br />
Подробно приводить код не буду, смотрите в приложенном <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/11/gen_rtd.pl'>gen_rtd.pl</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/11/10/aduc847-thermistor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WavPlayer &#8212; flash player for asterisk sounds</title>
		<link>http://blog.datacompboy.ru/2009/10/19/wavplayer-flash-player-for-asterisk-sounds/</link>
		<comments>http://blog.datacompboy.ru/2009/10/19/wavplayer-flash-player-for-asterisk-sounds/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 09:16:14 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[voip]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[alaw]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[au]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[g711]]></category>
		<category><![CDATA[gsm]]></category>
		<category><![CDATA[player]]></category>
		<category><![CDATA[solutions]]></category>
		<category><![CDATA[ulaw]]></category>
		<category><![CDATA[wav]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=190</guid>
		<description><![CDATA[Всё, для полноты картины, в WavPlayer были внесены последние изменения:

Добавлена поддержка .alaw, .ulaw, .sln сырых файлов.
Добавлено вычисление длины записи, чтобы можно было выводить прогресс
Добавлены callback&#8217;и в js, таким образом можно сделать полноценный интерфейс на JS

Скачать его можно отсюда: wavplayer-1.2.tar
Теперь, и с README.txt внутри :)
Update: WavPlayer 1.7.1
Свежак: WavPlayer-1.6.1 с примером интеграции, возможностью позиционирования по файлу и [...]]]></description>
			<content:encoded><![CDATA[<p>Всё, для полноты картины, в WavPlayer были внесены последние изменения:</p>
<ul>
<li>Добавлена поддержка .alaw, .ulaw, .sln сырых файлов.</li>
<li>Добавлено вычисление длины записи, чтобы можно было выводить прогресс</li>
<li>Добавлены callback&#8217;и в js, таким образом можно сделать полноценный интерфейс на JS</li>
</ul>
<p>Скачать его можно отсюда: <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/10/wavplayer-1.2.tar.bz2'>wavplayer-1.2.tar</a><br />
Теперь, и с README.txt внутри :)<br />
<strong>Update</strong>: <a href="http://blog.datacompboy.ru/2010/01/27/wavplayer-1-7-1-full-js-api-and-support-for-reversed-order-bits-lu-and-la/">WavPlayer 1.7.1</a><br />
<strong>Свежак:</strong> <a href="http://blog.datacompboy.ru/2009/11/29/asterisk-records-flash-player-wavplayer-1-6-1/">WavPlayer-1.6.1</a> с примером интеграции, возможностью позиционирования по файлу и паузой.<br />
<span id="more-190"></span><br />
Поддерживает:</p>
<pre>
    Format | Codecs
    =====================================================================
    .au     G711u, G711a, PCM format, any samplerate/channels
    .wav    G711u, G711a, PCM, GSM 6.10 (MS) formats, any samplerate/channels
     .wav49 just alias of .wav, can content any of wav codecs
    .gsm    raw GSM 6.10
    .sln    raw PCM 16bit-signed 8kHz
     .raw   alias of .sln
    .alaw   raw G711a 8kHz mono
     .al    alias of .alaw
    .ulaw   raw G711u 8kHz mono
     .ul    alias of .ulaw
     .mu    alias of .ulaw
     .pcm   alias of .ulaw
    =====================================================================
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/10/19/wavplayer-flash-player-for-asterisk-sounds/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Комментарии&#8230;</title>
		<link>http://blog.datacompboy.ru/2009/10/18/%d0%ba%d0%be%d0%bc%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%80%d0%b8%d0%b8/</link>
		<comments>http://blog.datacompboy.ru/2009/10/18/%d0%ba%d0%be%d0%bc%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%80%d0%b8%d0%b8/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 13:10:39 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[problems]]></category>
		<category><![CDATA[Мысли]]></category>
		<category><![CDATA[реалии]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=183</guid>
		<description><![CDATA[Н-да. Обнаружил, что блог вообще не принимал комментарии, по причине того, что стоит за reverse proxy. Вроде бы исправил. Интересно, спам зафлудит блог или нет?
]]></description>
			<content:encoded><![CDATA[<p>Н-да. Обнаружил, что блог вообще не принимал комментарии, по причине того, что стоит за reverse proxy. Вроде бы исправил. Интересно, спам зафлудит блог или нет?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/10/18/%d0%ba%d0%be%d0%bc%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%80%d0%b8%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WavPlayer 1.1 &#8212; flash wav/au/gsm player</title>
		<link>http://blog.datacompboy.ru/2009/10/18/flash-wav-au-gsm-player/</link>
		<comments>http://blog.datacompboy.ru/2009/10/18/flash-wav-au-gsm-player/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 12:35:20 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[voip]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>
		<category><![CDATA[wav]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=179</guid>
		<description><![CDATA[Поскольку WavPlayer, который был разработан, в первую очередь предназначается для проигрывания файлов, записываемых Asterisk,то логично, что в рассылке всплыл впопрос: а играет ли он .wav49?
Update: WavPlayer 1.7.1
Свежак: выложен WavPlayer-1.2 с поддержкой RAW файлов: sln, alaw, ulaw и возможностью создания интерфейса на JS

Wav49 &#8212; это WAV, в котором записан GSM 6.10 кодек в MS формате. В [...]]]></description>
			<content:encoded><![CDATA[<p>Поскольку WavPlayer, который был <a href="http://blog.datacompboy.ru/2009/10/15/wav-au-flash-player/">разработан</a>, в первую очередь предназначается для проигрывания файлов, записываемых <a href="http://www.asterisk.org">Asterisk</a>,то логично, что в рассылке <a href="http://groups.asteriskpbx.ru/pipermail/users/2009-October/000175.html">всплыл впопрос</a>: а играет ли он .wav49?</p>
<p><strong>Update</strong>: <a href="http://blog.datacompboy.ru/2010/01/27/wavplayer-1-7-1-full-js-api-and-support-for-reversed-order-bits-lu-and-la/">WavPlayer 1.7.1</a><br />
<strong>Свежак:</strong> выложен <a href="http://blog.datacompboy.ru/2009/10/19/wavplayer-flash-player-for-asterisk-sounds/">WavPlayer-1.2</a> с поддержкой RAW файлов: sln, alaw, ulaw и возможностью создания интерфейса на JS<br />
<span id="more-179"></span></p>
<p>Wav49 &#8212; это WAV, в котором записан GSM 6.10 кодек в MS формате. В отличие от чистого gsm файла, в ms-gsm используется другой порядок записи параметров, и для записи два последовательных по 260 бит GSM фрейма упаковываются в 65 байт.<br />
В общем, формат очень и очень нужный, а посему WavPlayer был доработан, и теперь умеет проигрывать как wav49, так и чистые .gsm файлы.</p>
<p>Получить копию с исходниками можно тут: <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/10/wavplayer-1.1.tar.bz2'>wavplayer-1.1.tar.bz2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/10/18/flash-wav-au-gsm-player/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>С кем хотят поговорить на яндексе?</title>
		<link>http://blog.datacompboy.ru/2009/10/17/%d1%81-%d0%ba%d0%b5%d0%bc-%d1%85%d0%be%d1%82%d1%8f%d1%82-%d0%bf%d0%be%d0%b3%d0%be%d0%b2%d0%be%d1%80%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0-%d1%8f%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d0%b5/</link>
		<comments>http://blog.datacompboy.ru/2009/10/17/%d1%81-%d0%ba%d0%b5%d0%bc-%d1%85%d0%be%d1%82%d1%8f%d1%82-%d0%bf%d0%be%d0%b3%d0%be%d0%b2%d0%be%d1%80%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0-%d1%8f%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d0%b5/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 15:38:56 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[Бред]]></category>
		<category><![CDATA[реалии]]></category>
		<category><![CDATA[Юмор]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=176</guid>
		<description><![CDATA[Очень обширные пожелания у современного населения&#8230;
 
]]></description>
			<content:encoded><![CDATA[<p>Очень обширные пожелания у современного населения&#8230;<br />
<a href="http://blog.datacompboy.ru/wp-content/uploads/2009/10/want-talk.png"><img src="http://blog.datacompboy.ru/wp-content/uploads/2009/10/want-talk.png" alt="want-talk" title="want-talk" width="387" height="218" class="size-full wp-image-177" /></a> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/10/17/%d1%81-%d0%ba%d0%b5%d0%bc-%d1%85%d0%be%d1%82%d1%8f%d1%82-%d0%bf%d0%be%d0%b3%d0%be%d0%b2%d0%be%d1%80%d0%b8%d1%82%d1%8c-%d0%bd%d0%b0-%d1%8f%d0%bd%d0%b4%d0%b5%d0%ba%d1%81%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thread locking for JS</title>
		<link>http://blog.datacompboy.ru/2009/10/17/thread-locking-for-js/</link>
		<comments>http://blog.datacompboy.ru/2009/10/17/thread-locking-for-js/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 12:02:24 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[web programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=172</guid>
		<description><![CDATA[Define: var busy = 0; // In accessible context
Lock: if (++busy!=1) { &#8211;busy; return; }
Unlock: busy=0;
Один из лучших простых методов блокировки на JS. хотя и не идеальный &#8212; ++busy не атомарный :( поэтому теоритически может получиться так, что два кода одновременно начавших выполнять этот иф &#8212; и оба не выполнятся. но никогда не будет такого, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Define:</strong> var busy = 0; // In accessible context<br />
<strong>Lock:</strong> if (++busy!=1) { &#8211;busy; return; }<br />
<strong>Unlock:</strong> busy=0;<br />
Один из лучших простых методов блокировки на JS. хотя и не идеальный &#8212; ++busy не атомарный :( поэтому теоритически может получиться так, что два кода одновременно начавших выполнять этот иф &#8212; и оба не выполнятся. но никогда не будет такого, что оба выполняются.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/10/17/thread-locking-for-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WavPlayer &#8211; wav/au player on flash</title>
		<link>http://blog.datacompboy.ru/2009/10/15/wav-au-flash-player/</link>
		<comments>http://blog.datacompboy.ru/2009/10/15/wav-au-flash-player/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 15:59:53 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[low-level programming]]></category>
		<category><![CDATA[voip]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[au]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[g711]]></category>
		<category><![CDATA[haxe]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[pcm]]></category>
		<category><![CDATA[problems]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>
		<category><![CDATA[wav]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=167</guid>
		<description><![CDATA[При работе с телефонией частенько всплывают файлы, записанные в 8Khz, и кодированные в PCM/G.711a/G.711u. Что делать, если нужно обеспечить проигрывание этого файла с веба? Нужен wav/au flash player. Но флеш поддерживает только mp3&#8230;
Update: WavPlayer 1.7.1
Свежак: WavPlayer-1.6.1 с примером интеграции, возможностью позиционирования по файлу и паузой.
Свежак: выложен WavPlayer-1.2 с поддержкой RAW файлов: sln, alaw, ulaw и [...]]]></description>
			<content:encoded><![CDATA[<p>При работе с телефонией частенько всплывают файлы, записанные в 8Khz, и кодированные в PCM/G.711a/G.711u. Что делать, если нужно обеспечить проигрывание этого файла с веба? Нужен wav/au flash player. Но флеш поддерживает только mp3&#8230;</p>
<p><strong>Update</strong>: <a href="http://blog.datacompboy.ru/2010/01/27/wavplayer-1-7-1-full-js-api-and-support-for-reversed-order-bits-lu-and-la/">WavPlayer 1.7.1</a><br />
<strong>Свежак:</strong> <a href="http://blog.datacompboy.ru/2009/11/29/asterisk-records-flash-player-wavplayer-1-6-1/">WavPlayer-1.6.1</a> с примером интеграции, возможностью позиционирования по файлу и паузой.<br />
<strong>Свежак:</strong> выложен <a href="http://blog.datacompboy.ru/2009/10/19/wavplayer-flash-player-for-asterisk-sounds/">WavPlayer-1.2</a> с поддержкой RAW файлов: sln, alaw, ulaw и возможностью создания интерфейса на JS<br />
<strong>Свежак:</strong> выложен <a href="http://blog.datacompboy.ru/2009/10/18/flash-wav-au-gsm-player/">WavPlayer-1.1</a> с поддержкой GSM кодека.<br />
<span id="more-167"></span><br />
Единственный, найденный живым в природе флеш <a href="http://etcs.ru/blog/as3/wav_player/">плеер для wav</a> грузит весь файл целиком в память, поддерживает только PCM и только 44100 самплрейт (и кратный ему по степени двойки&#8230; вот только ресемплинг производит простым удвоением числа выборок, что создаёт очень мерзкий высокочастотный писк при прослушивании).</p>
<p>В результате, родился WavPlayer: флеш плеер, писаный на <a href="http://haxe.org/">haXe</a> (я не знаю ни actionscript ни haxe, но грузить haxe оказалось гораздо меньше, чем flex, к тому же флекс найти еще надо постараться). Флеш плеер проигрывает файл исключительно потоково (без запоминания проигранной части в памяти), поддерживает WAV (только RIFF и только содержащий одну data секцию) и AU файлы, кодированные в PCM произвольной битности (не обязательно 8/16) и с произвольным самплрейтом (не обязательно кратным 44100) либо в G.711 как u-Law так и a-Law. Поддерживаются как моно так и стерео файлы.</p>
<p>Интерфейса плеер не имеет (я не знаю флеша :) ) только одна кнопочка в форме стрелка &#8212; можно запустить, кружочек &#8212; идёт начальная буферизация, квадратик &#8212; идёт проигрывание и можно остановить.<br />
Поддерживает управление со стороны JavaScript: экспортированы функции <strong>doPlay(<em>filename</em>)</strong> запускающая проигрывание файла filename и <strong>doStop()</strong> останавливающая проигрывание.</p>
<p>Собственно, .wav и .au файлы, которые создаёт <a href="http://www.asterisk.org/">Asterisk</a> прекрасно им проигрываются.</p>
<p>Пользуйтесь на здоровье: <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/10/wavplayer-1.0.tar.bz2'>wavplayer-1.0.tar.bz2</a><br />
Патчи/комментарии приветствуются.</p>
<hr />
<p>Here: <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/10/wavplayer-1.0.tar.bz2'>wavplayer-1.0.tar.bz2</a> you can get wav/au flash player, written in <a href="http://haxe.org/">haXe</a>, that able to play WAV and AU files, created by <a href="http://www.asterisk.org/">Asterisk</a>. It supports WAV with only one data section, in G.711 aLaw/uLaw or any bitlength PCM as well as AU files in G711/PCM formats. File can be in any samplerate, and nicely resampled to 44100 with Lanczos resampler. Files played in streamed mode &#8212; playback starts as soon as data available.</p>
<p>Player supports url argument <strong>?sound=<em>somefile.au</em></strong> to pass initial filename, that will be used if user clicks on &laquo;play&raquo; button.<br />
From javascript accessible two functions: <strong>doPlay(<em>filename</em>)</strong>, that start playing specifed file or last if not specifed, and <strong>doStop()</strong>, that stops currently playing sound.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/10/15/wav-au-flash-player/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Вывод списка в табличной форме</title>
		<link>http://blog.datacompboy.ru/2009/10/03/%d0%b2%d1%8b%d0%b2%d0%be%d0%b4-%d1%81%d0%bf%d0%b8%d1%81%d0%ba%d0%b0-%d0%b2-%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%87%d0%bd%d0%be%d0%b9-%d1%84%d0%be%d1%80%d0%bc%d0%b5/</link>
		<comments>http://blog.datacompboy.ru/2009/10/03/%d0%b2%d1%8b%d0%b2%d0%be%d0%b4-%d1%81%d0%bf%d0%b8%d1%81%d0%ba%d0%b0-%d0%b2-%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%87%d0%bd%d0%be%d0%b9-%d1%84%d0%be%d1%80%d0%bc%d0%b5/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 09:16:51 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[web programming]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[problems]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=137</guid>
		<description><![CDATA[Достаточно часто встречается в современной семантической верстке проблема: логически, есть список элементов. А визуально дизайнер хочет разместить это в виде таблички. Что же делать? Выдавать на-гора обертки дива за дивом, и ставить им display:table? Отказываться от семантики?

Давайте рассмотрим стандартные проблемы и стандартные решения.
1. Элементы равного размера
Самый простейший случай &#8212; все элементы равного размера. Например &#8212; [...]]]></description>
			<content:encoded><![CDATA[<p>Достаточно часто встречается в современной семантической верстке проблема: логически, есть список элементов. А визуально дизайнер хочет разместить это в виде таблички. Что же делать? Выдавать на-гора обертки дива за дивом, и ставить им display:table? Отказываться от семантики?<br />
<span id="more-137"></span><br />
Давайте рассмотрим стандартные проблемы и стандартные решения.</p>
<h2>1. Элементы равного размера</h2>
<p>Самый простейший случай &#8212; все элементы равного размера. Например &#8212; это просто матрица фотографий в альбоме.<br />
Решение классическое, известное давно: элементы в списке перечисляем построчно, каждому элементу списка ставим float:left с фиксированными размерами, всему UL&#8217;у &#8212; clearfix. В результате, код:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">&lt;style<span style="color: #00AA00;">&gt;</span>
  <span style="color: #6666ff;">.l1</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">list-style-type</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">300px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
  <span style="color: #6666ff;">.l1</span> li <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">100px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">100px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">hidden</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
&lt;/style<span style="color: #00AA00;">&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;l1&quot;</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span></pre></div></div>

<p>Создаст желаемый эффект:</p>
<style>
  .l1 { list-style-type: none; margin: 0; padding: 0; width: 300px; zoom:1; }
  .l1:after { display: block; content: "."; height: 0; visibility: hidden; clear: both; }
  .l1 li { float: left; width: 100px; height: 100px; overflow: hidden; }
</style>
<ul class="l1">
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
</ul>
<p>При таком решении главным плюсом является легкая резиновость: все li однородные, поэтому размер ul&#8217;а не обязан быть жестким, однако не стоит забывать о overflow: hidden, примененнные к li &#8212; если не поставить, а содержимое может заполнять юзер (например, подпись под картинкой), легко можем получить вот такой эффект:</p>
<style>
  .l2 { list-style-type: none; margin: 0; padding: 0; width: 300px; }
  .l2:after { display: block; content: "."; height: 0; visibility: hidden; clear: both; }
  .l2 li { float: left; width: 100px; height: 120px; }
  .l2 li p { margin: 0; padding: 0; }
</style>
<ul class="l2">
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 1</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 2. С длинным-предлинным описанием, о котором пользователь не позаботился.</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 3</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 4</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 5</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 6</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 7</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 8</p>
</li>
</ul>
<h2>2. Элементы разной высоты</h2>
<p>Если элементы разной высоты, то применение решения №1 &laquo;в лоб&raquo; (убрав height и overflow с li) даёт очень некрасивый эффект: флоаты выстраиваются по им удобному положению.</p>
<style>
  .l3 { list-style-type: none; margin: 0; padding: 0; width: 300px; }
  .l3:after { display: block; content: "."; height: 0; visibility: hidden; clear: both; }
  .l3 li { float: left; width: 100px; }
  .l3 li p { margin: 0; padding: 0; }
</style>
<ul class="l3">
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 1</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 2. С длинным-предлинным описанием.</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 3</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 4</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 5</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 6</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 7</p>
</li>
<li><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 8</p>
</li>
</ul>
<p>К сожалению, я не знаю беcскриптового решения, которое позволило бы выстроить такой список с помощью унифицированного задания исходного списка, да еще и с резиной по ширине. Зато есть простое решение, которое позволит выстроить такой список в нужное число колонок. Покажу на примере трех колонок, Список генерируем с пометкой каждого li к какой колонке он относится.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;l4&quot;</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col1&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Картинка 1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col2&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Картинка 2. С длинным-предлинным описанием.<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col3&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Картинка 3<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col1&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Картинка 4. С неким описанием.<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col2&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col3&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Картинка 6<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col1&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Картинка 7<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
   <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;col2&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/wp-admin/images/date-button.gif&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> heght<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;100&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Картинка 8<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span></pre></div></div>

<p>Итак, теперь позаботимся о стилях. Во-1х, сделаем сам список &#8212; контейнером для нашей &laquo;таблицы&raquo; (то есть зададим ему желаемый width, уберём паддинги и буллеты, и добавим клеарфикс)</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">  <span style="color: #6666ff;">.l4</span> <span style="color: #00AA00;">&#123;</span> 
     <span style="color: #000000; font-weight: bold;">list-style-type</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> 
     <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> 
     <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> 
     <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">300px</span><span style="color: #00AA00;">;</span> 
  <span style="color: #00AA00;">&#125;</span>
  <span style="color: #6666ff;">.l4</span><span style="color: #3333ff;">:after </span><span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">visibility</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">hidden</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">content</span><span style="color: #00AA00;">:</span> <span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">clear</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">both</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Элементы этого списка так же делаем флоатами, аналогично пункту №1. Не забываем ставить желаемый width, причем такой, чтобы в сумме они составляли нужную ширину (33%, например, для 3х колонок будет работать; но 50% для двух колонок может давать очень интересный эффект в некоторых браузерах, которые 50%+50% могут насчитать 100%+1px)</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">  <span style="color: #6666ff;">.l4</span> li <span style="color: #00AA00;">&#123;</span> 
     <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
     <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">33</span>%</span><span style="color: #00AA00;">;</span>
  <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>И теперь самое главное: обеспечим правильное выставление этих флоатов по максимальной высоте предыдущей строки. Для обычных, &laquo;вменяемых&raquo; браузеров, это достигается легко и просто:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">  <span style="color: #6666ff;">.l4</span> li<span style="color: #6666ff;">.col1</span> <span style="color: #00AA00;">&#123;</span> 
     <span style="color: #000000; font-weight: bold;">clear</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
  <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Однако, у нас есть парочка аутсайдеров, с которых пользователи до сих пор не слезают из-за религиозных соображений и желания нахватать побольше вирусов. Поэтому, необходимо вылечить еще IE7 и IE6. Чтобы перестал себя вести нехорошо IE7 достаточно последний элемент в строке сделать не-float&#8217;ом, тогда он встанет где надо за счет того что остальные флоаты его сдвинут, а так как он не флоат, то клеар на следующей строке перестанет взрывать моск. Но этого недостаточно для IE6. В случае, если размеры каждой &laquo;ячейки&raquo; по ширине заданы в процентах, то IE6 посчитает эти проценты не от всей ширины ul&#8217;а, а от свободного пространства. Поэтому либо задавать жесткий width для каждой li, либо поставить для IE6 width в 100%.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">    &lt;!--<span style="color: #00AA00;">&#91;</span>if lt IE <span style="color: #cc66cc;">8</span><span style="color: #00AA00;">&#93;</span><span style="color: #00AA00;">&gt;</span>&lt;style<span style="color: #00AA00;">&gt;</span>
        <span style="color: #6666ff;">.l4</span> li<span style="color: #6666ff;">.col3</span> <span style="color: #00AA00;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
        <span style="color: #00AA00;">&#125;</span>
        <span style="color: #00AA00;">*</span> html <span style="color: #6666ff;">.l4</span> li<span style="color: #6666ff;">.col3</span> <span style="color: #00AA00;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">100</span>%</span><span style="color: #00AA00;">;</span>
        <span style="color: #00AA00;">&#125;</span>
    &lt;/style<span style="color: #00AA00;">&gt;</span>&lt; !<span style="color: #00AA00;">&#91;</span>endif<span style="color: #00AA00;">&#93;</span>--<span style="color: #00AA00;">&gt;</span></pre></div></div>

<p>И вот что получаем в итоге:</p>
<style>
  .l4 { list-style-type: none; margin: 0; padding: 0; width: 300px; }
  .l4:after { display: block; visibility: hidden; height: 0; content: "."; clear: both; }
  .l4 li { float: left; width: 33%; }
  .l4 li.col1 { clear: left;  }
</style>
<p>    <!--[if lt IE 8]><br />
<style>
        .l4 li.col3 { float: none; }
        * html .l4 li.col3 { width: 100%; }
    </style>
<p>< ![endif]--></p>
<ul class="l4">
<li class="col1"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 1</p>
</li>
<li class="col2"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 2. С длинным-предлинным описанием.</p>
</li>
<li class="col3"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 3</p>
</li>
<li class="col1"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 4. С неким описанием.</p>
</li>
<li class="col2"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" /></li>
<li class="col3"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 6</p>
</li>
<li class="col1"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 7</p>
</li>
<li class="col2"><img src="/wp-admin/images/date-button.gif" width="100" heght="100" />
<p>Картинка 8</p>
</li>
</ul>
<h2>3. Другие варианты</h2>
<p>Решение (на чистом CSS) выравнивания списка в таблицу в случае неравной (заранее неизвестной) ширины элементов мне неизвестно. Если кто знает &#8212; буду черезвычайно рад услышать. Впрочем, как и решение пункта№2 для жесткой ширины элементов и меняемого от растягивания числа колонок.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/10/03/%d0%b2%d1%8b%d0%b2%d0%be%d0%b4-%d1%81%d0%bf%d0%b8%d1%81%d0%ba%d0%b0-%d0%b2-%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%87%d0%bd%d0%be%d0%b9-%d1%84%d0%be%d1%80%d0%bc%d0%b5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Skype API on Linux</title>
		<link>http://blog.datacompboy.ru/2009/09/22/skype-api-on-linux/</link>
		<comments>http://blog.datacompboy.ru/2009/09/22/skype-api-on-linux/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 17:27:21 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[voip]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[dbus]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[problems]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[skype]]></category>
		<category><![CDATA[solutions]]></category>
		<category><![CDATA[реалии]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=132</guid>
		<description><![CDATA[Волею судеб, идёт сейчас крупная битва за урожай борьба с подъёмом и рулением Skype клиентами под Linux. Посольку Naked Skype так и остался только спекой, приходится жить со стандартным клиентом.

Согласно &#171;Skype API on Linux&#187;, есть два метода подключения: X11 и DBUS.
Skypiax использует X11. Глубокий дебаггинг выявил очень неприятную особенность: у сообщений X11 не гарантируется порядок [...]]]></description>
			<content:encoded><![CDATA[<p>Волею судеб, идёт сейчас крупная <strike>битва за урожай</strike> борьба с подъёмом и рулением Skype клиентами под Linux. Посольку <a href="https://developer.skype.com/wiki/NakedSkype">Naked Skype</a> так и остался только спекой, приходится жить со стандартным клиентом.<br />
<span id="more-132"></span><br />
Согласно <a href="https://developer.skype.com/Docs/ApiDoc/Skype_API_on_Linux">&laquo;Skype API on Linux&raquo;</a>, есть два метода подключения: X11 и DBUS.</p>
<p><a href="http://wiki.freeswitch.org/wiki/Skypiax">Skypiax</a> использует X11. Глубокий дебаггинг выявил очень неприятную особенность: у сообщений X11 не гарантируется порядок их отправки. Так, если в WinAPI <a href="http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx">sendmessage</a> гарантирует, что сообщения будут доставлены в том порядке, как их отправляли, то в X11 все события, отправленные в одно время считаются одновременными и могут быть доставлены в произвольном порядке.<br />
Вкратце, Skype API через X11 работает на отправке сообщения разбивая его на куски по 20 байт и отсылая подряд события<br />
<code>  SKYPECONTROLAPI_MESSAGE_BEGIN + 20 байт сообщения<br />
  SKYPECONTROLAPI_MESSAGE + следующие 20 байт<br />
  SKYPECONTROLAPI_MESSAGE + следующие 20 байт<br />
  ...<br />
  SKYPECONTROLAPI_MESSAGE + последние байты</code><br />
При этом, XSync (для гарантированной отправки всех заготовленных сообщений) вызывается ПОСЛЕ создания всех событий. В результате, приложение может получить события вместо<br />
<code>  MSG_BEGIN("Some ") MSG("test ") MSG("messa") MSG("ge")</code><br />
начиная от<br />
<code>  MSG("test ") MSG("messa") MSG_BEGIN("Some ") MSG("ge")</code><br />
и заканчивая<br />
<code>  MSG_BEGIN("Some ") MSG("messa") MSG("test ") MSG("ge")</code><br />
Если в первом случае сразу видно что сообщени ошибочное (пришел некий текст до BEGIN), то в последнем случае восстанавливается сообщение &laquo;Some messatest ge&raquo; вместо &laquo;Some test message&raquo; и никакого способа 100% сказать что это правильное сообщение &#8212; нет.</p>
<p>Это так, если не считать что у сообщения, длина которого кратна 20 байтам, невозможно определить его конец (кроме как поймать следующий BEGIN, который может быть через неопределённое время)&#8230;</p>
<p>Вывод напрашивается сам собой: Skype API on Linux via X11 messaging &#8212; <strong>нельзя</strong> использовать вообще.</p>
<hr />
Теперь рассмотрим DBUS messaging. <a href="http://dbus.freedesktop.org/">DBUS</a> это стандарт объектно-ориентированного IPC, рожденный изначально для Gnome, позже внедренный и в KDE, и теперь широко и с удовольствием используемый много где.<br />
При общении через DBUS, в системе запускается специальный DBUS daemon, который как производит регистрацию сервисов, авторизацию клиентов, проверку фильтрации сообщений для передачи их желающим и так далее.</p>
<p>Для работы с ним существует low-level библиотека на базе libdbus, и многочисленные биндинги к высокоуровневым языкам. Причем, даже для C <a href="http://dbus.freedesktop.org/doc/dbus/libdbus-tutorial.html">рекомендуется</a> использовать вместо libdbus &#8212; <a href="http://dbus.freedesktop.org/doc/dbus-glib/index.html">GLib Bindings</a>. Впрочем, я предпочел непослушаться, и взял именно libdbus.</p>
<p>В моем случае, задача проста: есть &laquo;сессионный&raquo; dbus, есть Skype клиент, нужно иметь возможность отправить сообщение скайпу и получить от него ответ. И то и другое &#8212; асинхронно (в разных потоках), в качестве замещения X11 протокола. (Кстати, не верьте сайту &#8212; у скайп-клиента нет ни &laquo;&#8211;enable-dbus&raquo; ни &laquo;&#8211;use-system-dbus&raquo; опций &#8212; он всегда запускается с поддержкой dbus и всегда подключается к текущему dbus сессии).</p>
<p>Продолжая радоваться полноте, корректности и информативности документации скайпа скажу, что dbus example in Python &#8212; во-1х устарел (ибо теперь в dbus-python нет get_service, да и dbus.Object теперь dbus.service.Object), во-2х проверяет существование скайпа аж через получение всех сервисов и проверки &laquo;а нет ли там com.Skype.API&raquo;. Это вместо NameHasOwner). А еще добавлю, что &laquo;dbus example in C&raquo; читать как &laquo;dbus example in C++&raquo; &#8212; что сильно меняет смысл.</p>
<hr />
Итак, переходим к собственно коду. Благодаря отличному <a href="http://dbus.freedesktop.org/doc/dbus/libdbus-tutorial.html">стартапному туториалу для libdbus</a> Удалось нарожать следующее, прекрасно работающее замещение X11->DBUS:</p>
<p><strong>1. Проверка доступности скайпа.</strong><br />
Скайп при запуске регистрирует себе имя com.Skype.API &#8212; а потому, проверка тривиальна:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">bool skype_present<span style="color: #009900;">&#40;</span>DBusConnection<span style="color: #339933;">*</span> conn<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> dbus_bus_name_has_owner<span style="color: #009900;">&#40;</span>SkypiaxHandles<span style="color: #339933;">-&gt;</span>dbus<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;com.Skype.API&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>2. Отправка сообщения скайпу.</strong><br />
Для отправки сообщения скайпу предлагается дёргать Invoke метод по пути /com/Skype у NULL интерфейса (интерфейс не надо указывать).<br />
При этом ответ на конкретно это сообщение придёт в ответе на Invoke &#8212; а нам надо Async отправка. Значит, нужно отсылать событие method_call без ожидания ответа:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> query<span style="color: #009900;">&#40;</span>DBusConnection<span style="color: #339933;">*</span> conn<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> param<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   DBusMessage<span style="color: #339933;">*</span> msg<span style="color: #339933;">;</span>
   DBusMessageIter args<span style="color: #339933;">;</span>
   DBusError err<span style="color: #339933;">;</span>
   <span style="color: #993333;">int</span> ret<span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Calling remote method with %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> param<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// initialiset the errors</span>
   dbus_error_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>err<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// create a new method call and check for errors</span>
   msg <span style="color: #339933;">=</span> dbus_message_new_method_call<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;com.Skype.API&quot;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// target for the method call</span>
                                      <span style="color: #ff0000;">&quot;/com/Skype&quot;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// object to call on</span>
                                      NULL<span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// interface to call on</span>
                                      <span style="color: #ff0000;">&quot;Invoke&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// method name</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>NULL <span style="color: #339933;">==</span> msg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Message Null<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// append arguments</span>
   dbus_message_iter_init_append<span style="color: #009900;">&#40;</span>msg<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>dbus_message_iter_append_basic<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>args<span style="color: #339933;">,</span> DBUS_TYPE_STRING<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>param<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Out Of Memory!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Sending...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #666666; font-style: italic;">// send message without any reply waiting</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>dbus_connection_send<span style="color: #009900;">&#40;</span>conn<span style="color: #339933;">,</span> msg<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ret<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Out Of Memory!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   dbus_connection_flush<span style="color: #009900;">&#40;</span>conn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Request sent, serial=%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> ret<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// free message</span>
   dbus_message_unref<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Вообще, при отправке сообщения мы получаем serial, по которому позже можем из входящих событий через get_reply_serial выяснить что ответ был именно на это сообщение &#8212; но нам оно не надо. Главное &#8212; мы асинхронно отправили сообщение скайпу, а когда и как он нам ответит тут не особо важно. За счет того, что вызывается dbus_connection_flush, мы можем быть уверены, что сообщение ушло в трубу и будет обработано скайпом, а не просто соскладируется внутри libdbus.</p>
<p><strong>3. Получение ответов и инициированных скайпом событий.</strong><br />
Все ответы на вызванные нами команды будут возвращаться в форме сообщений типа method_return, у которых будет destination= наш ID в трубе и reply-serial равен serial запроса.<br />
Все события, инициированные скайпом придут как method_call сообщение на метод Notify у /com/Skype/Client. Единственное, я не разобрался следует ли на эти вызовы отвечать чем-либо или скайп вызывает с необязательным возвратом &#8212; поэтому отвечаю просто нулем.</p>
<p>Для асинхронного получения от скайпа поднимается отдельный поток, который только и делает что мониторит подключение на предмет нужных нам событий. А потому поток выглядит так:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span><span style="color: #339933;">*</span> receive<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span> arg<span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// arg is bus connection</span>
<span style="color: #009900;">&#123;</span>
   DBusMessage<span style="color: #339933;">*</span> msg<span style="color: #339933;">;</span>
   DBusMessageIter args<span style="color: #339933;">;</span>
   DBusConnection<span style="color: #339933;">*</span> conn<span style="color: #339933;">;</span>
   DBusError err<span style="color: #339933;">;</span>
   <span style="color: #993333;">int</span> ret<span style="color: #339933;">;</span>
   <span style="color: #993333;">char</span><span style="color: #339933;">*</span> sigvalue<span style="color: #339933;">;</span>
   <span style="color: #993333;">char</span> filter<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Listening for signals<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// initialise the errors</span>
   dbus_error_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>err<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// connect to the bus and check for errors</span>
   conn <span style="color: #339933;">=</span> dbus_connection_ref<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>DBusConnection<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>arg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>NULL <span style="color: #339933;">==</span> conn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Обратите внимание &#8212; мы не просто пользуем соединение, а &laquo;клонируем&raquo; его, чтобы поток работал со спокойной совестью, зная что содениение не пропадёт если вдруг главный поток закроет его (главному потоку надо будет просто сигнализировать читателю чтобы он закрыл соединение с dbus. Если же вам удобнее просто прибить поток-приемник &#8212; можно dbus_connection_ref не вызывать, а прибивать читателя до закрытия соединения).<br />
Затем настраиваем фильтры на прием сообщений &#8212; нам нужны только method_call и method_return у которых destination= нам.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">   <span style="color: #666666; font-style: italic;">// add a rule for which messages we want to see</span>
   sprintf<span style="color: #009900;">&#40;</span>filter<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;type='method_call',destination='%s'&quot;</span><span style="color: #339933;">,</span> dbus_bus_get_unique_name<span style="color: #009900;">&#40;</span>conn<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   dbus_bus_add_match<span style="color: #009900;">&#40;</span>conn<span style="color: #339933;">,</span> filter<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>err<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   sprintf<span style="color: #009900;">&#40;</span>filter<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;type='method_return',destination='%s'&quot;</span><span style="color: #339933;">,</span> dbus_bus_get_unique_name<span style="color: #009900;">&#40;</span>conn<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   dbus_bus_add_match<span style="color: #009900;">&#40;</span>conn<span style="color: #339933;">,</span> filter<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>err<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   dbus_connection_flush<span style="color: #009900;">&#40;</span>conn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dbus_error_is_set<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>err<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Match Error (%s)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> err.<span style="color: #202020;">message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Match rule sent<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Обратите внимание &#8212; такой подход допустим только в том случае, если никто больше с вами не будет связываться по этому соединению. В ином случае, понадобится добавить фильтр по source=&#8217;:XXX&#8217;, где :XXX &#8212; это Dbus Unique Name конкретной инстанции скайпа.</p>
<p>После чего можно переходить в &laquo;бесконечный&raquo; цикл чтения:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">   <span style="color: #666666; font-style: italic;">// loop listening for signals being emmitted</span>
   <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> arg<span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// non blocking read of the next available message</span>
      dbus_connection_read_write<span style="color: #009900;">&#40;</span>conn<span style="color: #339933;">,</span> <span style="color: #0000dd;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      msg <span style="color: #339933;">=</span> dbus_connection_pop_message<span style="color: #009900;">&#40;</span>conn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// loop again if we haven't read a message</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>NULL <span style="color: #339933;">==</span> msg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>dbus_message_get_args<span style="color: #009900;">&#40;</span>msg<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>err<span style="color: #339933;">,</span> DBUS_TYPE_STRING<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>arg<span style="color: #339933;">,</span> DBUS_TYPE_INVALID<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Skype says: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> arg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// free the message</span>
      dbus_message_unref<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Процедура проста: зависаем в чтении (ненулевой таймаут необходим, чтобы когда нечего читать, а соседний поток засунул на запись что-либо, это что-либо таки реально ушло в трубу). Получив сообщение, пытаемся достать оттуда один строковый аргумент &#8212; и если достаём, то обрабатываем его как сообщение/ответ от скайпа.</p>
<p>Некоторые технические запрос/ответы в процессе установления соединения тоже возвращают ответы с одной строкой &#8212; это просто следует учитывать в логике обработки протокола скайпа, и игнорировать неизвестные сообщения (что так и так следует делать, ибо скайп в некий момент может ввести событие в протокол, которе нам никак не надо). Реально, в случае с текущим скайпом и текущим DBUS сервисом, если требуется по шине исключительно со скайпом, то получается только одно лишнее сообщение &#8212; :XXX, где XXX это наше уникальное имя &#8212; что никак не влияет на протокол общения, зато все сообщения к и от скайпа доставляются в целости, сохранности и сразу.</p>
<p>Не нужно гадать на кофейной гуще &laquo;сообщение&raquo; это или &laquo;соониебще&raquo;. Да и пришло оно целиком, или просто следующее &laquo;протолкнуло&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/09/22/skype-api-on-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hardware рулит, или о пользе гистерезиса.</title>
		<link>http://blog.datacompboy.ru/2009/09/04/hysteresis/</link>
		<comments>http://blog.datacompboy.ru/2009/09/04/hysteresis/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 13:46:54 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[web programming]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[problems]]></category>
		<category><![CDATA[Мысли]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=126</guid>
		<description><![CDATA[Практически все аппаратные системы обладают гистерезисом: отставанием реакции на приложенные силы. Когда-то это плохо (например, передавать сигнал без сдвига фазы), когда-то это используют (те же магнитные способы записи).
Но не мешало бы об этом вспоминать и при разработке софта! На днях столкнулся с очень отвратительным поведением Firefox: если по hover размер блока изменяется, и при этом [...]]]></description>
			<content:encoded><![CDATA[<p>Практически все аппаратные системы обладают <a href="http://ru.wikipedia.org/wiki/Гистерезис">гистерезисом</a>: отставанием реакции на приложенные силы. Когда-то это плохо (например, передавать сигнал без сдвига фазы), когда-то это используют (те же магнитные способы записи).<br />
Но не мешало бы об этом вспоминать и при разработке софта! На днях столкнулся с очень отвратительным поведением Firefox: если по hover размер блока изменяется, и при этом объект уходит из-под мыши &#8212; блок теряет hover. Возвращается к прошлым размерам и снова применяет hover. Некрасиво.</p>
<p>попробуйте сами, наведите на правый край этого квадрата:</p>
<style>
  a#test { display: block; border: 1px solid red; width: 100px; height: 100px; background: blue; }
  a#test:hover { display: block; border: 1px solid red; width: 50px; height: 100px; background: blue; }
</style>
<p><a id="test" href="test">test</a></p>
<p>Кстати опера работает лучше: потерю hover она отрабатывает, но восстановление после этого hover опять игнорируется. Хотя решение всё равно не идеальное &#8212; прыгает при движении мыши. Что, в общем-то, лучше, чем постоянно прыгающее в статичном состоянии.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">style</span>&gt;</span>
  a { display: block; border: 1px solid red; width: 100px; height: 100px; background: blue; }
  a:hover { display: block; border: 1px solid red; width: 50px; height: 100px; background: blue; }
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">style</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
 <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;test&quot;</span>&gt;</span>test<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/09/04/hysteresis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ADuC847, его ADC и измерение температуры с термопары (часть 2: практика)</title>
		<link>http://blog.datacompboy.ru/2009/08/13/aduc847-adc-thermocouple-2/</link>
		<comments>http://blog.datacompboy.ru/2009/08/13/aduc847-adc-thermocouple-2/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 12:44:35 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[low-level programming]]></category>
		<category><![CDATA[8051]]></category>
		<category><![CDATA[assembler]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=118</guid>
		<description><![CDATA[Теперь посмотрим реализацию на практике измерения температуры.

Проблема №1: у нас есть PDF с таблицей миливольт через градус, а нам надо таблицы код-от-холодногоспая и термозначение-от-кода.
Итак, сперва превратим PDF в текст с помощью pdftotext, затем пройдём по таблице, и будем превращать каждое значение миливольт таблицы в код (умножая на 1000 чтобы превратить в микровольты, затем на 104.8575875 [...]]]></description>
			<content:encoded><![CDATA[<p>Теперь посмотрим реализацию на практике измерения температуры.<br />
<span id="more-118"></span><br />
Проблема №1: у нас есть PDF с таблицей миливольт через градус, а нам надо таблицы код-от-холодногоспая и термозначение-от-кода.<br />
Итак, сперва превратим PDF в текст с помощью <a href="http://www.foolabs.com/xpdf/download.html">pdftotext</a>, затем пройдём по таблице, и будем превращать каждое значение миливольт таблицы в код (умножая на 1000 чтобы превратить в микровольты, затем на 104.8575875 для кода АЦП)? интерполировать значения между соседними точками, распечатывая значение для каждого кода в 65536.<br />
Не забудем учесть, что в отрицательной части таблица указана по возрастанию модуля &#8212; а потому каждую отрицательную строку следует развернуть.<br />
Когда будем проходить мимо чисел от 0..100°, аналогично поступим с кодом холодного спая, только запоминать будем каждые 32768 не температуру, а вычесленный код ацп.<br />
Чтобы избавиться от знака, код АЦП для минимальной температуры с обратным знаком будет смещением, таким образом получим монотонную положительную таблицу.<br />
Итак, мы получаем вот такой конвертер: <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/08/convert.pl'>convert.pl</a><br />
Итак, мы получили .a51 инклуд, в котором объявлена константа ThermoBase &#8212; код, на который смещен ноль градусов в коде ацп, объявлена табличка ThermoTable, заданная через каждые 8000h кодов ацп, константа ThermoMax для проверки на перегрев, и таблица кодов термопары соответствующих холодному спаю ThermoExtTable через каждые 10000h кодов ацп термодатчика.</p>
<p>Обработчик прерывания от ацп будет крайне простым:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">;**************************************************************************</span>
<span style="color: #666666; font-style: italic;">; INTERRUPT from ADC</span>
         <span style="color: #000000; font-weight: bold;">ORG</span> <span style="color: #0000ff;">0033H</span>
         JBC DoExtReq<span style="color: #339933;">,</span> ADCExt <span style="color: #666666; font-style: italic;">; Измеряли опору или термопару?</span>
ADCInt<span style="color: #339933;">:</span>  <span style="color: #00007f; font-weight: bold;">MOV</span> DataH<span style="color: #339933;">,</span> ADC0H <span style="color: #666666; font-style: italic;">; Термопару сохраняем в DataH/M/L</span>
         <span style="color: #00007f; font-weight: bold;">MOV</span> DataM<span style="color: #339933;">,</span> ADC0M
         <span style="color: #00007f; font-weight: bold;">MOV</span> DataL<span style="color: #339933;">,</span> ADC0L
         <span style="color: #00007f; font-weight: bold;">SETB</span> ADCReady    <span style="color: #666666; font-style: italic;">; И ставим бит ADCReady. Бит ADCBusy сбросит основная программа</span>
         CLR RDY0
         RETI
<span style="color: #adadad; font-style: italic;">ADCE</span>xt<span style="color: #339933;">:</span>  <span style="color: #00007f; font-weight: bold;">MOV</span> ExtH<span style="color: #339933;">,</span> ADC0H <span style="color: #666666; font-style: italic;">; Опору измеряем в ExtH/M/L</span>
         <span style="color: #00007f; font-weight: bold;">MOV</span> ExtM<span style="color: #339933;">,</span> ADC0M
         <span style="color: #00007f; font-weight: bold;">MOV</span> ExtL<span style="color: #339933;">,</span> ADC0L
         CLR ADCBusy    <span style="color: #666666; font-style: italic;">; И очищаем бит ADCBusy (опора будет учтена для следующего измерения)</span>
         CLR RDY0
         RETI</pre></div></div>

<p>В зависимости от состояния бита DoExtReq считываем показания АЦП либо в Data, либо в Ext.</p>
<p>Основная часть программы так же проста:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">NoWD<span style="color: #339933;">:</span>            JBC  ADCReady<span style="color: #339933;">,</span> CalcThermo <span style="color: #666666; font-style: italic;">; Измерили АЦП?</span>
                 <span style="color: #00007f; font-weight: bold;">JB</span>   ADCBusy<span style="color: #339933;">,</span> SeeCMD <span style="color: #666666; font-style: italic;">; Игнорируем работу с АЦП, если он занят</span>
                     JBC  NeedExtReq<span style="color: #339933;">,</span> InitExtReq
                     <span style="color: #00007f; font-weight: bold;">JB</span>   NeedAutoReq<span style="color: #339933;">,</span> InitAutoReq
SeeCMD<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; Прочая работа</span></pre></div></div>

<p> &#8211; Если есть свежие показания АЦП &#8212; переходим к собственно вычислениям в CalcThermo<br />
 &#8211; Если показаний нет, ничего не делаем пока АЦП занят<br />
 &#8211; Если нет показания и АЦП свободен, проверим надо ли переизмерить показания холодного спая? (эти измерения можно проводить довольно редко, по сравнению с измерениями самой термопары. Я обновляю их раз в 2 сек, а термопару 5 раз в сек)<br />
 &#8211; Если нет показания, АЦП свободен, проверим не пора ли обновить температуру термопары.</p>
<p>Итак, само измерение холодного спая инициируется такой последовательностью:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">InitExtReq<span style="color: #339933;">:</span>      <span style="color: #00007f; font-weight: bold;">SETB</span> ADCBusy <span style="color: #666666; font-style: italic;">; АЦП занят</span>
                 <span style="color: #00007f; font-weight: bold;">SETB</span> DoExtReq <span style="color: #666666; font-style: italic;">; Измерение будет произведено холодного спая</span>
                 CLR  ExtReady   <span style="color: #666666; font-style: italic;">; Нужно перевычислить холодный спай</span>
                 CLR  RDY0
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCSF<span style="color: #339933;">,</span> #REQ_SF
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADC0CON1<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100111b</span> <span style="color: #666666; font-style: italic;">; Измерение 0..1.28V, однополярно</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADC0CON2<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00001011b</span> <span style="color: #666666; font-style: italic;">; Измерение AIN3-AIN4 с внутренней опорой</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100100b</span> <span style="color: #666666; font-style: italic;">; Калибровка нуля</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100101b</span> <span style="color: #666666; font-style: italic;">; Калибровка максимума</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100010b</span> <span style="color: #666666; font-style: italic;">; Запросить 1 измерение на основном АЦП</span>
                 <span style="color: #00007f; font-weight: bold;">JMP</span>  MAINLOOP</pre></div></div>

<p>Полностью аналогично производится инициация запроса показаний термопары:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">InitAutoReq<span style="color: #339933;">:</span>     <span style="color: #00007f; font-weight: bold;">SETB</span> ADCBusy
                 CLR  RDY0
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCSF<span style="color: #339933;">,</span> #REQ_SF
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADC0CON1<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00000011b</span> <span style="color: #666666; font-style: italic;">; Измерение +-80mV биполярно</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADC0CON2<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00001010b</span> <span style="color: #666666; font-style: italic;">; Измерение AIN1-AIN2 в внутренней опорой</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100100b</span> <span style="color: #666666; font-style: italic;">; Калибровка нуля</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100101b</span> <span style="color: #666666; font-style: italic;">; Калибровка максимума</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100010b</span> <span style="color: #666666; font-style: italic;">; Запросить 1 измерение на основном АЦП</span>
                 <span style="color: #00007f; font-weight: bold;">JMP</span>  MAINLOOP</pre></div></div>

<p>Итак, произошло измерение термопары, следовательно пора получить измеряемую температуру. Для этого нам понадобится еще эквивалент холодного спая, а потому, преамбула будет такой:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">CalcThermo<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DevErr<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPCON<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00010001b</span> <span style="color: #666666; font-style: italic;">; Выберем второй дптр с автоинкрементом после MOVC/MOVX</span>
    ORL PSW<span style="color: #339933;">,</span> #<span style="color: #0000ff;">18h</span> <span style="color: #666666; font-style: italic;">; Выберем банк 3</span>
    <span style="color: #00007f; font-weight: bold;">JNB</span> ExtReady<span style="color: #339933;">,</span> CalcExt
    <span style="color: #00007f; font-weight: bold;">JMP</span> CalcMain</pre></div></div>

<p>во-1х, при вычислении нам придётся часто менять DPTR и считывать табличные значения, поэтому имеет смысл переключиться на второй DPTR. </p>
<blockquote><p>Использование автоинкремента особенно удобно при записи запись у 8051 идёт только по DPTR, и потому вместо</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">  MOVX @DPTR<span style="color: #339933;">,</span> <span style="color: #339933;">...</span>
  <span style="color: #00007f; font-weight: bold;">INC</span> DPTR
  MOVX @DPTR<span style="color: #339933;">,</span> <span style="color: #339933;">...</span></pre></div></div>

<p>получается просто</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">  MOVX @DPTR<span style="color: #339933;">,</span> <span style="color: #339933;">...</span>
  MOVX @DPTR<span style="color: #339933;">,</span> <span style="color: #339933;">...</span></pre></div></div>

<p>Однако же при чтении из памяти данных это не так удобно, вместо</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">  CLR A
  MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
  <span style="color: #339933;">...</span>
  <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> #<span style="color: #0000ff;">1</span>
  MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR</pre></div></div>

<p>при автоинкременте всё равно приходится каждый раз очищать аккумулятор:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">  CLR A
  MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
  <span style="color: #339933;">...</span>
  CLR A
  MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR</pre></div></div>

<p>однако, во-1х CLR A занимает на 1 байт меньше, чем MOV, и во-2х сложнее ошибиться.</p></blockquote>
<p>Итак, если у нас изменились показания холодного спая (ExtReady очищен), то нужно перевычислить эквивалент холодного спая.</p>
<p>Сделаем это прямо &laquo;в лоб&raquo;: отнимем 500мв, проверим что результат в нашей таблице:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">CalcExt<span style="color: #339933;">:</span>
  <span style="color: #666666; font-style: italic;">; Вычислим Ext-646303h</span>
    CLR <span style="color: #000000; font-weight: bold;">C</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ExtL
    SUBB A<span style="color: #339933;">,</span> #<span style="color: #0000ff;">03h</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ExtM
    SUBB A<span style="color: #339933;">,</span> #<span style="color: #0000ff;">63h</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtM<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ExtH
    SUBB A<span style="color: #339933;">,</span> #<span style="color: #0000ff;">64h</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtH<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> DevErr<span style="color: #339933;">,</span> #<span style="color: #0000ff;">1</span>
    <span style="color: #00007f; font-weight: bold;">JC</span> ThError <span style="color: #666666; font-style: italic;">; Если меньше 500mV -- температура отрицательная, ошибка (?)</span>
    <span style="color: #666666; font-style: italic;">; A = ExtH = точка входа в таблицу хол.спая</span>
    CJNE A<span style="color: #339933;">,</span> #<span style="color: #0000ff;">83H</span><span style="color: #339933;">,</span> IsOver83H
IsOver83H<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DevErr<span style="color: #339933;">,</span> #<span style="color: #0000ff;">2</span>
    <span style="color: #00007f; font-weight: bold;">JNC</span> ThError <span style="color: #666666; font-style: italic;">; Если &gt;= 83h -- выход, окружающая среда больше 65°</span></pre></div></div>

<p>Итак, теперь у нас в Ext лежит сдвинутый код термодатчика холодного спая, из которых ExtH = указатель по таблице (он же сейчас в ACC) и ExtM/ExtL пропорциональность от 0 до 65536. Найдём точку входа в таблицу:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">    <span style="color: #666666; font-style: italic;">; Таблица до 83h, по 3 байта =&gt; 83h*3=189h, то есть 1 бит переноса может быть</span>
    CLR <span style="color: #000000; font-weight: bold;">C</span>
    RLC A
    <span style="color: #00007f; font-weight: bold;">MOV</span> F0<span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">C</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> ExtH
    ORL <span style="color: #000000; font-weight: bold;">C</span><span style="color: #339933;">,</span> F0 <span style="color: #666666; font-style: italic;">; A = младший байт, C = перенос. Это надо сложить с ThermoExtTable и положить в DPTR</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPH<span style="color: #339933;">,</span> #HIGH<span style="color: #009900; font-weight: bold;">&#40;</span>ThermoExtTable<span style="color: #009900; font-weight: bold;">&#41;</span>
    <span style="color: #00007f; font-weight: bold;">JNC</span> NoIncDPH1
    <span style="color: #00007f; font-weight: bold;">INC</span> DPH
NoIncDPH1<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> #LOW<span style="color: #009900; font-weight: bold;">&#40;</span>ThermoExtTable<span style="color: #009900; font-weight: bold;">&#41;</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> NoIncDPH2
    <span style="color: #00007f; font-weight: bold;">INC</span> DPH
    CLR <span style="color: #000000; font-weight: bold;">C</span>
NoIncDPH2<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; DPTR = указатель на таблицу соответствия холодному спаю</span></pre></div></div>

<p>(обратите внимание, может быть только один бит переноса, но операций сдвиг/сложение две, поэтому временно один перенос сохраняем в F0).</p>
<p>Настроив DPTR, считываем из таблицы начальную точку диапазона:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtTL<span style="color: #339933;">,</span> A
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtTM<span style="color: #339933;">,</span> A
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtTH<span style="color: #339933;">,</span> A <span style="color: #666666; font-style: italic;">; ExtT=начальная точка интервала</span></pre></div></div>

<p>Затем считываем следующую точку и сразу вычисляем разность &#8212; длину интервала</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    SUBB A<span style="color: #339933;">,</span> ExtTL <span style="color: #666666; font-style: italic;">; C был очищен выше</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> R0<span style="color: #339933;">,</span> A
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    SUBB A<span style="color: #339933;">,</span> ExtTM
    <span style="color: #00007f; font-weight: bold;">MOV</span> R1<span style="color: #339933;">,</span> A <span style="color: #666666; font-style: italic;">; R1:R0 = разность между верхней и нижней точками интервала</span>
    <span style="color: #666666; font-style: italic;">; Теперь в ExtM:ExtL находится разница внутри диапазона, в R1:R0 находится длина диапазона</span></pre></div></div>

<p>Обратите внимание, что так как длина диапазона влезает в 2 байта, достаточно было считать только два байта.</p>
<p>Теперь нужно вычислить ExtT=ExtT+(ExtM:ExtL*R1:R0/65536)<br />
Вычислим ExtM:ExtL*R1:R0: 16bit+16bit=32bit, нас интересуют только старшие 17бит (17й бит = округление)<br />
Сложим результат в R5:R4:R3:R2 (R2 вообще не считаем)</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> ExtM <span style="color: #666666; font-style: italic;">; A=R1 на текущий момент</span>
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB      <span style="color: #666666; font-style: italic;">; B:A = R1*ExtM =&gt; результат в R5:R4</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> R5<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">MOV</span> R4<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R1
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> ExtL
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB      <span style="color: #666666; font-style: italic;">; B:A = R1*ExtL =&gt; Результат в R4:R3 (к R4 прибавляем)</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> R3<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R4
    <span style="color: #00007f; font-weight: bold;">MOV</span> R4<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> NoOv1
    <span style="color: #00007f; font-weight: bold;">INC</span> R5  <span style="color: #666666; font-style: italic;">; сохраним перенос если был</span>
NoOv1<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R0
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> ExtM
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB      <span style="color: #666666; font-style: italic;">; B:A = R0*ExtM =&gt; результат к R4:R3</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R3
    <span style="color: #00007f; font-weight: bold;">MOV</span> R3<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    ADDC A<span style="color: #339933;">,</span> R4
    <span style="color: #00007f; font-weight: bold;">MOV</span> R4<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> NoOv2
    <span style="color: #00007f; font-weight: bold;">INC</span> R5  <span style="color: #666666; font-style: italic;">; сохраним перенос</span>
NoOv2<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R0
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> ExtL
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB      <span style="color: #666666; font-style: italic;">; B:A = R0*ExtL =&gt; результат в R3:R2, R2 вообще игнорируем, у R3 проверяем только перенос и &gt;128</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R3
    <span style="color: #00007f; font-weight: bold;">JNC</span> NoOv3
    <span style="color: #00007f; font-weight: bold;">INC</span> R4
    CJNE R4<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span><span style="color: #339933;">,</span> NoOv3
    <span style="color: #00007f; font-weight: bold;">INC</span> R5 <span style="color: #666666; font-style: italic;">; Если R4 стал равен нулю, то перенос ушел в R5</span>
NoOv3<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">JNB</span> ACC<span style="color: #339933;">.</span>7<span style="color: #339933;">,</span> NoOv4 <span style="color: #666666; font-style: italic;">; проверим, не следует ли округлить вверх</span>
    <span style="color: #00007f; font-weight: bold;">INC</span> R4
    CJNE R4<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span><span style="color: #339933;">,</span> NoOv4
    <span style="color: #00007f; font-weight: bold;">INC</span> R5
NoOv4<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; Теперь в R5:R4 интерполяционная добавка к текущему значению в ExtT</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ExtTL
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R4
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtTL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ExtTM
    ADDC A<span style="color: #339933;">,</span> R5
    <span style="color: #00007f; font-weight: bold;">MOV</span> ExtTM<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> NoOv5
    <span style="color: #00007f; font-weight: bold;">INC</span> ExtTH
NoOv5<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; Теперь ExtT = показания холодного спая в табличных значениях термопары</span>
    <span style="color: #00007f; font-weight: bold;">SETB</span> ExtReady</pre></div></div>

<p>Итак, теперь у нас есть эквивалент холодного спая и мы можем получить текущую температуру.</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">CalcMain<span style="color: #339933;">:</span>
  <span style="color: #666666; font-style: italic;">; Вычитаем из кода пьедестал (код становится положительным), добавляем холодный спай и по таблице</span>
  <span style="color: #666666; font-style: italic;">; интерполируем температуру</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> DataH
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> #<span style="color: #0000ff;">80H</span> <span style="color: #666666; font-style: italic;">; Переводим из 8000000 = 0 к 0=0</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> R2<span style="color: #339933;">,</span> A
    <span style="color: #666666; font-style: italic;">; Добавляем холодный спай</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> DataL
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> ExtTL
    <span style="color: #00007f; font-weight: bold;">MOV</span> R0<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> DataM
    ADDC A<span style="color: #339933;">,</span> ExtTM
    <span style="color: #00007f; font-weight: bold;">MOV</span> R1<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R2
    ADDC A<span style="color: #339933;">,</span> ExtTH
    <span style="color: #00007f; font-weight: bold;">MOV</span> R2<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> DevErr<span style="color: #339933;">,</span> #<span style="color: #0000ff;">3</span> <span style="color: #666666; font-style: italic;">; Ошибка &quot;ниже минимума&quot; = &quot;обрыв термопары&quot;</span>
    <span style="color: #00007f; font-weight: bold;">JB</span>  ACC<span style="color: #339933;">.</span>7<span style="color: #339933;">,</span> ErrorMin <span style="color: #666666; font-style: italic;">; Ниже минимума таблицы?</span>
    <span style="color: #666666; font-style: italic;">; Теперь проверяем не вылезли ли за таблицу сверху</span>
    CJNE R2<span style="color: #339933;">,</span> #ThermoMaxH<span style="color: #339933;">,</span> ChkMax
    CJNE R1<span style="color: #339933;">,</span> #ThermoMaxM<span style="color: #339933;">,</span> ChkMax
    CJNE R0<span style="color: #339933;">,</span> #ThermoMaxL<span style="color: #339933;">,</span> ChkMax
ChkErr<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DevErr<span style="color: #339933;">,</span> #<span style="color: #0000ff;">4</span> <span style="color: #666666; font-style: italic;">; Ошибка переполнение</span>
jThError<span style="color: #339933;">:</span> <span style="color: #00007f; font-weight: bold;">JMP</span> ThError
ErrorMin<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoH<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0FFh</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoL<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0FFh</span>
    AJMP ThError
ChkMax<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">JNC</span> ChkErr
    <span style="color: #666666; font-style: italic;">; 0&lt; =R2:R1:R0&lt;ThermoMax = Код с АЦП с холодным спаем и за вычетом базы</span></pre></div></div>

<p>Итак, мы получили код, таблица через 32768, так что если мы R2:R1:R0 умножим на два, мы получим в CY:R2 указатель по таблице, а в R1:R0 пропорцию из диапазона 0..65536.
</pre>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">CalcFind<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; Выбрать из таблицы код R2:R1:R0</span>
    CLR <span style="color: #000000; font-weight: bold;">C</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R0
    RLC A
    <span style="color: #00007f; font-weight: bold;">MOV</span> R0<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R1
    RLC A
    <span style="color: #00007f; font-weight: bold;">MOV</span> R1<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R2
    RLC A
    <span style="color: #666666; font-style: italic;">; A = индекс таблицы, от 0..С2, и CY=0</span>
    RLC A <span style="color: #666666; font-style: italic;">; A=указатель таблицы, C=перенос</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPH<span style="color: #339933;">,</span> #HIGH<span style="color: #009900; font-weight: bold;">&#40;</span>ThermoTable<span style="color: #009900; font-weight: bold;">&#41;</span>
    <span style="color: #00007f; font-weight: bold;">JNC</span> NIncDPH
    <span style="color: #00007f; font-weight: bold;">INC</span> DPH
NIncDPH<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> #LOW<span style="color: #009900; font-weight: bold;">&#40;</span>ThermoTable<span style="color: #009900; font-weight: bold;">&#41;</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> NIncDPH2
    <span style="color: #00007f; font-weight: bold;">INC</span> DPH
NIncDPH2<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; DPTR = ThermoTable+(R2:R1:R0/32768)*2</span></pre></div></div>

<p>Итак, теперь аналогично работе с таблицей термопары выберем первую точку и длину интервала:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    <span style="color: #00007f; font-weight: bold;">MOV</span> R3<span style="color: #339933;">,</span> A
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    <span style="color: #00007f; font-weight: bold;">MOV</span> R4<span style="color: #339933;">,</span> A <span style="color: #666666; font-style: italic;">; R4:R3 = код из таблицы</span>
    CLR <span style="color: #000000; font-weight: bold;">C</span>
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    SUBB A<span style="color: #339933;">,</span> R3
    <span style="color: #00007f; font-weight: bold;">MOV</span> R5<span style="color: #339933;">,</span> A
    CLR A
    MOVC A<span style="color: #339933;">,</span> @A<span style="color: #339933;">+</span>DPTR
    SUBB A<span style="color: #339933;">,</span> R4
    <span style="color: #00007f; font-weight: bold;">MOV</span> R6<span style="color: #339933;">,</span> A <span style="color: #666666; font-style: italic;">; R6:R5 = разница между следущим и текущим кодом</span></pre></div></div>

<p>И сдвинемся внутри интервала:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">    <span style="color: #666666; font-style: italic;">; Теперь в R6:R5 разница по таблице, в R1:R0 пропорция из диапазона 0..65536</span>
    <span style="color: #666666; font-style: italic;">; Вычислим [ R6:R5*R1:R0 = ThermoH:ThermoL:Tmp1:Tmp2 ] / 32768,</span>
    <span style="color: #666666; font-style: italic;">; от Tmp1 нужен только старший бит (для определения округления)</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> R1
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB <span style="color: #666666; font-style: italic;">; R6*R1 нужно положить в ThermoH:ThermoL</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoH<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">MOV</span> THermoL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> R1
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R5
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB <span style="color: #666666; font-style: italic;">; R5*R1 складываем в ThermoL:Tmp1</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> Tmp1<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> ResNoO1
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH <span style="color: #666666; font-style: italic;">; Учтем перенос</span>
ResNoO1<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R6
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> R0
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB <span style="color: #666666; font-style: italic;">; R6*R0 складываем в ThermoL:Tmp1</span>
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> Tmp1
    <span style="color: #00007f; font-weight: bold;">MOV</span> Tmp1<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ThermoL
    ADDC A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> ResNoO2
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH
ResNoO2<span style="color: #339933;">:</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> R5
    <span style="color: #00007f; font-weight: bold;">MOV</span> B<span style="color: #339933;">,</span> R0
    <span style="color: #00007f; font-weight: bold;">MUL</span> AB <span style="color: #666666; font-style: italic;">; R5*R0 складывается в Tmp1:Tmp2, интересует только старший бит Tmp1 и перенос</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> B
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> Tmp1
    <span style="color: #00007f; font-weight: bold;">JNC</span> ResNoO5
    XCH A<span style="color: #339933;">,</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">INC</span> A
    <span style="color: #00007f; font-weight: bold;">JNZ</span> ResNoO4
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH
ResNoO4<span style="color: #339933;">:</span>
    XCH A<span style="color: #339933;">,</span> ThermoL
ResNoO5<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; Если ACC.7!=0, увеличим ThermoHL</span>
    <span style="color: #00007f; font-weight: bold;">JNB</span> ACC<span style="color: #339933;">.</span>7<span style="color: #339933;">,</span> ResNoRound
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">JNZ</span> ResNoRound
    <span style="color: #00007f; font-weight: bold;">INC</span> ThermoH
ResNoRound<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; Теперь в ThermoH/ThermoL лежит добавка к текущему значению таблицы, добавим к ней R4:R3</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ThermoL
    <span style="color: #00007f; font-weight: bold;">ADD</span> A<span style="color: #339933;">,</span> R3
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoL<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">MOV</span> A<span style="color: #339933;">,</span> ThermoH
    ADDC A<span style="color: #339933;">,</span> R4
    <span style="color: #00007f; font-weight: bold;">MOV</span> ThermoH<span style="color: #339933;">,</span> A
    <span style="color: #00007f; font-weight: bold;">JNC</span> NoThError <span style="color: #666666; font-style: italic;">; Перебора тут быть не должно, ибо температура за 2048 градусов вылезать не должна</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DevErr<span style="color: #339933;">,</span> #<span style="color: #0000ff;">7</span>
    AJMP ThError
NoThError<span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">; ---</span>
CalcEnd<span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">; Конец вычислений. В Thermo* лежит вычисленное значение</span></pre></div></div>

<p>Итак, все наши вычисления завершились. Восстанавливаем состояние и переходим к дальнейшей части работы:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">    <span style="color: #00007f; font-weight: bold;">MOV</span> DevErr<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span>
    CLR ADCBusy <span style="color: #666666; font-style: italic;">; АЦП свободен</span>
    <span style="color: #666666; font-style: italic;">; Вернуться к обычной работе</span>
    ANL PSW<span style="color: #339933;">,</span> #NOT <span style="color: #0000ff;">18h</span> <span style="color: #666666; font-style: italic;">; Выбрать банк 0</span>
    <span style="color: #00007f; font-weight: bold;">MOV</span> DPCON<span style="color: #339933;">,</span> #<span style="color: #0000ff;">0</span> <span style="color: #666666; font-style: italic;">; Вернуться к основному DPTR</span>
    <span style="color: #00007f; font-weight: bold;">JMP</span> MAINLOOP <span style="color: #666666; font-style: italic;">; Вернуться к основной программе</span></pre></div></div>

<p>Вот так, весело и задорно, и довольно компактно, получаем искомую температуру с термопары :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/08/13/aduc847-adc-thermocouple-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Автоматические многоточия</title>
		<link>http://blog.datacompboy.ru/2009/08/13/%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d1%82%d0%be%d1%87%d0%b8%d1%8f/</link>
		<comments>http://blog.datacompboy.ru/2009/08/13/%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d1%82%d0%be%d1%87%d0%b8%d1%8f/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 04:42:12 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[web programming]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=111</guid>
		<description><![CDATA[Вы же часто видели классическое оглавление?
А..................1
Б..................2
В..................3
Как получить его в HTML+CSS без использования кучи точек и сложного выравнивания?

Просто! Блок с названием делаем фиксированной ширины через float:left + width:XXXX + overflow:hidden, внутрь вкладываем блок с width:200%, внутрь которого кладём блок с названием и float:left, а следом за ним пустой блок с float:left + width:50% и нужными точками [...]]]></description>
			<content:encoded><![CDATA[<p>Вы же часто видели классическое оглавление?</p>
<pre>А..................1
Б..................2
В..................3</pre>
<p>Как получить его в HTML+CSS без использования кучи точек и сложного выравнивания?<br />
<span id="more-111"></span><br />
Просто! Блок с названием делаем фиксированной ширины через float:left + width:XXXX + overflow:hidden, внутрь вкладываем блок с width:200%, внутрь которого кладём блок с названием и float:left, а следом за ним пустой блок с float:left + width:50% и нужными точками внутри (либо через border-bottom либо через background-image).</p>
<p>В результате получаем вот такую красоту:</p>
<style>
  div.line { height: 20px; width: 350px; }
  div.line label { width: 250px; height: 20px; float: left; overflow: hidden; position: relative; }
  div.line label span { display: block; width: 200%; position: relative; }
  div.line label span span { float: left; width: auto; }
  div.line label span span.dots { width: 50%; height: 1em; background: url(/u/dots.gif) right bottom repeat-x; }
</style>
<div class="line"><label><span><span>Цена</span><span class="dots"></span></span></label> <span>450 000$</span></div>
<div class="line"><label><span><span>Количество</span><span class="dots"></span></span></label> <span>50</span></div>
<div class="line"><label><span><span>Вкус</span><span class="dots"></span></span></label> <span>ацтой</span></div>
<p>Исходный код:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">&lt;style<span style="color: #00AA00;">&gt;</span>
  div<span style="color: #6666ff;">.line</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">20px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">350px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
  div<span style="color: #6666ff;">.line</span> label <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">250px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">20px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">hidden</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">relative</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
  div<span style="color: #6666ff;">.line</span> label span <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">200</span>%</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">relative</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
  div<span style="color: #6666ff;">.line</span> label span span <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">auto</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
  div<span style="color: #6666ff;">.line</span> label span span<span style="color: #6666ff;">.dots</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">50</span>%</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1em</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">dots.gif</span><span style="color: #00AA00;">&#41;</span> <span style="color: #000000; font-weight: bold;">right</span> <span style="color: #000000; font-weight: bold;">bottom</span> <span style="color: #993333;">repeat-x</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
&lt;/style<span style="color: #00AA00;">&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;line&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>Цена<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dots&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>450 000$<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;line&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>Количество<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dots&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>50<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;line&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>Вкус<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dots&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>ацтой<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/08/13/%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b5-%d0%bc%d0%bd%d0%be%d0%b3%d0%be%d1%82%d0%be%d1%87%d0%b8%d1%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ADuC847, его ADC и измерение температуры с термопары</title>
		<link>http://blog.datacompboy.ru/2009/08/13/aduc847-adc-thermocouple/</link>
		<comments>http://blog.datacompboy.ru/2009/08/13/aduc847-adc-thermocouple/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 17:56:36 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[low-level programming]]></category>
		<category><![CDATA[8051]]></category>
		<category><![CDATA[assembler]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=107</guid>
		<description><![CDATA[Казалось бы: классическая задача. Есть термопара (ХА, ХК, ПП), подключенная к АЦП (между AIN1-AIN2), есть датчик температуры разъема (TC1047A). Нужно получать периодически температуру. Чего проще?

Берём с ИТТ таблицу калибровки, берём даташиты на процессор и датчик температуры. Изучаем, вроде бы всё понятно.
Теперь начинаются проблемы. Для опрежедения температуры надо сложить ток термопары с током холодного спая (такой [...]]]></description>
			<content:encoded><![CDATA[<p>Казалось бы: классическая задача. Есть термопара (ХА, ХК, ПП), подключенная к АЦП (между AIN1-AIN2), есть датчик температуры разъема (TC1047A). Нужно получать периодически температуру. Чего проще?<br />
<span id="more-107"></span><br />
Берём с <a href="http://www.itt-ltd.com/reference/pdf/tc_k.pdf">ИТТ</a> таблицу калибровки, берём даташиты на <a href="http://www.analog.com/static/imported-files/Data_Sheets/ADUC845_847_848.pdf">процессор</a> и <a href="http://www.equicom.dp.ua/ping/TC1047AVNBTR_MCHIP.pdf">датчик температуры</a>. Изучаем, вроде бы всё понятно.</p>
<p>Теперь начинаются проблемы. Для опрежедения температуры надо сложить ток термопары с током холодного спая (такой же термопары, измеряющей температуру контактов). У нас холодный спай заменяет термодатчик, следовательно, его показания надо превратить в эквивалентный ток термопары.<br />
 1. Температура = Таблица(НапряжениеТермопары + НапряжениеТермопарыУРазъёма)<br />
 2. НапряжениеТермопарыУРазъёма = ОбратнаяТаблица(ТемператураТермодатчика)</p>
<p>Итак, нам потребуется или выбор  и поиск по одной таблице, или две выборки из двух таблиц.<br />
Теперь об удобстве вычислений: у ADuC847 высокая тактовая частота, и однотактовое ядро, что гораздо приятнее чем классический 8051, однако это не снимает общей проблемы всех процессоров такого типа: деление не на степень двойки не долго, а ОЧЕНЬ долго. Значит, все деления должны быть приведены к степеням двойки.</p>
<p>Чтобы преобразовать таблицу нам потребуется сперва разобраться с исходными данными: какие числа и как мы снимаем с АЦП.</p>
<p>ADC в ADuC847 управляется четырьмя регистрами: ADC0CON1, ADC0CON2, ADCMODE, SF. Результат работы находится в ADC0L/M/H + флаги RDY0  и ERR0 в регистре ADCSTAT.<br />
Интересный момент, в документации приведены значения усилителя для Vref=2.50. Поэтому, если используется внутренняя опора (мой случай) с Vref=1.25, все числа в таблице следует помножать на два. Измерять термопару будем на диапазоне -80..+80мВ (RN=011b, UNI=0), измерять термодатчик будем 0..1.28В (RN=111bm UNI=1).</p>
<p>Кодирование двуполярного сигнала идёт со сдвигом на 800000H, таким образом 0мВ=коду 800000H, 0=-80мВ, FFFFFFH=+80мВ, отсюда 1мкрВ=104.8575875 единиц АЦП.<br />
Кодирование однополярного сигнала идёт на полный диапазон, значит одна единица = 0.076 мкрВ.</p>
<p>Датчик температуры даёт 500мВ при 0°С, и линейно даёт 10мВ/°С. Минимум измеряемый равен -50°, максимум при 1.28В≈78° Таким образом, чтобы преобразовать код термодатчика в градусы нужно вычесть 500мВ и разделить на 10мВ: вычесть 646303h и разделить на 201FBh. После чего, температура должна быть преобразована по таблице в код термопары для этой температуры. Допустим, таблица сделана &laquo;в лоб&raquo;: код термопары на каждый градус (от 0 до 66). Тогда чтобы пребразовать код термодатчика в код термопары надо:</p>
<ol>
<li>Код = Код-646303h</li>
<li>Темп = Код/201FBh (целая часть в ТемпЦ, остаток от деления в ТемпО)</li>
<li>Код1 = ТаблКод(ТемпЦ)</li>
<li>Код2 = ТаблКод(ТемпЦ+1)</li>
<li>Результат = Код1+(Код2-Код1)*ТемпО/201FBh</li>
</ol>
<p>Итак, всё бы ничего, но требуется дважды делить на очень некруглое число. Тут случай простой. Вместо вычисления X/201FBh можно приближенно посчитать<br />
 X/201FBh ≈ X*FFh/20000h = (X shl 8 &#8211; X)/20000h = (X &#8211; X shr 8) = (X-X shr 8) shr 9<br />
что вычисляется легко: сдвиг вправо на 8 это просто отбрасывание 1 младшего байта от 3хбайтового целого.<br />
Вот только ТемпО это 18 бит, а значит потребуется 24*24 умножение&#8230;</p>
<p>Но что, если сделать проще? Возьмем таблицу термопары через 65536 кодов термодатчика. Тогда таблица получится больше (примерно в 2 раза), зато преобразование будет:</p>
<ol>
<li>Код = Код-646303h</li>
<li>Код1 = ТаблКод(High8(Код))</li>
<li>Код2 = ТаблКод(High8(Код)+1)</li>
<li>Результат = Код1+(Код2-Код1)*(Low16(Код))/10000h</li>
</ol>
<p>Что вычислится гораздо быстрее. (Кстати, учтем что Код2-Код1 при этом вмещается в 16бит, таким образом числа хоть и 24битные, но умножение требуется 16*16 с сохранением старших 16). Впрочем, если вы сильно обжаты в памяти &#8212; можно применить и технику, описанную выше. Только времени потребуется ощутимо больше.</p>
<p>Итак, у нас есть 24битный некий &laquo;код холодного спая&raquo;, и 24битный код термопары, который мы измерили. Нам нужно их сложить так, чтобы получившийся код был точкой входа в таблицу преобразования кода термопары в градусы. Помним, что код, который мы измеряем сдвинут на 800000H.</p>
<p>Первым делом, сдвинем измеренный код в обратный дополнительный код. Для этого можно из имеющегося кода вычесть 800000H или прибавить 800000H (строго говоря, прибавить 7FFFFFh, однако ошибка в единицу кода совершенно не повлияет на результат). Теперь прибавим &laquo;код холодного спая&raquo;, который должен быть отмасштабирован так, чтобы при нуле градусов окружающей среды код ссылался на точку таблицы для нуля градусов (так как термопара при окружающей среде равной температуре разъема покажет ноль). </p>
<p>Итак, у нас есть код эквивалентный показаниям термопары как если бы разъем был при нуле градусов. Теперь надо преобразовать его по таблице микровольт в градусы. Метод &laquo;в лоб&raquo; потребует деление кода на 104.8575875 для получения микровольт, которые после преобразовать. Логично, что таблица должна быть уже представлена не в микровольтах, а в 104.8575875*1мкВ = тогда имеющийся код будет сразу указателем в таблицу. В случае c термопарами ХА и ХК достаточно таблицу сделать через 32768 кода термопары, это даст для ХА термопары точки через примерно 7.5 градусов &#8212; достаточно для интервала от -200 до +1300°C.</p>
<p>Теперь поговорим о значениях, которые должны лежать в таблице. Тут практически нет ограничения &#8212; вы можете держать там любое целочисленное (с фиксированной точкой) представление температуры, лишь бы выполнялось условие линейности и положительности (чтобы не требовалось сложного знакового умножения) двоичного представления. То есть, там можно хранить температуру с разрешением в 1/10 градуса (но при этом точность будет 1/3 градуса, ибо +- одна единица младшего разряда относится к вычислительным погрешностям, не говоря уже об измерительных погрешностях). Я выбрал 16битные числа с фиксированной точкой: 11 бит целая часть и 5 бит дробная. При этом легко получать целые градусы (буде потребуются) в программе без деления, так и <em>разрешающая способность</em> в 1/32 градуса позволяет иметь <em>точность</em> в 1/10 градуса, и в слово влезает температура в кельвинах от 0 до 2048 (от -273 до +1775 цельсия).</p>
<p>Итак, для финального преобразования у нас есть таблица, смещенная так, что Код 0 = -220°C (так получилось, что ниже -200° характеристика таблицы ХА сильно заваливается), и таблица задана через 8000H. Таким образом, суммарный код термодатчика и эквивалента холодного спая умножаем на два (сдвигаем влево), и старший байт = указатель по таблице, младшие 2 байта = пропорциональности. То есть</p>
<ol>
<li>Код = (Термопара+800000H+Холодный спай) shl 1</li>
<li>Код1 = Табл(High8(Код))</li>
<li>Код2 = Табл(High8(Код)+1)</li>
<li>Результат = Код1+(Код2-Код1)*(Low16(Код))/10000h</li>
</ol>
<p>Опять же, Код2-Код1 это 16 бит, а значит простое умножение 16*16 с сохранением старших 16.</p>
<p>Теперь, что касается АЦП у ADuc847, или то, чего не хватило в документации:<br />
  1. Настройте АЦП на нужный диапазон и входы. Для этого загрузите SF, ADC0CON1 и ADC0CON2.<br />
  2. Загрузите калибровочные значения. В примерах, для этого используется следующий код:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100100b</span> <span style="color: #666666; font-style: italic;">; Калибровка нуля</span>
                 <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100101b</span> <span style="color: #666666; font-style: italic;">; Калибровка максимума</span></pre></div></div>

<p>  обратите внимания &#8212; никакие задержки и прерывания при этом не будут вызваны.<br />
  3. Включите необходимый режим измерения, и ждите бита RDY0. У меня включен EADC (прерывание от АЦП, которыое происходит каждый раз, как бит RDY0 переходит в 1). Я использую разовые запросы:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"> <span style="color: #00007f; font-weight: bold;">MOV</span>  ADCMODE<span style="color: #339933;">,</span> #<span style="color: #0000ff;">00100010b</span> <span style="color: #666666; font-style: italic;">; Запросить 1 измерение на основном АЦП</span></pre></div></div>

<p>  4. В обработчике прерывания <strong>сперва</strong> считайте показания из ADC0H/L/M и <strong>обязательно потом</strong> сбросьте RDY0.<br />
  5. RN (младшие 3 бита у ADC0CON1) задаёт коэффициент усилителя, а не выбирает конечный диапазон измерения. Таким образом, правильно таблица выглядит так:</p>
<pre>ADC0CON1 bits 2,1,0 = Primary ADC Range Bits. Wtten by the user to select the primary ADC input range as follows:
000 = -Vref*0.008..+Vref*0.008 или 0..Vref*0.008
001 = -Vref*0.016..+Vref*0.016 или 0..Vref*0.016
010 = -Vref*0.032..+Vref*0.032 или 0..Vref*0.032
011 = -Vref*0.064..+Vref*0.064 или 0..Vref*0.064
100 = -Vref*0.128..+Vref*0.128 или 0..Vref*0.128
101 = -Vref*0.256..+Vref*0.256 или 0..Vref*0.256
110 = -Vref*0.512..+Vref*0.512 или 0..Vref*0.512
111 = -Vref*1.024..+Vref*1.024 или 0..Vref*1.024</pre>
<p>Конкретные величины указаны в даташите для Vref=2.5, и разделить числа в даташите на два если используется внутренняя опора (Vref=1.25 при этом).</p>
<p>Приятных вычислений!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/08/13/aduc847-adc-thermocouple/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Удаленная факс-машина на Asterisk</title>
		<link>http://blog.datacompboy.ru/2009/08/02/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d0%b0%d1%8f-%d1%84%d0%b0%d0%ba%d1%81-%d0%bc%d0%b0%d1%88%d0%b8%d0%bd%d0%b0-%d0%bd%d0%b0-asterisk/</link>
		<comments>http://blog.datacompboy.ru/2009/08/02/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d0%b0%d1%8f-%d1%84%d0%b0%d0%ba%d1%81-%d0%bc%d0%b0%d1%88%d0%b8%d0%bd%d0%b0-%d0%bd%d0%b0-asterisk/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 14:31:06 +0000</pubDate>
		<dc:creator>datacompboy</dc:creator>
				<category><![CDATA[voip]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[solutions]]></category>

		<guid isPermaLink="false">http://blog.datacompboy.ru/?p=103</guid>
		<description><![CDATA[Создание удаленной факс-машины представляется довольно громоздкой системой. Как правило, для решения устанавливают Samba на сервер, на котором установлен Asterisk, на ней поднимается виртуальный принтер.
Мне же требовалась факс машина на удаленном сервере. То есть, сервер с asterisk находится не в локальной сети, а в локальной сети нет ни одной машинки с линуксом. Конечно, можно было установить [...]]]></description>
			<content:encoded><![CDATA[<p>Создание удаленной факс-машины представляется довольно громоздкой системой. Как правило, <a href="http://asteriskforum.ru/viewtopic.php?t=1677">для решения</a> устанавливают Samba на сервер, на котором установлен Asterisk, на ней поднимается виртуальный принтер.</p>
<p>Мне же требовалась факс машина на удаленном сервере. То есть, сервер с asterisk находится не в локальной сети, а в локальной сети нет ни одной машинки с линуксом. Конечно, можно было установить <a href="http://www.andlinux.org/">andLinux</a> или голый <a href="http://www.colinux.org/">coLinux</a>&#8230; Но это очень сильно попахивало забиванием гвоздей паровым молотом. Можно, но что-то не для того он предназначен.</p>
<p>Посему родилась <a href="http://asteriskforum.ru/viewtopic.php?t=4495">такая схема</a>:<br />
 1. Ставится виртуальный принтер http://sourceforge.net/projects/imageprinter/<br />
 2. В нем ставится формат TIFF + FAX3 + Multiple page, с сохранением в C:\FAX и запуском после C:\FAX\fax.vbs<br />
 3. В c:\fax\ складывается файлик fax.vbs</p>
<p>Получается так: пользователь печатает на Imageprinter, получает в ответ запрос на какой номер отправить факс, затем fax.vbs делает следующее:<br />
1. Пакует rar&#8217;ом картинку (что сильно утрамбовывает ее. если рара нет &#8212; уйдёт непакованное)<br />
2. отсылает POST&#8217;ом по http эту картинку на http://куданадо/fax/?fax=введенныйномер</p>
<p>На сервере /fax/index.php производит следующее:<br />
1. Распаковывает картинку (если пакованная)<br />
2. Создаёт .call файл<br />
3. Переносит его в spool директорию астериска, в outgoing.</p>
<p>Пример кода приведён в конце записи. Пример не содержит авторизации, обхода проблем прав доступа и тд, однако подойдёт для начала экспериментов.<br />
Скачать: <a href='http://blog.datacompboy.ru/wp-content/uploads/2009/08/faxvbs.rar'>fax.vbs + index.php</a></p>
<p>P.S.: Для asterisk-1.4 TxFAX и RxFAX берут <a href="http://agx-ast-addons.sourceforge.net/">отсюда</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.datacompboy.ru/2009/08/02/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d0%b0%d1%8f-%d1%84%d0%b0%d0%ba%d1%81-%d0%bc%d0%b0%d1%88%d0%b8%d0%bd%d0%b0-%d0%bd%d0%b0-asterisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
