tag:blogger.com,1999:blog-58710938746098490362024-02-06T23:36:43.530-08:00Только рабочие схемы!Anonymoushttp://www.blogger.com/profile/01601461793294705109noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-5871093874609849036.post-28990324866842267622012-12-07T01:39:00.001-08:002012-12-07T01:39:15.169-08:00Ссылки на дочерние страницы ресурса<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
Ссылки на дочерние страницы</div>
<br />
<div style="text-align: center;">
<a href="http://electrosch.blogspot.com/p/85.html" target="_blank">МК85Р - Реплика знаменитого калькулятора</a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="http://electrosch.blogspot.com/p/85-atmega8.html" target="_blank">Контроллер дисплея МК85 на ATMega8</a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="http://electrosch.blogspot.com/p/blog-page.html" target="_blank">Консультационный радиотехнический центр</a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<a href="http://electrosch.blogspot.com/p/blog-page_4135.html" target="_blank">Галерея моей милой</a></div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/01601461793294705109noreply@blogger.com0tag:blogger.com,1999:blog-5871093874609849036.post-38303896475532806172012-09-22T10:21:00.002-07:002012-09-22T10:21:21.477-07:00ArduinoMania<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
Различные проекты на платформе Arduino.</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/01601461793294705109noreply@blogger.com0tag:blogger.com,1999:blog-5871093874609849036.post-11292166313244178252012-09-22T10:19:00.002-07:002013-03-12T11:09:57.761-07:00Проекты на ATMega8<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
<b>Проекты на АТMega8.</b></div>
<div style="text-align: center;">
Простые проекты для изучения одного из самых простых и массовых микроконтроллеров.</div>
<div style="text-align: center;">
Для работы вам понадобится как минимум CodeVision AVR2.04.4a и Proteus 7.2 SP6. Если желаете поработать с "железом", вам понадобится и программатор. Советую вот <a href="http://prottoss.com/projects/AVR910.usb.prog/avr910_usb_programmer.htm" target="_blank">такой</a> - легко собирается, хорошо работает. Единственная проблема с первоначальной прошивкой ATMega8, это можно сделать либо через порт LPT - <a href="http://www.microcontrollerov.net/programmators/5-provodov-avr" target="_blank">5-provodov-avr</a>, либо купить "зашитый" микроконтроллер, я брал <a href="http://www.chipelectronics.by/" target="_blank">здесь</a>.</div>
<div style="text-align: center;">
<b><br /></b></div>
<div style="text-align: center;">
<b><br /></b>
<b>Светофор №1.</b></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Простейший светофор на одно направление не требует для создания больших усилий и навыков. Схема собирается за несколько минут. Резисторы подбираются исходя из используемых светодиодов (номинал 470 Ом указан для "советских" АЛ307), следует заметить, что на схеме вывод AVCC подключен к питанию, если его не подключить на реальном микроконтроллере независимо от использования встроенного АЦП (аналого-цифрового преобразователя), то можно вывести микросхему из строя (справедливо для любых контроллеров серии Mega)!!!</div>
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUacTls0knVNSg6lJDsCMuOVzeGNcZDAX_jH82q1YZU3eKdrjfC6g3kju4n-8BpZNck2iTr3-y3_tdqGpkPBhO24GwvpLdb6bH4K_X8fb63jfSaeT0F8vyNQFl1ric6MzPZ4rJlN1HmfQ0/s1600/swetofor1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="417" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUacTls0knVNSg6lJDsCMuOVzeGNcZDAX_jH82q1YZU3eKdrjfC6g3kju4n-8BpZNck2iTr3-y3_tdqGpkPBhO24GwvpLdb6bH4K_X8fb63jfSaeT0F8vyNQFl1ric6MzPZ4rJlN1HmfQ0/s640/swetofor1.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Исходный код настолько простой, что я его представлю прямо здесь. Этот код для Си я нашёл в интернете и немного подправил, однако, любой программист скажет вам, что этот код является бестолковым (далее я опишу, как именно требуется писать такие программы), но зато - простым, наглядным и рабочим.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i><span style="font-size: small;">/*****************************************************</span></i></div>
<i><span style="font-size: small;">Chip type : ATmega8</span></i><br />
<i><span style="font-size: small;">Program type : Application</span></i><br />
<i><span style="font-size: small;">AVR Core Clock frequency: 1.000000 MHz</span></i><br />
<i><span style="font-size: small;">Memory model : Small</span></i><br />
<i><span style="font-size: small;">Data Stack size : 256</span></i><br />
<i><span style="font-size: small;">*****************************************************/</span></i><br />
<div class="separator" style="clear: both; text-align: left;">
<i><span style="font-size: small;"><br /></span></i></div>
<div class="separator" style="clear: both; text-align: left;">
<i><span style="font-size: small;">#include <mega8.h></span></i></div>
<i><span style="font-size: small;">#include <delay.h></span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">void main(void)</span></i><br />
<i><span style="font-size: small;">{</span></i><br />
<i><span style="font-size: small;">// Port B initialization</span></i><br />
<i><span style="font-size: small;">PORTB=0x00;</span></i><br />
<i><span style="font-size: small;">DDRB=0x00;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">// Port C initialization</span></i><br />
<i><span style="font-size: small;">PORTC=0x00;</span></i><br />
<i><span style="font-size: small;">DDRC=0x00;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">// Port D initialization</span></i><br />
<i><span style="font-size: small;">PORTD=0x00;</span></i><br />
<i><span style="font-size: small;">DDRD=0x07;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">// External Interrupt(s) initialization</span></i><br />
<i><span style="font-size: small;">// INT0: Off</span></i><br />
<i><span style="font-size: small;">// INT1: Off</span></i><br />
<i><span style="font-size: small;">MCUCR=0x00;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">// Analog Comparator initialization</span></i><br />
<i><span style="font-size: small;">// Analog Comparator: Off</span></i><br />
<i><span style="font-size: small;">// Analog Comparator Input Capture by Timer/Counter 1: Off</span></i><br />
<i><span style="font-size: small;">ACSR=0x80;</span></i><br />
<i><span style="font-size: small;">SFIOR=0x00;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">while (1) {</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.2=1; //зеленый загорается</span></i><br />
<i><span style="font-size: small;">delay_ms(8000); //горит 8 секунд</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.2=0; //Выключаем зеленый </span></i><br />
<i><span style="font-size: small;">delay_ms(500); //Ждем пол секунды</span></i><br />
<i><span style="font-size: small;">PORTD.2=1; //Включаем зеленый </span></i><br />
<i><span style="font-size: small;">delay_ms(500); //Ждем полсекунды</span></i><br />
<i><span style="font-size: small;">PORTD.2=0; //Выключаем зеленый</span></i><br />
<i><span style="font-size: small;">delay_ms(500); //Ждем полсекунды</span></i><br />
<i><span style="font-size: small;">PORTD.2=1; //Включаем зеленый </span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">/*delay_ms(500);//Ждем полсекунды </span></i><br />
<i><span style="font-size: small;">PORTD.2=0; //Выключаем зеленый </span></i><br />
<i><span style="font-size: small;">delay_ms(500); //Ждем полсекунды </span></i><br />
<i><span style="font-size: small;">PORTD.2=1; //Включаем зеленый</span></i><br />
<i><span style="font-size: small;">delay_ms(500); //Ждем полсекунды*/</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.1=1; //Включаем жёлтый</span></i><br />
<i><span style="font-size: small;">PORTD.2=0; //Выключаем зеленый </span></i><br />
<i><span style="font-size: small;">delay_ms(3000); //Ждем 3 секунды</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.0=1; //Включаем красный</span></i><br />
<i><span style="font-size: small;">PORTD.1=0; //выключаем
жёлтый
</span></i><br />
<i><span style="font-size: small;">delay_ms(9000); //на 9 секунд</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.1=1; //включаем
жёлтый
к красному </span></i><br />
<i><span style="font-size: small;">delay_ms(3000); //ждем 3 секунды</span></i><br />
<i><span style="font-size: small;">PORTD.0=0; //Выключаем красный </span></i><br />
<i><span style="font-size: small;">PORTD.1=0; //и
жёлтый
</span></i><br />
<i><span style="font-size: small;">};</span></i><br />
<i><span style="font-size: small;">}</span></i><br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Код можно ещё несколько сократить, если учесть, что по умолчанию практически все порты и регистры ATMega8 инициализированы в 0. Теперь для начинающих некоторые пояснения:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i><span style="font-size: small;">#include <mega8.h></span></i></div>
<i><span style="font-size: small;">#include <delay.h></span></i><br />
<br />
<div class="separator" style="clear: both; text-align: left;">
Это так называемые заголовочные файлы, в них написаны процедуры, которые мы применим из других файлов. Например, процедура delay_ms(X), которая определяет задержку в миллисекундах, была написана другим человеком и содержится в файле delay.с (на самом деле всё может быть не совсем так, или совсем не так, - процедуры может содержать объектный файл типа *.obj, *.asm), а правила её применения описаны в файле delay.h, который мы подключаем.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<i><span style="font-size: small;">PORTB=0x00;</span></i><br />
<i><span style="font-size: small;">DDRB=0x00;</span></i><br />
<br />
<div class="separator" style="clear: both; text-align: left;">
Зарезервированные имена, обозначающие регистры порта контроллера (его ножки сгруппированные байтом - по 8, каждый бит регистра порта соответствует своей ножке) и регистры направления обмена порта (0-вход, 1-выход)</div>
<div class="separator" style="clear: both; text-align: left;">
Например, запись DDRB.5=1 означает что ножка PB5 контроллера настроена на выход, и при записи PORTB.5=0 или =1, на данной ножке получим 0 (0...0.8 Вольта) или 1 (4...5 Вольт). Разумеется, можно и сразу целиком присвоить значение порту: PORTB=0xFF, т.е. все ножки порта PB равны 1. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i><span style="font-size: small;">while(1) {expression};</span></i></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
представляет собой бесконечный цикл, так как 1=TRUE. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div align="right" style="text-align: left;">
<div style="text-align: center;">
<b>Светофор №2.</b>
</div>
<b><br /></b> Чтобы получить светофор на два направления, надо модифицировать схему светофора №1:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbCfynUE3fRiD8ubwUMfPxEzmYkxGf8Co2xCCdDf6PNOhvMzlv50-TaUjc-EIEau1CUpsDoa-zMgBmFpiB7OoIsinlPllh7mlHaq8rcM78WvJeNBXssXpB3LHwbgGJzSLBFjGej-xkB8A_/s1600/sw2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="580" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbCfynUE3fRiD8ubwUMfPxEzmYkxGf8Co2xCCdDf6PNOhvMzlv50-TaUjc-EIEau1CUpsDoa-zMgBmFpiB7OoIsinlPllh7mlHaq8rcM78WvJeNBXssXpB3LHwbgGJzSLBFjGej-xkB8A_/s640/sw2.JPG" width="640" /></a></div>
<br />
и код светофора №1:<br />
<br />
<i><span style="font-size: small;">/*****************************************************</span></i><br />
<i><span style="font-size: small;">Chip type : ATmega8</span></i><br />
<i><span style="font-size: small;">Program type : Application</span></i><br />
<i><span style="font-size: small;">AVR Core Clock frequency: 1.000000 MHz</span></i><br />
<i><span style="font-size: small;">Memory model : Small</span></i><br />
<i><span style="font-size: small;">External RAM size : 0</span></i><br />
<i><span style="font-size: small;">Data Stack size : 256</span></i><br />
<i><span style="font-size: small;">*****************************************************/</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">#include <mega8.h></span></i><br />
<i><span style="font-size: small;">#include <delay.h></span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">void main(void)</span></i><br />
<i><span style="font-size: small;">{</span></i><br />
<i><span style="font-size: small;">// Port B initialization</span></i><br />
<i><span style="font-size: small;">PORTB=0x00;</span></i><br />
<i><span style="font-size: small;">DDRB=0x00;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">// Port C initialization</span></i><br />
<i><span style="font-size: small;">PORTC=0x00;</span></i><br />
<i><span style="font-size: small;">DDRC=0x00;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">// Port D initialization</span></i><br />
<i><span style="font-size: small;">PORTD=0x00;</span></i><br />
<i><span style="font-size: small;">DDRD=0b00111111;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">ACSR=0x80;</span></i><br />
<i><span style="font-size: small;">SFIOR=0x00;</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">while (1)</span></i><br />
<i><span style="font-size: small;">{ </span></i><br />
<i><span style="font-size: small;">PORTD.2=1; //зеленый1 загорается Z1 </span></i><br />
<i><span style="font-size: small;">PORTD.3=1; //красный2 загорается K2</span></i><br />
<i><span style="font-size: small;">delay_ms(8000); //зеленый1 горит 8 секунд</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.2=0; //выключаем зеленый1 ZM1</span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем пол секунды</span></i><br />
<i><span style="font-size: small;">PORTD.2=1; //включаем зеленый1 </span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем полсекунды</span></i><br />
<i><span style="font-size: small;">PORTD.2=0; //выключаем зеленый1</span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем полсекунды</span></i><br />
<i><span style="font-size: small;">PORTD.2=1; //включаем зеленый1 </span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем полсекунды</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.1=1; //включаем оранжевый1 J1 K2+J2</span></i><br />
<i><span style="font-size: small;">PORTD.4=1; //включаем оранжевый2</span></i><br />
<i><span style="font-size: small;">PORTD.2=0; //выключаем зеленый1 </span></i><br />
<i><span style="font-size: small;">delay_ms(2000); //ждем 2 секунды</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.0=1; //включаем красный1 K1 </span></i><br />
<i><span style="font-size: small;">PORTD.5=1; //включаем зеленый2 Z2</span></i><br />
<i><span style="font-size: small;">PORTD.1=0; //выключаем оранжевый1</span></i><br />
<i><span style="font-size: small;">PORTD.4=0; //выключаем оранжевый2</span></i><br />
<i><span style="font-size: small;">PORTD.3=0; //выключаем красный2</span></i><br />
<i><span style="font-size: small;">delay_ms(8000); //ждём 8 секунд</span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.5=0; //выключаем зеленый2 ZM2</span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем полсекунды</span></i><br />
<i><span style="font-size: small;">PORTD.5=1; //включаем зеленый2 </span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем полсекунды</span></i><br />
<i><span style="font-size: small;">PORTD.5=0; //выключаем зеленый2</span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем полсекунды</span></i><br />
<i><span style="font-size: small;">PORTD.5=1; //включаем зеленый2 </span></i><br />
<i><span style="font-size: small;">delay_ms(500); //ждем полсекунды </span></i><br />
<i><span style="font-size: small;"><br /></span></i><i><span style="font-size: small;">
</span></i><i><span style="font-size: small;">PORTD.1=1; //включаем оранжевый1 к красному1 K1+J1 </span></i><br />
<i><span style="font-size: small;">PORTD.4=1; //включаем оранжевый2 J2</span></i><br />
<i><span style="font-size: small;">PORTD.5=0; //выключаем зеленый2 </span></i><br />
<i><span style="font-size: small;">delay_ms(2000); //ждем 2 секунды</span></i><br />
<i><span style="font-size: small;">PORTD.0=0; //Выключаем красный1 </span></i><br />
<i><span style="font-size: small;">PORTD.1=0; //и оранжевый1 </span></i><br />
<i><span style="font-size: small;">PORTD.4=0; //и оранжевый2 </span></i><br />
<i><span style="font-size: small;">};</span></i><br />
<i><span style="font-size: small;">}</span></i><br />
<span style="font-size: x-small;"><br /></span>
комментарии по коду:<br />
<br />
<i>DDRD=0b00111111; //0b(b7)(b6)(b5)(b4)(b3)(b2)(b1)(b0) </i> <br />
<br />
справа битовое(двоичное) представление числа в котором слева - самый старший разряд, его же можно было записать в десятичном ( DDRD=63;) или в шестнадцатиричном виде ( DDRD=0x3F;).<br />
<br />
<i>void main(void)</i>
<br />
<br />
main главная процедура, с неё начинается выполнение программы, void означает буквально ничего (нулевой тип), вместо void можно подставить (signed или unsigned) int, long; float, double и так далее (и даже указатель на другую переменную, о чём будет рассказано позже). Причём замена void на какой-либо тип в первой позиции обозначает что данная конструкция - функция, а не процедура, и может возвращать значение, т.о. она должна быть дополнена внутри словом <b>return</b>.<br />
<br />
<i>int fun(void) {</i><br />
<i>int a=10;</i><br />
<i>return(a);</i><br />
<i>}</i><br />
<br />
все изменения производились согласно диаграмме работы:<br />
<b><br /></b>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnO7KsptTVMHXknuzO0Sxn_qPwHzo8ksGkt6R49e9m13hEufEft9xb45nl9IlK6hCKQ6rG4_HDeGTbMBsmznL4gnt75vrTMnzxdkdnpaqRbSdtskCx69VbmSyTW1Hvv-y7b7PqQ6clTH_Q/s1600/swetodiag.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnO7KsptTVMHXknuzO0Sxn_qPwHzo8ksGkt6R49e9m13hEufEft9xb45nl9IlK6hCKQ6rG4_HDeGTbMBsmznL4gnt75vrTMnzxdkdnpaqRbSdtskCx69VbmSyTW1Hvv-y7b7PqQ6clTH_Q/s400/swetodiag.JPG" width="400" /></a></div>
Диаграмма работы светофора на два направления с мигающим зелёным сигналом. Данная диаграмма взята также с просторов интернета, и по-моему: миганий зелёного сигнала должно быть больше.<b><br /></b><br />
<b><br /></b>
<br />
<div style="text-align: center;">
<b>Светофор №3.</b>
</div>
<b><br /></b> В примерах №1 и №2 было указано на несколько "прямолобое" применение кода, которое позволительно для небольших программ, однако не может быть применено из-за расточительности ресурсами в больших приложениях.<br />
Для упрощения и сокращения кода в технологических применениях программисты обычно используют автоматы. Автомат является упрощённой и достаточной моделью процесса. Например, всю работу светофора можно разбить на некоторое конечное число состояний, которые будут повторятся с некоторым периодом. Для представления автомата потребуется программный счётчик состояний и дешифратор состояний. Светофор №3, который состоит из транспортного светофора на 4 направления, 4-х пешеходных светофоров, 1-го железнодорожного для переезда, 1-го мигающего пешеходного, было бы проблематично создать без автомата.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYhM3NEq0qYD_RS1irDUsOiEHsfR__1vjrvZOGQAGv3lMB4jKyzMI5y8jeXUqKWdaM-1gME1z08yLpumqVWnHr_YBjvTNpeyvdkHF1iAbnxT7tywUfDjkKCqktDqmoPL2NKLGMQmw-MFhyphenhyphen/s1600/sw3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="459" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYhM3NEq0qYD_RS1irDUsOiEHsfR__1vjrvZOGQAGv3lMB4jKyzMI5y8jeXUqKWdaM-1gME1z08yLpumqVWnHr_YBjvTNpeyvdkHF1iAbnxT7tywUfDjkKCqktDqmoPL2NKLGMQmw-MFhyphenhyphen/s640/sw3.JPG" width="640" /></a></div>
<br />
Код без обработки пешеходных и ж/д светофоров приведен ниже. Несложно понять что процедуры типа<br />
<i>void SetRedT1(void) //Транспортный светофор1 включить красный D3</i><br />
<i>{</i><br />
<i>ptc|=0x01;</i><br />
<i>}</i>
<br />
устанавливают либо стирают отдельные биты.<br />
<br />
В главном цикле значение счётчика i постоянно увеличивается пока не достигнет 48.<br />
<i>i++;</i>
<br />
При этом счётчик обнуляется.<br />
<i>if (i==48) {i=0;}; // 24c=0.5*48</i>
<br />
<br />
В цикле постоянно происходит сравнение значения счётчика с константами, и производится работа с портами. Хоть данный код и более совершенный, чем предыдущие два, но он также более подходит для наглядности чем для работы. Профессионалы чаще всего не используют наборы отдельных операций сравнения, а пользуются операторами switch-case, или вовсе записывают заранее рассчитанные данные в массивы - пользуются готовой таблицей:<br />
<br />
<span style="font-size: small;"><i>flash unsigned char sw[N]={</i></span><br />
<span style="font-size: small;"><i>//G1Y1R1G2Y2R2 XX</i></span><br />
<span style="font-size: small;"><i>0b10000100, //1 Х периодов горят Зелёный1 и Красный2</i></span><br />
<span style="font-size: small;"><i>0b10000100, //2</i></span><br />
<span style="font-size: small;"><i>...</i></span><br />
<span style="font-size: small;"><i>0b00000100, //
Х периодов
Зелёный1 мигает,</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>0b10000100, // </i></span><br />
<span style="font-size: small;"><i>...</i></span><br />
<span style="font-size: small;"><i>0b01001100, //K-1
Зелёный1 гаснет, загораются Жёлтый1 и Жёлтый2</i></span><br />
<span style="font-size: small;"><i>0b00110000, //K Загорается Красный1, загорается Зелёный1, гаснут Жёлтый2 и Красный2</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>...</i></span><br />
<span style="font-size: small;"><i>0b01101000 //N</i></span><br />
<span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>while (1)</i></span><br />
<span style="font-size: small;"><i>{ </i></span><br />
<span style="font-size: small;"><i>i++;</i></span><br />
<span style="font-size: small;"><i>if (i==48) {i=0;}; // 24c=0.5*48 - цикл</i></span><br />
<span style="font-size: small;"><i> </i></span><br />
<span style="font-size: small;"><i>PORTC=(sw[i]>>x) | mask;</i></span><br />
<span style="font-size: small;"><i>PORTD=(sw[i]>>x)
| mask;
</i></span><br />
<span style="font-size: small;"><i>delay_ms(500); </i></span><br />
<span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i>}</i></span>
<br />
<br />
Разумеется, выражения
(sw[i]>>x) | mask
описаны условно, всё зависит от положения информации о сигналах в константе sw.<br />
<br />
<span style="font-size: small;"><i>/*****************************************************</i></span><br />
<span style="font-size: small;"><i>Chip type : ATmega8</i></span><br />
<span style="font-size: small;"><i>Program type : Application</i></span><br />
<span style="font-size: small;"><i>AVR Core Clock frequency: 1.000000 MHz</i></span><br />
<span style="font-size: small;"><i>Memory model : Small</i></span><br />
<span style="font-size: small;"><i>External RAM size : 0</i></span><br />
<span style="font-size: small;"><i>Data Stack size : 256</i></span><br />
<span style="font-size: small;"><i>*****************************************************/</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>#include <mega8.h></i></span><br />
<span style="font-size: small;"><i>#include <delay.h></i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>unsigned char ptb=0;</i></span><br />
<span style="font-size: small;"><i>unsigned char ptc=0;</i></span><br />
<span style="font-size: small;"><i>unsigned char ptd=0;</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetRedT1() //Транспортный светофор1 включить красный D3</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc|=0x01;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetRedT1() //Транспортный светофор1 выключить красный D3</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc&=~0x01;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetYelT1() //Транспортный светофор1 включить жёлтый D2</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc|=0x02;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetYelT1() //Транспортный светофор1 выключить жёлтый D2</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc&=~0x02;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetGrnT1() //Транспортный светофор1 включить зелёный D1</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc|=0x04;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetGrnT1() //Транспортный светофор1 выключить зелёный D1</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc&=~0x04;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetRedT2() //Транспортный светофор2 включить красный D6</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc|=0x08;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetRedT2() //Транспортный светофор2 выключить красный D6</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc&=~0x08;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetYelT2() //Транспортный светофор2 включить жёлтый D5</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc|=0x10;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetYelT2() //Транспортный светофор2 выключить жёлтый D5</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc&=~0x10;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetGrnT2() //Транспортный светофор2 включить зелёный D4</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc|=0x20;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetGrnT2() //Транспортный светофор2 выключить зелёный D4</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptc&=~0x20;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetRedT3() //Транспортный светофор3 включить красный D9</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd|=0x01;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetRedT3() //Транспортный светофор3 выключить красный D9</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd&=~0x01;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetYelT3() //Транспортный светофор3 включить жёлтый D8</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd|=0x02;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetYelT3() //Транспортный светофор3 выключить жёлтый D8</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd&=~0x02;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetGrnT3() //Транспортный светофор3 включить зелёный D7</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd|=0x04;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetGrnT3() //Транспортный светофор3 выключить зелёный D7</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd&=~0x04;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetRedT4() //Транспортный светофор2 включить красный D12</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd|=0x08;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetRedT4() //Транспортный светофор2 выключить красный D12</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd&=~0x08;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetYelT4() //Транспортный светофор2 включить жёлтый D11</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd|=0x10;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetYelT4() //Транспортный светофор2 выключить жёлтый D11</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd&=~0x10;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetGrnT4() //Транспортный светофор2 включить зелёный D10</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd|=0x20;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ResetGrnT4() //Транспортный светофор2 выключить зелёный D10</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ptd&=~0x20;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>// Declare your global variables here</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void main(void)</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>unsigned char i=0;</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>PORTB=0x00;</i></span><br />
<span style="font-size: small;"><i>DDRB=0xFF;</i></span><br />
<span style="font-size: small;"><i>PORTC=0x00;</i></span><br />
<span style="font-size: small;"><i>DDRC=0xFF;</i></span><br />
<span style="font-size: small;"><i>PORTD=0x00;</i></span><br />
<span style="font-size: small;"><i>DDRD=0xFF;</i></span><br />
<span style="font-size: small;"><i>ACSR=0x80;</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>while (1)</i></span><br />
<span style="font-size: small;"><i>{ </i></span><br />
<span style="font-size: small;"><i>if (i==0) {ResetYelT1();ResetRedT1();SetGrnT1(); </i></span><br />
<span style="font-size: small;"><i>ResetYelT2();SetRedT2(); </i></span><br />
<span style="font-size: small;"><i>ResetYelT3();ResetRedT3();SetGrnT3();</i></span><br />
<span style="font-size: small;"><i>ResetYelT4();SetRedT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; //0s</i></span><br />
<span style="font-size: small;"><i>if (i==16) {ResetGrnT1();</i></span><br />
<span style="font-size: small;"><i>ResetGrnT3();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; //8s</i></span><br />
<span style="font-size: small;"><i>if (i==17) {SetGrnT1();</i></span><br />
<span style="font-size: small;"><i>SetGrnT3();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; </i></span><br />
<span style="font-size: small;"><i>if (i==18) {ResetGrnT1();</i></span><br />
<span style="font-size: small;"><i>ResetGrnT3();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i>if (i==19) {SetGrnT1();</i></span><br />
<span style="font-size: small;"><i>SetGrnT3();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i>if (i==20) {ResetGrnT1();SetYelT1();</i></span><br />
<span style="font-size: small;"><i>SetYelT2(); </i></span><br />
<span style="font-size: small;"><i>ResetGrnT3();SetYelT3();</i></span><br />
<span style="font-size: small;"><i>SetYelT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; //10s</i></span><br />
<span style="font-size: small;"><i>if (i==24) {ResetYelT1();SetRedT1(); </i></span><br />
<span style="font-size: small;"><i>ResetYelT2();ResetRedT2();SetGrnT2();</i></span><br />
<span style="font-size: small;"><i>ResetYelT3();SetRedT3(); </i></span><br />
<span style="font-size: small;"><i>ResetYelT4();ResetRedT4();SetGrnT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; //12s </i></span><br />
<span style="font-size: small;"><i>if (i==40) {ResetGrnT2();</i></span><br />
<span style="font-size: small;"><i>ResetGrnT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; //20s</i></span><br />
<span style="font-size: small;"><i>if (i==41) {SetGrnT2();</i></span><br />
<span style="font-size: small;"><i>SetGrnT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; </i></span><br />
<span style="font-size: small;"><i>if (i==42) {ResetGrnT2();</i></span><br />
<span style="font-size: small;"><i>ResetGrnT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; //21s</i></span><br />
<span style="font-size: small;"><i>if (i==43) {SetGrnT2();</i></span><br />
<span style="font-size: small;"><i>SetGrnT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i>if (i==44) {SetYelT1();</i></span><br />
<span style="font-size: small;"><i>ResetGrnT2();SetYelT2();</i></span><br />
<span style="font-size: small;"><i>SetYelT3(); </i></span><br />
<span style="font-size: small;"><i>ResetGrnT4();SetYelT4();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>}; //22s </i></span><br />
<span style="font-size: small;"><i>i++;</i></span><br />
<span style="font-size: small;"><i>if (i==48) {i=0;}; // 24c=0.5*48 - цикл</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>//PORTB=ptb;</i></span><br />
<span style="font-size: small;"><i>PORTC=ptc;</i></span><br />
<span style="font-size: small;"><i>PORTD=ptd; </i></span><br />
<span style="font-size: small;"><i>delay_ms(500); </i></span><br />
<span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<br />
<br />
<div style="text-align: center;">
<b>Столбчатый индикатор.</b>
</div>
<div style="text-align: left;">
<b><br /></b></div>
<div style="text-align: left;">
Если в предыдущих примерах использовались цифровые ресурсы микроконтроллера, то данный пример использует аналоговые - АЦП. Аналого-цифровой преобразователь предназначен для дискретных преобразований аналогового сигнала в цифровой код с определённой частотой дискретизации. Для начинающих скажу лишь, что максимальная скорость оцифровки ограничена. </div>
<div style="text-align: left;">
Столбчатый индикатор отображает входное напряжение в виде столбца светящихся сегментов (или просто отдельных излучателей), что очень полезно для всяких индикаторов, примерами могут являться столбчатые индикаторы уровня записи (ИУЗ).</div>
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdEDuD3cLpXcckKjPIKQJ0Dbf5hz3ImjdX8Io4niqZqUHNn4ExQPZXelaSkcOw3_Yq2mp7d1Tzu1gpmgH4Heny9ku4xH6ETjSgds25OMNE7kMlCmnVmX3WBXdkmL1h03I35n4LvhU8DVyt/s1600/VU2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdEDuD3cLpXcckKjPIKQJ0Dbf5hz3ImjdX8Io4niqZqUHNn4ExQPZXelaSkcOw3_Yq2mp7d1Tzu1gpmgH4Heny9ku4xH6ETjSgds25OMNE7kMlCmnVmX3WBXdkmL1h03I35n4LvhU8DVyt/s640/VU2.JPG" width="640" /></a></div>
<div style="text-align: left;">
<br /></div>
Входное напряжение не должно превышать напряжение питания, и в качестве опорного напряжения используется источник питания микроконтроллера на 5 вольт, в качестве фильтра используется внешний конденсатор на выводе AREF.<br />
<br />
Код программы приведен ниже:<br />
<br />
<span style="font-size: small;"><i>/*****************************************************</i></span><br />
<span style="font-size: small;"><i>Chip type : ATmega8</i></span><br />
<span style="font-size: small;"><i>Program type : Application</i></span><br />
<span style="font-size: small;"><i>AVR Core Clock frequency: 4.000000 MHz</i></span><br />
<span style="font-size: small;"><i>Memory model : Small</i></span><br />
<span style="font-size: small;"><i>External RAM size : 0</i></span><br />
<span style="font-size: small;"><i>Data Stack size : 256</i></span><br />
<span style="font-size: small;"><i>*****************************************************/</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>#include <mega8.h></i></span><br />
<span style="font-size: small;"><i>#include <delay.h></i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>#define ADC_VREF_TYPE 0x40 //5V Vcc + C 4.7uF AREF</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>//PD0 LED1</i></span><br />
<span style="font-size: small;"><i>//PD1 LED2</i></span><br />
<span style="font-size: small;"><i>//PD2 LED3</i></span><br />
<span style="font-size: small;"><i>//PD3 LED4</i></span><br />
<span style="font-size: small;"><i>//PD4 LED5</i></span><br />
<span style="font-size: small;"><i>//PD5 LED6</i></span><br />
<span style="font-size: small;"><i>//PD6 LED7</i></span><br />
<span style="font-size: small;"><i>//PD7 LED8</i></span><br />
<span style="font-size: small;"><i>//PB0 LED9</i></span><br />
<span style="font-size: small;"><i>//PB1 LED10</i></span><br />
<span style="font-size: small;"><i>//PB2 LED11</i></span><br />
<span style="font-size: small;"><i>//PB3 LED12</i></span><br />
<span style="font-size: small;"><i>//PB4 LED13</i></span><br />
<span style="font-size: small;"><i>//PB5 LED14</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>//PC4 LED15</i></span><br />
<span style="font-size: small;"><i>//PC5 LED16</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>const </i></span><br />
<span style="font-size: small;"><i>unsigned char PD[17]=</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>0b00000000, //0</i></span><br />
<span style="font-size: small;"><i>0b00000001, //1</i></span><br />
<span style="font-size: small;"><i>0b00000011, //2</i></span><br />
<span style="font-size: small;"><i>0b00000111, //3</i></span><br />
<span style="font-size: small;"><i>0b00001111, //4</i></span><br />
<span style="font-size: small;"><i>0b00011111, //5</i></span><br />
<span style="font-size: small;"><i>0b00111111, //6</i></span><br />
<span style="font-size: small;"><i>0b01111111, //7</i></span><br />
<span style="font-size: small;"><i>0b11111111, //8 </i></span><br />
<span style="font-size: small;"><i>//_____________ </i></span><br />
<span style="font-size: small;"><i>0b11111111, //9 </i></span><br />
<span style="font-size: small;"><i>0b11111111, //10 </i></span><br />
<span style="font-size: small;"><i>0b11111111, //11 </i></span><br />
<span style="font-size: small;"><i>0b11111111, //12 </i></span><br />
<span style="font-size: small;"><i>0b11111111, //13 </i></span><br />
<span style="font-size: small;"><i>0b11111111, //14 </i></span><br />
<span style="font-size: small;"><i>0b11111111, //15 </i></span><br />
<span style="font-size: small;"><i>0b11111111 //16 </i></span><br />
<span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i>unsigned char PB[17]=</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>0b00000000, //0</i></span><br />
<span style="font-size: small;"><i>0b00000000, //1</i></span><br />
<span style="font-size: small;"><i>0b00000000, //2</i></span><br />
<span style="font-size: small;"><i>0b00000000, //3</i></span><br />
<span style="font-size: small;"><i>0b00000000, //4</i></span><br />
<span style="font-size: small;"><i>0b00000000, //5</i></span><br />
<span style="font-size: small;"><i>0b00000000, //6</i></span><br />
<span style="font-size: small;"><i>0b00000000, //7</i></span><br />
<span style="font-size: small;"><i>0b00000000, //8</i></span><br />
<span style="font-size: small;"><i>//_____________</i></span><br />
<span style="font-size: small;"><i>0b00000001, //9</i></span><br />
<span style="font-size: small;"><i>0b00000011, //10</i></span><br />
<span style="font-size: small;"><i>0b00000111, //11</i></span><br />
<span style="font-size: small;"><i>0b00001111, //12</i></span><br />
<span style="font-size: small;"><i>0b00011111, //13</i></span><br />
<span style="font-size: small;"><i>0b00111111, //14</i></span><br />
<span style="font-size: small;"><i>//_____________</i></span><br />
<span style="font-size: small;"><i>0b00111111, //15</i></span><br />
<span style="font-size: small;"><i>0b00111111 //16</i></span><br />
<span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>// Read the AD conversion result</i></span><br />
<span style="font-size: small;"><i>unsigned int read_adc(unsigned char adc_input)</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);</i></span><br />
<span style="font-size: small;"><i>// Delay needed for the stabilization of the ADC input voltage</i></span><br />
<span style="font-size: small;"><i>delay_us(10);</i></span><br />
<span style="font-size: small;"><i>// Start the AD conversion</i></span><br />
<span style="font-size: small;"><i>ADCSRA|=0x40;</i></span><br />
<span style="font-size: small;"><i>// Wait for the AD conversion to complete</i></span><br />
<span style="font-size: small;"><i>while ((ADCSRA & 0x10)==0);</i></span><br />
<span style="font-size: small;"><i>ADCSRA|=0x10;</i></span><br />
<span style="font-size: small;"><i>return ADCW;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void ADC_init()</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>// ADC initialization</i></span><br />
<span style="font-size: small;"><i>// ADC Clock frequency: 125.000 kHz</i></span><br />
<span style="font-size: small;"><i>// ADC Voltage Reference: Vcc, cap. on AREF</i></span><br />
<span style="font-size: small;"><i>ADMUX=ADC_VREF_TYPE & 0xff;</i></span><br />
<span style="font-size: small;"><i>ADCSRA=0x85;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void Decode(int signal)</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>PORTD=PD[signal];</i></span><br />
<span style="font-size: small;"><i>PORTB=PB[signal];</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>if (signal==15) {PORTC |= 0b00010000;PORTC &= 0b11011111;} </i></span><br />
<span style="font-size: small;"><i>else if (signal==16) {PORTC |= 0b00110000;}</i></span><br />
<span style="font-size: small;"><i>else {PORTC &= 0b11001111;}</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void SetupIO ()</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>// Input/Output Ports initialization</i></span><br />
<span style="font-size: small;"><i>PORTB=0b00000000;</i></span><br />
<span style="font-size: small;"><i>DDRB= 0b00111111;</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>PORTC=0b00001100;</i></span><br />
<span style="font-size: small;"><i>DDRC= 0b00110000; //PC0,PC1 = ADC0,ADC1, PC2,PC3 setup pins with PUP</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>PORTD=0x00;</i></span><br />
<span style="font-size: small;"><i>DDRD=0xFF;</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>void main(void)</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>// Analog Comparator initialization</i></span><br />
<span style="font-size: small;"><i>// Analog Comparator: Off</i></span><br />
<span style="font-size: small;"><i>// Analog Comparator Input Capture by Timer/Counter 1: Off</i></span><br />
<span style="font-size: small;"><i>ACSR=0x80;</i></span><br />
<span style="font-size: small;"><i>SFIOR=0x00;</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>SetupIO();</i></span><br />
<span style="font-size: small;"><i>ADC_init();</i></span><br />
<span style="font-size: small;"><i><br /></i></span><span style="font-size: small;"><i>
</i></span><span style="font-size: small;"><i>while (1)</i></span><br />
<span style="font-size: small;"><i>{</i></span><br />
<span style="font-size: small;"><i>Decode(read_adc(0)*0.049*0.32);</i></span><br />
<span style="font-size: small;"><i>delay_ms(100);</i></span><br />
<span style="font-size: small;"><i>};</i></span><br />
<span style="font-size: small;"><i>}</i></span><br />
<br />
Практически все приёмы, используемые в данном коде, были рассмотрены выше. Единственно хотелось бы отметить расширенную конструкцию с оператором if:<br />
<i> if () {} //если (условие соблюдается) то { }</i><br />
<i>else if () {} //иначе
если (условие соблюдается) то { }
</i><br />
<i>else {} //иначе { }</i><br />
<br />
и выражение
<i>read_adc(0)*0.049*0.32</i>
<br />
дело в том, что АЦП выдаёт свои значения по шкале 0-1023 (2^10), что соответствует шкале 0-5 вольт (т.к. опорное напряжение 5 вольт), а нам нужно получить сначала вольты, а потом перевести в количество сегментов. 1024*0.049*0.32=16 т.е. вся шкала АЦП, это 16 сегментов.<br />
Число 0.049 взято кратным числу 5 вольт /1024 отсчёта =0.0048828 (~10 отсчётов АЦП), а потом домножено на 0.32 экспериментальным методом, чтобы получить зажигание последнего сегмента при нужном входном напряжении.<br />
<b><br /></b>
<b><br /></b><br />
<div style="text-align: center;">
<b>Последовательный порт.</b>
</div>
<div style="text-align: left;">
<b><br /></b></div>
<div style="text-align: left;">
А теперь предлагаю окунуться в мир интерфейсов. Самый простой и широко используемый до недавних пор последовательный протокол RS232, хоть и считается устаревшим, но всё ещё входит в состав выпускаемых современных микроконтроллеров - и не в количестве одного, как правило теперь их не менее 4-х. Также, многие устройства, всё еще используют данный интерфейс (например, некоторые экраны VFD NoritakeItron, медленные устройства для производств и т.п.). Данный пример позволяет оценить, насколько легко и просто настроить и использовать RS232 (USART) в микроконтроллерах.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8zCgXwrw46xh2fGLheWrwnPSnMg-Aaf3-klFDowXTW0nUT7sox90uv-8OuvIMFzGU3cT2IxnjUPH7_BmXh8UtfYFEJFOAbgdSRMTlSgouxPh2FjbpeZooWSxKWJFqPKFdKs7xa8XCCFzn/s1600/rs232.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8zCgXwrw46xh2fGLheWrwnPSnMg-Aaf3-klFDowXTW0nUT7sox90uv-8OuvIMFzGU3cT2IxnjUPH7_BmXh8UtfYFEJFOAbgdSRMTlSgouxPh2FjbpeZooWSxKWJFqPKFdKs7xa8XCCFzn/s640/rs232.JPG" width="640" /></a></div>
<br />
Ниже приведен код, который осуществляет передачу символа 0.<br />
<br />
<i>/*****************************************************</i><i><br /></i><i>Chip type : ATmega8</i><i><br /></i><i>Program type : Application</i><i><br /></i><i>AVR Core Clock frequency: 1.000000 MHz</i><i><br /></i><i>Memory model : Small</i><i><br /></i><i>External RAM size : 0</i><i><br /></i><i>Data Stack size : 256</i><i><br /></i><i>*****************************************************/</i><i><br /></i><i><br /></i><i>#include <mega8.h></i><i><br /></i><i><br /></i><i>// Standard Input/Output functions</i><i><br /></i><i>//#include <stdio.h></i><i><br /></i><i><br /></i><i>#define BAUDRATE 57600</i><i><br /></i><i>#define BaudValue ((11059200UL/(BAUDRATE*16UL))-1)</i><i><br /></i><i><br /></i><i>void USART_Transmit(unsigned char data)</i><i><br /></i><i>{</i><i><br /></i><i>//{while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема</i><i><br /></i><i>UDR = data; </i><i><br /></i><i>while( !(UCSRA & (1<<UDRE)) );</i><i><br /></i><i>//UDR = data; //Начало передачи данных</i><i><br /></i><i>}</i><i><br /></i><i><br /></i><i>void USART_init(void)</i><i><br /></i><i>{</i><i><br /></i><i> UBRRH = BaudValue >> 8;</i><i><br /></i><i> UBRRL = BaudValue & 0xFF;</i><i><br /></i><i> //</i><i><br /></i><i> UCSRB=(1<<RXEN)|(1<<TXEN);</i><i><br /></i><i> DDRD=0x02;</i><i><br /></i><i> UCSRC = ( 1<<URSEL ) | ( 3<<UCSZ0 );</i><i><br /></i><i> //UCSRA = (1<<U2X_Value);</i><i><br /></i><i>}</i><i><br /></i><i><br /></i><i>void main(void)</i><i><br /></i><i>{</i><i><br /></i><i>ACSR=0x80;</i><i><br /></i><i>SFIOR=0x00;</i><i><br /></i><i>USART_init();</i><i><br /></i><i>while (1) </i><i>{</i><i>USART_Transmit(0x30);</i><i>};</i><i><br /></i><i> </i><i>}</i><i><br /></i><br />
<i><br /></i>
<i>Учтите, что Proteus не поддерживает эмуляцию </i>
<i>UCSRC (установка параметров связи порта), поэтому установите частоту генератора 3500000, а в терминале поставьте следующие параметры: </i>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitIhWFJ7wvXifoWT7GxkKE9hSlVujijZin4yYH0Bw9VgIXRlNYAaYc5WHzLsXBIGxrrG-xOgW4hQcMBzKUNbV9DxShl4zDwQZYFVg_owD95PS_xXvfbAOL1JcEuykoKAkCy6lcFmJ5adFm/s1600/term.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="378" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitIhWFJ7wvXifoWT7GxkKE9hSlVujijZin4yYH0Bw9VgIXRlNYAaYc5WHzLsXBIGxrrG-xOgW4hQcMBzKUNbV9DxShl4zDwQZYFVg_owD95PS_xXvfbAOL1JcEuykoKAkCy6lcFmJ5adFm/s400/term.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<i><br /></i></div>
<b><br /></b>
<b><br /></b></div>
</div>
Anonymoushttp://www.blogger.com/profile/01601461793294705109noreply@blogger.com0tag:blogger.com,1999:blog-5871093874609849036.post-43736399816165796302012-09-08T07:44:00.003-07:002013-01-15T10:13:25.465-08:00Детектор скрытой проводки<div dir="ltr" style="text-align: left;" trbidi="on">
Привет всем.<br />
<br />
Проводка вещь важная, и делать ремонт надо всегда аккуратно, вешаешь ли ты полку или делаешь шкаф-купе, или просто картину надо "примостить". Беда в том что проводка в наших домах в большинстве случаев, несмотря на все ГОСТы и т.д., "лежит как ей угодно" (или тому, кто её делал), иногда даже под углом 45 градусов (чтобы сэкономить несколько граммов меди или алюминия) и выяснить, как именно она проложена без экстрасенса порой не представляется возможным. Но выход всё-таки есть - воспользоваться детектором проводки. Что же такое - детектор проводки? Это прибор который улавливает на антенну электрическое или магнитное поле (или электромагнитные волны) проводника находящегося под напряжением (или подключенному к фазному проводу).<br />
В интернете полно схем таких приборов, основанных на КМОП логике (К176ЛЕ5, К561ЛН1, К561ЛЕ5 и даже на счётчиках CD4017). Все эти схемы имеют ужасные недостатки: реагируют на любые частоты, кроме нужной (даже на мобильный телефон), могут быть легко повреждены статическим электричеством (особенно К176ЛЕ5
, которая не имеет защиты от ESD) и не позволяют производить регулировку "на ходу" в широких пределах, что часто необходимо при работе (проводка может быть расположена на разной глубине, и напряжение, а значит сила электро-магнитного поля может существенно колебаться в разных случаях.<br />
На мой взгляд, для входной цепи детектора проводки идеален ОУ, т.к. он имеет приемлемые свойства и достаточно хорошую защиту от наводок, меньше логики боится ESD, и позволяет производить т.н. резонансное усиление, т.е. каскад на ОУ как правило содержит ещё и фильтр.<br />
После долгих поисков с пристрастием я остановил свой выбор на схеме с ОУ К140УД1208 отсюда <a href="http://tehpoisk.ru/articles/schemiskatskrat" target="_blank">http://tehpoisk.ru/articles/schemiskatskrat</a>. Это достаточно качественный и экономичный программируемый операционный усилитель для мобильных применений. Схема приведена на Рис.1:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL9KqtPfpRb9iRgYggu6AwN78flXgnkQc8GzovOWUqT1vfaGAosclEy65N97LGW2dTY-GvYkZAaL79zpVvl3zbPxRl1s0MX2jXPwYHpI4OoUwY1xCBKt-2oZDuvQyzh25VbGKVj1EEGQZz/s1600/!!!!%D1%83%D0%B4608.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL9KqtPfpRb9iRgYggu6AwN78flXgnkQc8GzovOWUqT1vfaGAosclEy65N97LGW2dTY-GvYkZAaL79zpVvl3zbPxRl1s0MX2jXPwYHpI4OoUwY1xCBKt-2oZDuvQyzh25VbGKVj1EEGQZz/s640/!!!!%D1%83%D0%B4608.gif" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Рис.1 - Искатель скрытой проводки на КР140УД1208 со световой и звуковой индикацией</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
После некоторых раздумий удалил правую часть схемы как ненужную и неэкономную в плане применения элементов логики.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoO6t5nDSVq96Y81FikL05JpHCPu0KUJhBLCnOzidRbQAuTE8Icq0iNOS7zhyOXbtjAZQSomfg3o6NjqvmAzK_CmU4t23RYMn37fhxWvRnuIsfGkuSvzgvjkpzuBUof4aehzt3RKfQCN_s/s1600/!!!!%D1%83%D0%B41208-2.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoO6t5nDSVq96Y81FikL05JpHCPu0KUJhBLCnOzidRbQAuTE8Icq0iNOS7zhyOXbtjAZQSomfg3o6NjqvmAzK_CmU4t23RYMn37fhxWvRnuIsfGkuSvzgvjkpzuBUof4aehzt3RKfQCN_s/s640/!!!!%D1%83%D0%B41208-2.GIF" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Рис.2 -
Искатель скрытой проводки на КР140УД1208
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Вот так-то лучше, - подумал я и собрал схему (слева на макетке). </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK8li_LENIyoqeD490-lJOnbVLJIGuGFg09Dxss_LolecZU_oxR5tGHWjau7kNOATpxaCLaSwts89qbwO0DLkKX9zCOY8NtBuhjQ0mL40Q_KVcIKQorg51ArLe1pUJfxGeXdih60gWBnQT/s1600/MAKET2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK8li_LENIyoqeD490-lJOnbVLJIGuGFg09Dxss_LolecZU_oxR5tGHWjau7kNOATpxaCLaSwts89qbwO0DLkKX9zCOY8NtBuhjQ0mL40Q_KVcIKQorg51ArLe1pUJfxGeXdih60gWBnQT/s200/MAKET2.jpg" width="200" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJCJr20e0uBC1ARlgBllMWrA_m-7-6-1ko4QMsHfkv992hH2Zx-FJoDikUBcuHpMp9UsCcbLsuqs6OmSfJOhrsE9vsDknGM4x95OxOKAmjG91yjiiruvP8yBxgUPUqU-Q_yFMznyI4zzX/s1600/MAKET1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsJCJr20e0uBC1ARlgBllMWrA_m-7-6-1ko4QMsHfkv992hH2Zx-FJoDikUBcuHpMp9UsCcbLsuqs6OmSfJOhrsE9vsDknGM4x95OxOKAmjG91yjiiruvP8yBxgUPUqU-Q_yFMznyI4zzX/s200/MAKET1.jpg" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Но...Оказалось что по свечению светодиода не совсем просто определить (измерить) максимум поля от провода, вернее - то место, где находится сам провод. Зона, где светодиод из-за своей нелинейности светится практически одинаково, довольно-таки большая (сантиметра 3...5), с помощью ручки "чувствительность" и карандаша (водим по стене и рисуем метки) это более-менее можно устранить, но работать (особенно когда тебя ждут километры проводки) не совсем удобно, поэтому возникла идея добавить к этому творению столбчатый индикатор (вольтметр) на A227D (отечественный аналог К1003ПП1) или на микроконтроллере ATTiny15L <a href="http://radiokot.ru/circuit/audio/other/14/" target="_blank">http://radiokot.ru/circuit/audio/other/14/</a>, которую я нашёл в интернете и тут же подправил "под свои нужды":</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLLxCksDFDRlN76W93E-sSMcOTCgzVjvoUq19BtgSMmtB22tpz20c7n98nPswdVFJBIJ1lZ5LhXz90-Enw2HOPMUwngt-fOq9EFVfWR4xmVke_SPYWWhRtz3lgO0lZPChCq0WaE325mhIu/s1600/011.GIF" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLLxCksDFDRlN76W93E-sSMcOTCgzVjvoUq19BtgSMmtB22tpz20c7n98nPswdVFJBIJ1lZ5LhXz90-Enw2HOPMUwngt-fOq9EFVfWR4xmVke_SPYWWhRtz3lgO0lZPChCq0WaE325mhIu/s640/011.GIF" width="520" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Рис.3 - Индикатор уровня сигнала на ATTiny15L (доработка, автор - Робин ван Aрем)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
В этой схеме рекомендую также не забывать ставить конденсаторы 100нФ по питанию. </div>
<div class="separator" style="clear: both; text-align: left;">
Однако, её я так и не собрал-в моих запасах "Тиньки" не обнаружилось. Решил я по-народному на ATMega8 собрать.</div>
<div class="separator" style="clear: both; text-align: left;">
На беду мне под руку попался немецкий индикатор VQC10, и вот что получилось.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
По-быстрому на макетке соорудил схему.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiO_xawF2pPcyB9iPQWAFJFPTWlxwe1Vw92CqeUua8Wr7VCIRc1-h_SnFbo3r67Crir9WUlrsKxyUjSnaLLGmtQIbTUhgKFhUaWQ8lIrX8eXU98usjUVojOsuvlcwrXEgLnHUr8yENe-tQ/s1600/DSC00918.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiO_xawF2pPcyB9iPQWAFJFPTWlxwe1Vw92CqeUua8Wr7VCIRc1-h_SnFbo3r67Crir9WUlrsKxyUjSnaLLGmtQIbTUhgKFhUaWQ8lIrX8eXU98usjUVojOsuvlcwrXEgLnHUr8yENe-tQ/s400/DSC00918.JPG" width="400" /></a></div>
<br />
<div style="text-align: center;">
Это она же в протеусе (за неимением модели VQC10 - заменил рассыпучкой)</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjV_p5amHXQbiHHtkK1itR4aZZArras4wPW8oaudp_wGgaZimtI_6lhLC12kSwUXIR9866gDfaCJAlaZSsABbyuxzjVz08ZZsttdu8Y1gpxfVU5VWZZvgUrUoMyFwF6kIKYDJhQrua2W7q/s1600/VQC10DProt.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjV_p5amHXQbiHHtkK1itR4aZZArras4wPW8oaudp_wGgaZimtI_6lhLC12kSwUXIR9866gDfaCJAlaZSsABbyuxzjVz08ZZsttdu8Y1gpxfVU5VWZZvgUrUoMyFwF6kIKYDJhQrua2W7q/s400/VQC10DProt.bmp" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Вид на самодельный AVR910.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0NX2Nj4Fj9V_I8h74uIm52PXLfvZYQGwv9EhL3ZW8VD-JMz0VJC05UIhMeafom3ZEoe24B7k3XDhS6i5nPjtWQ0Mwzszww6uA_p7pkNt3X877hkedzWOGLWYzmBU8BhTBqkOtUe_C7wE4/s1600/DSC00919.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0NX2Nj4Fj9V_I8h74uIm52PXLfvZYQGwv9EhL3ZW8VD-JMz0VJC05UIhMeafom3ZEoe24B7k3XDhS6i5nPjtWQ0Mwzszww6uA_p7pkNt3X877hkedzWOGLWYzmBU8BhTBqkOtUe_C7wE4/s400/DSC00919.JPG" width="400" /></a></div>
<br />
<div style="text-align: center;">
Это то, что я планировал отображать на дисплее.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHJ592pftTsbN1lA6acOoVw6ufUvzWV49yhQOlxrIhpo_h4M1C_LQDtrq59hKfhcRSluQvJCOKajBSFai1jhoupqYeb4_X4obbndAdaUz5oQciPBtc5BdQw_ReBys2KiJpDd2gm6yO3iVN/s1600/VQC10D.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="348" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHJ592pftTsbN1lA6acOoVw6ufUvzWV49yhQOlxrIhpo_h4M1C_LQDtrq59hKfhcRSluQvJCOKajBSFai1jhoupqYeb4_X4obbndAdaUz5oQciPBtc5BdQw_ReBys2KiJpDd2gm6yO3iVN/s400/VQC10D.bmp" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Продолжение следует...</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/01601461793294705109noreply@blogger.com0