<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=61&amp;t=3664&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-12-08T10:54:50+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=61&amp;t=3664&amp;mode</id>
<entry>
<author><name><![CDATA[sebolek66]]></name></author>
<updated>2013-12-08T10:54:50+01:00</updated>
<published>2013-12-08T10:54:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=60058#p60058</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=60058#p60058"/>
<title type="html"><![CDATA[Re: ASP.NET + 8-bitowce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=60058#p60058"><![CDATA[
Urwało mi xxxx<br /><br /><br /><span style="color: #FF0000">Proszę się powstrzymać od takich komentarzy na przyszłość - Różowy J.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1247">sebolek66</a> — 8 gru 2013, o 10:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-26T06:37:13+01:00</updated>
<published>2013-07-26T06:37:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43401#p43401</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43401#p43401"/>
<title type="html"><![CDATA[Re: ASP.NET + 8-bitowce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43401#p43401"><![CDATA[
Bardzo pouczający projekt. Tak na prawdę nie trzeba zaraz mieć gdzieś hostingu żeby wymyślić sposoby na zastosowanie czegoś takiego. Przecież Windowsa prawie każdy ma, w wielu firmach gdzie jest intranet, gdzie i tak często jakiś windows pełni rolę takiego ala serwerka do różnych ceków - to jak w sam raz aby zdalnie czymś zarządzać, sterować itp<br /><br />A tym bardziej fajny projekt, że znowu jak wiele innych poradników przedstawia w taki sposób krok po kroku jak osiągnąć cel i uczy czegoś. Dobra inspiracja i na takie rzeczy trzeba patrzeć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 26 lip 2013, o 06:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[lukas_]]></name></author>
<updated>2013-07-26T00:37:19+01:00</updated>
<published>2013-07-26T00:37:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43396#p43396</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43396#p43396"/>
<title type="html"><![CDATA[Re: ASP.NET + 8-bitowce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43396#p43396"><![CDATA[
Bardzo fajny projekt. Niestety moim zdaniem jest jeden minus. Jak na razie to chyba nie ma żadnych darmowych hostingów które są postawione na Windowsie (a jest to konieczne, żeby ASP.NET działało). Większość hostingów działa na linuxsie, więc pozostaje postawienie własnego serwera na Windowsie bądź wykupienie jakiegoś hostingu, który obsługuje ASP.NET. Generalnie całość wykonana bardzo fajnie i bardzo mi się podoba. Szczególnie ten motyw z tabletem mnie rozwalił. Gratuluję pomysłu i wykonania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1060">lukas_</a> — 26 lip 2013, o 00:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[savian86]]></name></author>
<updated>2013-07-25T22:08:52+01:00</updated>
<published>2013-07-25T22:08:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43380#p43380</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43380#p43380"/>
<title type="html"><![CDATA[ASP.NET + 8-bitowce]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3664&amp;p=43380#p43380"><![CDATA[
<a href="http://forum.atnel.pl/_obrazki/o/393/167020054740a24001e8e545d38dbcad.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/167020054740a24001e8e545d38dbcad.jpg" alt="Obrazek" /></a><br /><br />Powitanko  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Bardzo wiele osób w domu/firmie ma postawiony jakiś serwerek, który coś tam robi, to czemu by nie dołożyć do niego opcji: „Centrum dowodzenia”? Chciałem pokazać w jaki sposób można wykorzystać po części coraz bardziej lubiany tu na forum język C#. Ustrojstwem którego użyjemy będzie platforma ASP.NET ( nie mylić z akademią sztuk pięknych ;] ). Wykorzystano jako bazę na uC oczywiście zestaw ATB i projekt z lekcji o komendach AT z zielonej książki. Można już wywnioskować, że nie użyjemy modułu sieciowego ETH dla zestawu ATB, a jedynie wbudowanej przejścióweczki USB-UART, czyli do szczęścia potrzebny nam tylko kabelek USB.<br /><br />ASP.NET jest to technologia tworzenia stron www wchodząca w skład platformy .NET.  Kod takiej aplikacji wykonywany jest po stronie serwera, a jej wynik przekazywany do przeglądarki jako strona HTML. Bez zbędnego pitu pitu, przechodzimy do rzeczy.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Środowisko</strong></span><br /><br />Całość została wykonana na świeżutkim Win8 na wirtualnej maszynie VMware Player. Jeżeli ktoś również będzie chciał pracować na VMware, to zawczasu zaznaczam, że należy skonfigurować połączenie sieciowe z hostem jako <em>Bridge</em>.<br /><a href="http://forum.atnel.pl/_obrazki/o/393/535794f0dba8a1bc0b75fea806bc3ae5.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/535794f0dba8a1bc0b75fea806bc3ae5.jpg" alt="Obrazek" /></a><br />Po takim zabiegu wirtualna maszyna dostanie swoje własne IP na routerze. Musimy jeszcze zrobić przekierowanie naszego zewnętrznego IP właśnie na lokalny adres wirtualnej maszyny. Robimy to już w ustawieniach samego routera, wtedy będziemy mieli dostęp z dowolnego miejsca.<br /><br />W pierwszej kolejności musimy ściągnąć i zainstalować <em><strong>Microsoft Visual Studio Express 2012 for Web</strong></em> ze stronki MS. Jest to darmowy produkt, jedynie musimy się zarejestrować aby otrzymać klucz. Proces jest całkowicie bezbolesny.<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Tworzymy nowy projekt</strong></span><br /><br />Odpalamy, wybieramy <strong><em>New project -&gt; Visual C# -&gt;Web -&gt; ASP.NET Empty Web Application</em></strong>. Nadajemy nazwę jaką chcemy i OK.<br /><a href="http://forum.atnel.pl/_obrazki/o/393/9c6ad83df86dd47cbc3513b6ca933ce0.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/9c6ad83df86dd47cbc3513b6ca933ce0.jpg" alt="Obrazek" /></a><br />Mamy pusty projekt, dodajemy naszą główną stronę. W zakładce <em><strong>Solution Explorer </strong></em>prawoklik na projekt <em><strong>Add -&gt;New Item -&gt; Web Form</strong></em>. Proponuję nadać nazwę pliku <em><strong>default.aspx</strong></em> ponieważ później ułatwi nam to kilka spraw.<br /><a href="http://forum.atnel.pl/_obrazki/o/393/08fb23723865625a0434002bf37b34fa.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/08fb23723865625a0434002bf37b34fa.jpg" alt="Obrazek" /></a><a href="http://forum.atnel.pl/_obrazki/o/393/9fe8313e14b5a5061968ec4383592a74.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/9fe8313e14b5a5061968ec4383592a74.jpg" alt="Obrazek" /></a><br /><br />ASP.NET udostępnia dwie metody zarządzania strukturą kodu stron. Pierwsza polega na korzystaniu z modelu <em><strong>code-inline</strong></em>. Cały kod jest umieszczony w jednym pliku <em><strong>.aspx</strong></em>. Drugi sposób korzysta z modelu <em><strong>code-behind</strong></em>, który pozwala na oddzielenie kodu odpowiedzialnego za logikę „roboczą” od kodu realizującego logikę „prezencji”. W tym modelu logika strony www przechowywana jest w pliku .aspx, podczas gdy kod roboczy mieści się w oddzielnym pliku klasowym <em><strong>aspx.cs</strong></em>. My będziemy pracować właśnie z metodą <em><strong>code-behind</strong></em> co poprawia znacznie czytelność i poruszanie się po projekcie.<br /><br />Po wykonaniu powyższych kroków, mamy przed sobą właśnie plik z kodem prezencji. Jak widać jest to głównie html, więc osoby robiące już stronki szybko się odnajdą.<br /><a href="http://forum.atnel.pl/_obrazki/o/393/f39d90e5ee911701a37e37703a662a7b.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/f39d90e5ee911701a37e37703a662a7b.jpg" alt="Obrazek" /></a><br />Na dole okna mamy sposoby wyśiwtlania: <strong>Design – Split – Source </strong><br />W tym momencie dobrze jest dodać pliki z grafiką do naszego projektu. W zakładce <em><strong>Solution Explorer </strong></em>prawoklik na projekt <em><strong>Add -&gt;New Item -&gt;New folder</strong></em>. <br />Prawoklik na nasz nowy folder <em><strong>Add -&gt; Existing Item </strong></em>i wskazujemy pliki<br /><br /><span style="font-size: 150%; line-height: normal"><strong>Style CSS</strong></span><br /><br />Wygląd kontrolek i innych rzeczy można zmieniać w oknie properties, ale kod wtedy staje się mało czytelny i mamy ograniczone opcje. Na ratunek przychodzą kaskadowe arkusze stylów. Dodajemy do naszego projektu nowy styl:<br /><a href="http://forum.atnel.pl/_obrazki/o/393/31eae438f77e5a2c940c6daab8466af5.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/31eae438f77e5a2c940c6daab8466af5.jpg" alt="Obrazek" /></a><br />Visual Studio ma wbudowany edytor kompozycji, więc nie trzeba się za bardzo znać na CSS  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br />Między nawiasami klamrowymi prawoklik -&gt; <em><strong>Build style</strong></em><br /><a href="http://forum.atnel.pl/_obrazki/o/393/1c93cb48e78719d7e4518201221b1859.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/1c93cb48e78719d7e4518201221b1859.jpg" alt="Obrazek" /></a><br />Tutaj robimy wolną amerykankę, następnie we właściwościach jakiejś kontrolki wypełniamy pole <em><strong>CSSClass</strong></em> i już mamy przypisany styl.<br />Poniżej kod pliku css użytego w projekcie:<br /><br />[syntax=css]body {<br />    background-position: center center;<br />    background-image: url('Images/background.png');<br />    background-repeat: no-repeat;<br />    -webkit-background-size: cover;<br />    -moz-background-size: cover;<br />    -o-background-size: cover;<br />    background-size: cover;<br />    background-attachment: fixed;<br />}<br /><br /><br />#baner {<br />    width: auto;<br />    height: 210px;<br />    text-align: center;<br />    <br />    background-color: #68217A;<br />}<br /><br /><br />.table_baner {<br />    width: 100%;<br />    height: 200px;<br />}<br /><br />.tab1 {<br />    border: 5px solid white;<br />    width: 190px;<br />    text-align: center;<br />    -moz-border-radius: 120px;<br />    -webkit-border-radius: 120px;<br />    border-radius: 120px;<br />    margin-left: 100px;<br />}<br /><br />.tab3 {<br />    border: 5px solid white;<br />    width: 190px;<br />    margin-right: 100px;<br />    text-align: center;<br />    -moz-border-radius: 120px;<br />    -webkit-border-radius: 120px;<br />    border-radius: 120px;<br />}<br /><br />.temp {<br />    font-family: 'Segoe UI';<br />    font-size: 60px;<br />    color: #FFFFFF;<br />}<br /><br />#atb {<br />    margin: auto;<br />    width: 1024px;<br />    height: 654px;<br />    background-image: url('Images/atb_104.jpg');<br />    background-repeat: no-repeat;<br />}<br />.LCD {<br />    background-color: #0033CC;<br />    font-family: 'Courier New';<br />    font-size: 32px;<br />    font-weight: bolder;<br />    color: #FFFFFF;<br />    position: relative;<br />    top: 96px;<br />    left: 400px;<br />    height: 78px;<br />    width: 389px;<br />    overflow:hidden<br />}<br />.button {<br />background-color:red;<br />    opacity:0.3;<br />}.button:hover {<br /><br />background-color:#2FDE7B;<br />}<br /><br />.button-bar {<br />    border-style: none;<br />    background-color: #6699FF;<br />    font-family: 'Segoe UI';<br />    font-size: x-large;<br />    color: #FFFFFF;<br />}.button-bar:hover {<br /><br />background-color:#29C66D;<br />}<br /><br />.led {<br />    background-color:transparent;<br />}[/syntax]<br /><br />Dobra bierzemy się za pisanie kodu:<br />Wybieramy z panelu Tollbox kontrolki jakie nas interesują, robimy szatę graficzną naszej strony. Opiszę tutaj jedynie istotne komponenty:<br /><br /><span style="font-size: 150%; line-height: normal"><em><strong>AJAX</strong></em></span><br /><br />Aby nasza strona nie przeładowywała się co chwilę użyjemy komponentu AJAX. Na początek musimy dodać <em><strong>ScriptManager</strong></em>, który podpina do strony kod JavaSripta<br />[syntax=asp]&lt;asp:ScriptManager ID=&quot;ScriptManager1&quot; runat=&quot;server&quot;&gt;&lt;/asp:ScriptManager&gt;[/syntax]<br />Tworzymy teraz kontener który będzie przeładowywany : <em><strong>Update panel</strong></em>.<br />[syntax=asp]&lt;asp:UpdatePanel ID=&quot;UpdatePanel1&quot; runat=&quot;server&quot; UpdateMode=&quot;Conditional&quot;&gt;<br />            &lt;ContentTemplate&gt;<br /><br />            &lt;/ContentTemplate&gt;<br />            &lt;Triggers&gt;<br /><br />            &lt;/Triggers&gt;<br />        &lt;/asp:UpdatePanel&gt;[/syntax]<br />W polu <em><strong>Content Template</strong></em> umieszczamy to co ma być odświeżane.<br />Natomiast w polu <em><strong>Triggers</strong></em> jak nazwa wskazuje będą wyzwalacze, które zainicjują przeładowanie.<br />Poniżej cały kod pliku <em><strong>Default.aspx</strong></em><br />[syntax=asp]&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeBehind=&quot;Default.aspx.cs&quot; Inherits=&quot;ATB_ASP.Default&quot; %&gt;<br /><br />&lt;!DOCTYPE html&gt;<br /><br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;<br />&lt;head runat=&quot;server&quot;&gt;<br />    &lt;title&gt;...::: ASP.NET :::...&lt;/title&gt;<br />    &lt;link href=&quot;StyleSheet1.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;<br /><br />&lt;/head&gt;<br />&lt;body&gt;<br />    &lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;<br />        &lt;asp:ScriptManager ID=&quot;ScriptManager1&quot; runat=&quot;server&quot;&gt;&lt;/asp:ScriptManager&gt;<br />        &lt;asp:Timer ID=&quot;Timer1&quot; runat=&quot;server&quot; Interval=&quot;700&quot; OnTick=&quot;Timer1_Tick&quot; Enabled=&quot;False&quot;&gt;&lt;/asp:Timer&gt;<br />        &lt;asp:UpdatePanel ID=&quot;UpdatePanel1&quot; runat=&quot;server&quot; UpdateMode=&quot;Conditional&quot;&gt;<br />            &lt;ContentTemplate&gt;<br /><br />                &lt;div id=&quot;baner&quot;&gt;<br /><br />                    &lt;table class=&quot;table_baner&quot;&gt;<br />                        &lt;tr&gt;<br /><br />                            &lt;td class=&quot;tab1&quot;&gt;<br />                                &lt;asp:Label ID=&quot;Label_volt&quot; runat=&quot;server&quot; Text=&quot;????&quot; CssClass=&quot;temp&quot;&gt;&lt;/asp:Label&gt;<br />                            &lt;/td&gt;<br /><br />                            &lt;td&gt;<br />                                &lt;asp:Button ID=&quot;B_polacz&quot; runat=&quot;server&quot; Text=&quot;Połącz&quot; CssClass=&quot;button-bar&quot; Height=&quot;55px&quot; Width=&quot;252px&quot; OnClick=&quot;B_polacz_Click&quot; /&gt;<br />                                &lt;asp:Button ID=&quot;B_cls&quot; runat=&quot;server&quot; Text=&quot;Wyczyść LCD&quot; CssClass=&quot;button-bar&quot; Height=&quot;55px&quot; Width=&quot;158px&quot; OnClick=&quot;B_cls_Click&quot; /&gt;<br />                                &lt;asp:Button ID=&quot;B_lcd_led&quot; runat=&quot;server&quot; Text=&quot;LCD LED&quot; CssClass=&quot;button-bar&quot; Height=&quot;55px&quot; Width=&quot;123px&quot; OnClick=&quot;B_lcd_led_Click&quot; /&gt;<br />                                &lt;br /&gt;<br />                                &lt;asp:DropDownList ID=&quot;ComList&quot; runat=&quot;server&quot; Style=&quot;position: relative; top: 14px; left: -208px&quot; CssClass=&quot;button-bar&quot; Width=&quot;120px&quot;&gt;<br />                                &lt;/asp:DropDownList&gt;<br /><br />                            &lt;/td&gt;<br />                            &lt;td class=&quot;tab3&quot;&gt;<br />                                &lt;asp:Label ID=&quot;Label_temp&quot; runat=&quot;server&quot; Text=&quot;????&quot; CssClass=&quot;temp&quot;&gt;&lt;/asp:Label&gt;<br />                            &lt;/td&gt;<br />                        &lt;/tr&gt;<br />                    &lt;/table&gt;<br />                &lt;/div&gt;<br />            &lt;/ContentTemplate&gt;<br />            &lt;Triggers&gt;<br /><br />                &lt;asp:AsyncPostBackTrigger ControlID=&quot;Timer1&quot; EventName=&quot;Tick&quot; /&gt;<br /><br />            &lt;/Triggers&gt;<br />        &lt;/asp:UpdatePanel&gt;<br />        &lt;br /&gt;<br /><br />        &lt;div id=&quot;atb&quot;&gt;<br />            &lt;asp:UpdatePanel ID=&quot;UpdatePanel3&quot; runat=&quot;server&quot; UpdateMode=&quot;Conditional&quot;&gt;<br />            &lt;ContentTemplate&gt;<br />            &lt;asp:TextBox ID=&quot;TextBox_LCD&quot; runat=&quot;server&quot; TextMode=&quot;MultiLine&quot; CssClass=&quot;LCD&quot; OnTextChanged=&quot;TextBox_LCD_TextChanged&quot;&gt;&lt;/asp:TextBox&gt;<br />            &lt;asp:Button ID=&quot;B_reset&quot; runat=&quot;server&quot; CssClass=&quot;button&quot; Height=&quot;36px&quot;<br />                Style=&quot;position: relative; top: 339px; left: -347px; width: 38px&quot; OnClick=&quot;B_reset_Click&quot; /&gt;<br />            &lt;asp:Button ID=&quot;Button1&quot; runat=&quot;server&quot; CssClass=&quot;button&quot; Height=&quot;36px&quot;<br />                Style=&quot;position: relative; top: 531px; left: -67px; width: 38px&quot; OnClick=&quot;Button1_Click&quot; /&gt;<br />            &lt;asp:Button ID=&quot;Button2&quot; runat=&quot;server&quot; CssClass=&quot;button&quot; Height=&quot;36px&quot;<br />                Style=&quot;position: relative; top: 531px; left: -61px; width: 38px&quot; OnClick=&quot;Button2_Click&quot; /&gt;<br />            &lt;asp:Button ID=&quot;Button3&quot; runat=&quot;server&quot; CssClass=&quot;button&quot; Height=&quot;36px&quot;<br />                Style=&quot;position: relative; top: 531px; left: -60px; width: 38px&quot; OnClick=&quot;Button3_Click&quot; /&gt;<br />                 &lt;/ContentTemplate&gt;<br />            &lt;Triggers&gt;<br /><br />                &lt;asp:AsyncPostBackTrigger ControlID=&quot;B_polacz&quot; EventName=&quot;Click&quot; /&gt;<br /><br />            &lt;/Triggers&gt;<br />        &lt;/asp:UpdatePanel&gt;<br /><br />            &lt;asp:UpdatePanel ID=&quot;UpdatePanel2&quot; runat=&quot;server&quot; UpdateMode=&quot;Conditional&quot;&gt;<br />            &lt;ContentTemplate&gt;<br />            &lt;asp:TextBox ID=&quot;LED2&quot; runat=&quot;server&quot; Style=&quot;position: relative; top: 382px; left: 392px; width: 10px&quot; CssClass=&quot;led&quot; ReadOnly=&quot;True&quot; Enabled=&quot;False&quot;&gt;&lt;/asp:TextBox&gt;<br />            &lt;asp:TextBox ID=&quot;LED3&quot; runat=&quot;server&quot; Style=&quot;position: relative; top: 382px; left: 393px; width: 10px&quot; CssClass=&quot;led&quot; ReadOnly=&quot;True&quot; Enabled=&quot;False&quot;&gt;&lt;/asp:TextBox&gt;<br />            &lt;asp:TextBox ID=&quot;LED1&quot; runat=&quot;server&quot; Style=&quot;position: relative; top: 382px; left: 335px; width: 10px&quot; CssClass=&quot;led&quot; ReadOnly=&quot;True&quot; Enabled=&quot;False&quot;&gt;&lt;/asp:TextBox&gt;<br />                 &lt;/ContentTemplate&gt;<br />            &lt;Triggers&gt;<br /><br />                &lt;asp:AsyncPostBackTrigger ControlID=&quot;Timer1&quot; EventName=&quot;Tick&quot; /&gt;<br /><br />            &lt;/Triggers&gt;<br />        &lt;/asp:UpdatePanel&gt;<br />        &lt;/div&gt;<br /><br /><br />    &lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;[/syntax]<br /><br />A tak prezentuje się powyższy kod:<br /><a href="http://forum.atnel.pl/_obrazki/o/393/0c6707977d5869b509cb872bf6954b37.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/0c6707977d5869b509cb872bf6954b37.jpg" alt="Obrazek" /></a><br /><br /><span style="font-size: 150%; line-height: normal"><em><strong>Code-Behind</strong></em></span><br /><br />Przechodzimy do pliku <em><strong>Default.aspx.cs</strong></em> czyli naszego kodu roboczego.<br />Na początek tworzymy zmienne serwerowe:<br />[syntax=csharp]//zmienne i kontrolki serwerowe deklarujemy jako static<br />        static SerialPort UART = new SerialPort(&quot;COM3&quot;, 9600, Parity.None, 8, StopBits.One);<br />        static StringCollection at_to_send = new StringCollection();    //kolejka do wysylania polecen AT<br /><br />        static bool uart_isOpen;    //informacje o otwartym porcie COM<br />        static string RX_buffor;    //dane odebrane<br />        static bool isThread;       //flaga drugiego watku<br /><br />        static Button&#91;&#93; Buttons_collection; //kolekcja buttonow<br />        static TextBox&#91;&#93; LED_ico;   //kolekcja textboxow<br />        static int&#91;&#93; LED_ico_bg = new int&#91;&#93; {0,0,0};    //informacje o wlaczonych diodach LED na ATB<br /><br />        static string voltage;<br />        static string temperature;<br /><br />        //prefiksy polecen AT ktore nalezy obsluzyc po odebraniu<br />        static string&#91;&#93; polecenia_AT = new string&#91;&#93; {<br />&quot;LED&quot;, <br />&quot;TEMP&quot;, <br />&quot;ADC&quot;, <br />};<br /><br />        public delegate int Delegaty(string par);   //kolekcja metod[/syntax]<br />Ważne jest aby były one typu static, wtedy nie będą &quot;ulotne&quot;. Bez tego z każdym załadowaniem strony zmienne tworzone by były na nowo, a co za tym idzie stracimy wartości w nich siedzące.<br />Nie będę opisywał szczegółowo każdego bloku, zaopatrzyłem kod w komentarze.<br /><br />Mechanizm komunikacji jest taki, że odpalamy timer na serwerze który cyklicznie odpytuje zestaw ATB, natomiast drugi timer &quot;klienta&quot;, cyklicznie przepisuje wartości ze zmiennych statycznych do kontrolek wyświetlanych na stronie Web u klienta.<br /><br />[syntax=csharp]using System;<br />using System.Collections.Generic;<br />using System.Collections;<br />using System.Collections.Specialized;<br />using System.Linq;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.UI.WebControls;<br />using System.Drawing;<br />using System.IO;<br />using System.IO.Ports;<br />using System.Text;<br />using System.Threading;<br /><br />namespace ATB_ASP<br />{<br />    public partial class Default : System.Web.UI.Page<br />    {<br />        //zmienne i kontrolki serwerowe deklarujemy jako static<br />        static SerialPort UART = new SerialPort(&quot;COM3&quot;, 9600, Parity.None, 8, StopBits.One);<br />        static StringCollection at_to_send = new StringCollection();    //kolejka do wysylania polecen AT<br /><br />        static bool uart_isOpen;    //informacje o otwartym porcie COM<br />        static string RX_buffor;    //dane odebrane<br />        static bool isThread;       //flaga drugiego watku<br /><br />        static Button&#91;&#93; Buttons_collection; //kolekcja buttonow<br />        static TextBox&#91;&#93; LED_ico;   //kolekcja textboxow<br />        static int&#91;&#93; LED_ico_bg = new int&#91;&#93; {0,0,0};    //informacje o wlaczonych diodach LED na ATB<br /><br />        static string voltage;<br />        static string temperature;<br /><br />        //prefiksy polecen AT ktore nalezy obsluzyc po odebraniu<br />        static string&#91;&#93; polecenia_AT = new string&#91;&#93; {<br />&quot;LED&quot;, <br />&quot;TEMP&quot;, <br />&quot;ADC&quot;, <br />};<br /><br />        public delegate int Delegaty(string par);   //kolekcja metod<br /><br />        protected void Page_Load(object sender, EventArgs e)<br />        {<br /><br />            LED_ico = new TextBox&#91;&#93; { LED1, LED2, LED3 }; //zebranie textboxow do kolekcji<br />            Buttons_collection = new Button&#91;&#93; { B_reset, B_cls, B_lcd_led, Button1, Button2, Button3 }; //zebranie buttonow do kolekcji<br /><br />            if (!IsPostBack)    //nie bedzie wykonywane przy każdym przeladowaniu strony<br />            {<br /><br />                int tmp = 0;<br />                string&#91;&#93; porty = SerialPort.GetPortNames();     //wyszukanie portow COM dostepnych w systemie<br />                ComList.Items.Clear();<br />                foreach (string linia_ in porty) { ComList.Items.Add(linia_); tmp++; }  //zaladowanie ich do comboboxa<br />                ComList.SelectedIndex = tmp - 1;    //ustawienie na ostatnia pozycje, zazwyczaj jest to FT232<br /><br />                UART.NewLine = &quot;\r\n&quot;;  //bedzie dolaczane automatycznie do kazdej wyslanej lini przez serialport<br /><br />                check_port();<br />            }<br />           <br /><br />        }<br /><br />        void SomeMethod(object stateInfo)   //watek pracujacy w tle<br />        {<br />            <br />            if (uart_isOpen)<br />            {<br />                string&#91;&#93; addCollection = new string&#91;&#93; { &quot;AT+TEMP?&quot;, &quot;AT+ADC?&quot;, &quot;AT+LED?&quot; };     //za kazdym wywolanie odpytaj te parametry<br /><br />                at_to_send.AddRange(addCollection);     // dodaj powyzsze do juz istniejacego bufora TX<br /><br /><br />                try //zabezpieczenie przed mozliwym wysypaniem<br />                {<br />                    foreach (string line in at_to_send) <br />                    {<br />                        UART.WriteLine(line);   //wyslanie pojedynczej lini z bufora TX<br />                        Thread.Sleep(5);    //delay 5ms<br />                        int i = 0;<br /><br />                        while (i &lt; 10)  //w razie nie powodzenia wyslania podejmij maksymalnie 10 ponownych prob<br />                        {<br />                            RX_buffor += UART.ReadExisting();   //odczyt bufora RX<br /><br />                            if (RX_buffor.IndexOf(&quot;ERROR&quot;) != -1) { UART.WriteLine(line); RX_buffor = &quot;&quot;; } // sprawdz czy ponownie wyslac to samo polecenie<br /><br />                            if (-1 != RX_buffor.IndexOf('\r') &amp;&amp; RX_buffor.IndexOf(&quot;ERROR&quot;) == -1)  //wykonaj gdy popranie odebrano komunikat<br />                            {<br />                                call_service(); <br />                                break;  //przejdz do wysylania nastepnego z listy polecenia AT<br />                            }<br />                            Thread.Sleep(1);<br />                            i++;<br />                        }<br />                    }<br />                        <br />                    at_to_send.Clear(); //wyczysc bufor TX<br />                }<br />                catch<br />                {<br />                    at_to_send.Clear();<br />                }<br />            }<br />            isThread = false; //koniec pracy watku<br />        }<br /><br />     <br /><br />        protected void Timer1_Tick(object sender, EventArgs e)<br />        {<br />            if (!isThread) { System.Threading.ThreadPool.QueueUserWorkItem(SomeMethod); isThread = true; } //wywolaj watek ktory zajmie sie wysylaniem<br /><br />            //tutaj ladujemy wartosci ze zmiennych serwerowych do kontrolek i wyzwalamy updatepanel<br /><br />            Label_temp.Text = temperature; <br />            Label_volt.Text = voltage;<br /><br />            if (LED_ico_bg&#91;0&#93; == 0) LED_ico&#91;0&#93;.BackColor = Color.Red;<br />            else LED_ico&#91;0&#93;.BackColor = Color.Transparent;<br /><br />            if (LED_ico_bg&#91;1&#93; == 0) LED_ico&#91;1&#93;.BackColor = Color.Red;<br />            else LED_ico&#91;1&#93;.BackColor = Color.Transparent;<br /><br />            if (LED_ico_bg&#91;2&#93; == 0) LED_ico&#91;2&#93;.BackColor = Color.Red;<br />            else LED_ico&#91;2&#93;.BackColor = Color.Transparent;<br /><br />        }<br /><br />        protected int call_service()<br />        {<br />            string linia = &quot;&quot;;<br />            //zebranie metod do kolekcji, aby mozna bylo je zindeksowac<br />            Delegaty&#91;&#93; service = new Delegaty&#91;&#93; {<br />new Delegaty(at_led_service),<br />new Delegaty(at_temp_service),<br />new Delegaty(at_adc_service),<br />};<br /><br />            do<br />            {<br />                linia = &quot;&quot;;<br />                string header = &quot;&quot;;<br />                int idx = -1;<br />                //mechanizm rozdzielenia prefiksu od danych podobny do tego z zielonej ksiazki<br />                idx = RX_buffor.IndexOf('\r'); if (idx == -1) break;<br />                linia = RX_buffor.Substring(0, idx);<br />                if (idx &gt; 0) RX_buffor = RX_buffor.Substring(idx + 1);<br />                linia = linia.Replace(&quot;\n&quot;, &quot;&quot;);<br /><br />                if (linia.Length == 0) continue;<br />                if (linia&#91;0&#93; != '+')<br />                    continue;<br />                idx = linia.IndexOf(&quot;:&quot;);<br />                if (idx == -1)<br />                    continue;<br /><br />                header = linia.Substring(1, idx - 1);<br />                linia = linia.Substring(idx + 1);<br />                linia = linia.Replace(&quot; &quot;, &quot;&quot;);<br />                idx = 0;<br /><br />                while (true)<br />                {<br />                    if (idx == polecenia_AT.Length) { idx = -1; break; } //sprawdzanie ktora metode trzeba wywolac<br />                    else if (polecenia_AT&#91;idx&#93;.Equals(header)) break;<br />                    idx++;<br />                }<br /><br />                service&#91;idx&#93;(linia); //wywolanie odpowiedniej metody<br />            } while (RX_buffor.Length != 0 &amp;&amp; linia.Length != 0);<br /><br />            return 1;<br />        }<br /><br />        protected void B_polacz_Click(object sender, EventArgs e)<br />        {<br />            if (uart_isOpen)<br />            {<br />                UART.Close();<br />                uart_isOpen = false;<br />            }<br />            else<br />            {<br />                try<br />                {<br />                    if (UART.IsOpen)<br />                    {<br />                        UART.Close();<br />                        uart_isOpen = false;<br />                    }<br />                    else<br />                    {<br />                        UART.PortName = ComList.Text;<br />                        UART.Open();<br />                        uart_isOpen = true;<br />                    }<br />                }<br />                catch<br />                {<br />                    UART.Close();<br />                    uart_isOpen = false;<br />                }<br />            }<br /><br />            check_port();<br />        }<br /><br />        protected void check_port()<br />        {<br />            //aktywowanie/deaktywowanie kontrolek<br />            if (uart_isOpen)<br />            {<br />                B_polacz.Text = &quot;Rozłącz&quot;;<br />                ComList.Enabled = false;<br />                Timer1.Enabled = true;<br />                <br /><br />                for (int i = 0; i &lt; Buttons_collection.Count(); i++) Buttons_collection&#91;i&#93;.Enabled = true;<br />                TextBox_LCD.Enabled = true;<br />            }<br />            else<br />            {<br />                B_polacz.Text = &quot;Połącz&quot;;<br />                ComList.Enabled = true;<br />                Timer1.Enabled = false;<br /><br />                for (int i = 0; i &lt; Buttons_collection.Count(); i++) Buttons_collection&#91;i&#93;.Enabled = false;<br />                TextBox_LCD.Enabled = false;<br />            }<br />        }<br /><br />        protected void B_reset_Click(object sender, EventArgs e)<br />        {<br />            //reset ATB<br />            at_to_send.Add(&quot;AT+RST&quot;);<br />            TextBox_LCD.Text = &quot;&quot;;<br />            UpdatePanel3.Update();<br />        }<br /><br />        protected void B_cls_Click(object sender, EventArgs e)<br />        {<br />            //czysc ekran LCD<br />            at_to_send.Add(&quot;AT+CLS\r\n&quot;);<br />            TextBox_LCD.Text = &quot;&quot;;<br />            UpdatePanel3.Update();<br />        }<br /><br />        protected void B_lcd_led_Click(object sender, EventArgs e)<br />        {<br />            //podswietlenie LCD<br />            at_to_send.Add(&quot;AT+LED=4&quot;);<br />        }<br /><br />        protected void Button1_Click(object sender, EventArgs e)<br />        {<br />            //dioda LED1<br />            at_to_send.Add(&quot;AT+LED=1&quot;);<br />        }<br /><br />        protected void Button2_Click(object sender, EventArgs e)<br />        {<br />            //dioda LED2<br />            at_to_send.Add(&quot;AT+LED=2&quot;);<br />        }<br /><br />        protected void Button3_Click(object sender, EventArgs e)<br />        {<br />            //dioda LED3<br />            at_to_send.Add(&quot;AT+LED=3&quot;);<br />        }<br /><br />        protected void TextBox_LCD_TextChanged(object sender, EventArgs e)<br />        {<br />            //zmiana polskich znakow, na takie ktore lubi LCD<br />            byte&#91;&#93; bytes = Encoding.GetEncoding(&quot;Cyrillic&quot;).GetBytes(TextBox_LCD.Text);<br />            TextBox_LCD.Text = Encoding.ASCII.GetString(bytes);<br /><br />            //wyswietlanie tylko 32 znakow, wiadomo 2x16<br />            if (TextBox_LCD.Text.Length &gt; 32) { TextBox_LCD.Text = TextBox_LCD.Text.Substring(0, 32); UpdatePanel3.Update(); }<br /><br /><br />            at_to_send.Add(&quot;AT+LCD=&quot; + TextBox_LCD.Text); //wyslanie na LCD<br />        }<br /><br />        protected int at_led_service(string par)<br />        {<br />            //odebranie stanu diod LED i podswietlenia LCD<br />            int idx = -1;<br /><br />            idx = par.IndexOf(&quot;,&quot;); if (idx == -1) return -1;<br /><br />            if(!int.TryParse(par.Substring(0, idx), out LED_ico_bg&#91;0&#93;)) return -1;<br /><br />            par = par.Substring(idx + 1);<br />            idx = par.IndexOf(&quot;,&quot;); if (idx == -1) return -1;<br />            if (!int.TryParse(par.Substring(0, idx), out LED_ico_bg&#91;1&#93;)) return -1;<br />            par = par.Substring(idx + 1);<br />            idx = par.IndexOf(&quot;,&quot;); if (idx == -1) return -1;<br />            if (!int.TryParse(par.Substring(0, idx), out LED_ico_bg&#91;2&#93;)) return -1;<br /><br />            return 0;<br />        }<br /><br />        protected int at_temp_service(string par)<br />        {<br />            //odebranie temperatury<br />            temperature = par;<br />            return 0;<br />        }<br /><br /><br />        protected int at_adc_service(string par)<br />        {<br />            //odebranie napiecia<br />            voltage = par;<br />            return 0;<br />        }<br /><br />       <br />       <br />    }<br />}[/syntax]<br /><br />Podczas testowania stronki jest ona uruchamiana na wirtualnym serwerze i nie ma do niego dostępu z innego miejsca. Klikamy:<br /><br />1.Build -&gt; publish<br />2.Select or import a publish profile -&gt; new. Podajemy nazwe -&gt; ok<br />3.Publish metod -&gt; file system -&gt; c:\NazwaFolderu -&gt; next -&gt; next -&gt; publish (jeśli lokalizacja będzie inna niż dysk C, to będą problemy)<br /><br /><span style="font-size: 150%; line-height: normal"><em><strong>Publikacja strony na własnym serwerze</strong></em></span><br /><br />Aby opublikować stronkę na własnym serwerze to najpierw musimy... zainstalować serwer  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Na szczęście windowsy są uzbrojone w takie cholerstwo jak IIS, ale domyślnie jest nieaktywne.<br />Przechodzimy do <em><strong>Panel Sterowania -&gt; Programy i funkcję -&gt; Wł/wył funkcję systemu</strong></em> i zaznaczamy opcję <em><strong>Internetowe usługi informacyjne</strong></em> Należy pamiętać o dodatkowym rozwinięciu <em><strong>Usłgi WWW -&gt; Funkcję tworzenia aplikacji -&gt; ASP.NET 4.5</strong></em><br /><a href="http://forum.atnel.pl/_obrazki/o/393/a2782199d220c933452f8a9d362f6f4c.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/a2782199d220c933452f8a9d362f6f4c.jpg" alt="Obrazek" /></a><br /><br />Odpalamy wyszukiwarę programów na windowsie <em><strong>Win+Q</strong></em> i szukamy IIS. Po odpaleniu wykonujemy:<br /><a href="http://forum.atnel.pl/_obrazki/o/393/76c47c20a88ed8f126f58938b693ea0d.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/393/76c47c20a88ed8f126f58938b693ea0d.jpg" alt="Obrazek" /></a><br /><br />1.IIS -&gt; Polłączenia (lewa kolumna) -&gt; Default Web Site -&gt; Dodaj katalog wirtualny.<br />2.Podajemy ścieżkę do naszej opublikowanego folderu na dysku C<br />3.Prawoklik na nasz folder i konwertuj na aplikację<br />4.Włączamy przeglądanie katalogów<br />5.Wyłączamy windowsowego firewalla  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br /><br />Od teraz wklepujć w przeglądarkę IP/ATB_ASP mamy dostęp z zewnątrz. To tyle części PC-towej.<br /><br /><span style="font-size: 150%; line-height: normal"><em><strong>ATB-ASP kod uC</strong></em></span><br /><br />Program na uC to praktycznie cała lekcja 21 z drobnymi modyfikacjami obsługi poleceń AT<br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;main.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;MK_USART/mkuart.h&quot;//zwiekszyc bufor RX<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />#include &quot;komendy_at.h&quot;<br /><br />_T TEMP;<br />_N napiecie;<br /><br /><br />volatile uint16_t Timer1;<br />uint8_t czujniki_cnt;<br /><br />uint8_t ir_enable;// aktywacja/deaktywacja IR--&gt;TERMINAL<br />char bufor&#91;100&#93;;// bufor na potrzeby odebranych danych z UART<br /><br />ISR(TIMER2_COMP_vect) //przerwanie timera, na potrzeby utworzenia timerow programowych<br />{<br />uint16_t x;<br /><br />x=Timer1;<br />if(x) Timer1=--x;<br />}<br /><br /><br />//************ główna funkcja main() programu *****************************<br />int main(void) {<br /><br />uint16_t counter=0; //pomocnicze liczniki sekund<br />uint8_t sekundy=0;<br /><br />// podświetlenie LCD<br />LCD_LED_DIR |= LCD_LED;// kierunek WYJŚCIE<br />LCD_LED_ON;// domyślnie włączenie podświetlenia<br /><br />LED_DDR |= LED1 | LED2 | LED3;//diody led użytkownika<br /><br />KEY_DDR &amp;= ~(KEY1 | KEY2 | KEY3);//przyciski jako wejscia<br />KEY_PORT |= KEY1 | KEY2 | KEY3; //pull-upy<br /><br />// ustawienie TIMER0<br />TCCR2 |= _BV(WGM21);//CTC<br />TCCR2 |= _BV(CS22) | _BV(CS21) | _BV(CS20);//preskaler 1024<br />OCR2 =15;// F=500Hz,2ms<br />TIMSK |= _BV(OCIE2);//zezwolenie na przerwanie Compare Match<br /><br />ADMUX |= VREF_256;//napiecie referencyjne 2,56V<br />ADCSRA = (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0);//preskaler 128<br /><br />// inicjalizacja UART<br />USART_Init(__UBRR);<br /><br />// rejestracja własnej funkcji do analizowania danych odebranych przez UART<br />register_uart_str_rx_event_callback( parse_uart_data );<br /><br />// inicjalizacja LCD<br />lcd_init();<br />lcd_str(&quot; .::ASP.NET::.&quot;);// tekst powitalny<br /><br />sei();// globalne odblokowanie przerwań<br /><br />// przedstawienie się układu przez UART po starcie<br /><br />uart_puts(&quot;...::: ASP.NET :::...\r\n&quot;);<br />_delay_ms(1000);<br /><br />czujniki_cnt = search_sensors();//pierwsze wyszykanie czujnikow temperaturyna magistrali<br /><br />// pętla główna programu<br />while(1) {<br /><br />//obsluga trzech kolejnych przyciskow, reakcja tylko na wcisniecie<br />Debounce(&amp;KEY_PIN,KEY1,100,400,key1_press,0);<br />Debounce(&amp;KEY_PIN,KEY2,100,400,key2_press,0);<br />Debounce(&amp;KEY_PIN,KEY3,100,400,key3_press,0);<br /><br /><br />UART_RX_STR_EVENT(bufor);// zdarzenie odbiorcze UART<br /><br />if(0 == counter % _1s )//warunek wykonywany co 1 sekunde<br />{<br />if(sekundy==59)sekundy=0;//pomocnicze zliczanie do 1 minuty<br />else sekundy++;<br /><br />// co trzy sekundy kolejne kroki:<br />//- wyszukiwanie czujnikow<br />//- rozkaz wykonania pomiaru<br />//- odczyt pomiaru<br /><br />if(0 == (sekundy%3))czujniki_cnt = search_sensors();<br /><br />if(1 == (sekundy%3)) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />if(2 == (sekundy%3)) {<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;TEMP.subzero, &amp;TEMP.cel, &amp;TEMP.cel_fract_bits) ) {<br />TEMP.present=TRUE; //pomocnicza zmienna informująca o obecnosci czujnika<br />}<br />else TEMP.present=FALSE;<br /><br />}<br /><br />//dokonanie pomiaru z adc, kanal 0, zakres od 0 do Vref<br />napiecie.pm=get_adc(0);<br />napiecie.wynik = napiecie.pm*VREF_256_MUL*kx;<br /><br />//rozdzielenie na czesc dziesietna i ulamkowa<br />napiecie.cz_d = napiecie.wynik/10000UL;<br />napiecie.cz_u = (napiecie.wynik/100)%100;<br /><br />}<br /><br />if(counter==500) counter=1; else counter++;<br /><br />}<br /><br />}<br /><br />int get_adc(uint8_t kanal)<br />{<br />//dokonanie wlasciwego pomiaru adc<br />ADMUX = (ADMUX &amp; 0xF8) | kanal;<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));<br />return ADCW;<br />}<br /><br />void key1_press(void)<br />{<br />LED1_TOG;//zmiana stanu diody led<br />}<br /><br />void key2_press(void)<br />{<br />LED2_TOG;<br />}<br /><br />void key3_press(void)<br />{<br />LED3_TOG;<br />}<br /><br />void Debounce(volatile uint8_t *KPIN, uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void))<br />{<br />// kod w książce &quot;Mikrokontrolery AVR Język C Podstawy programowania<br />}[/syntax]<br /><br />main.h<br />[syntax=c]#ifndef MAIN_H_<br />#define MAIN_H_<br /><br />#define TRUE1<br />#define FALSE0<br /><br />// podswietlenie LCD<br />#define LCD_LED (1&lt;&lt;PB7)<br />#define LCD_LED_DIR DDRB<br />#define LCD_LED_PORT PORTB<br />#define LCD_LED_PIN PINB<br /><br />#define LCD_LED_OFF LCD_LED_PORT &amp;= ~LCD_LED<br />#define LCD_LED_ON LCD_LED_PORT |= LCD_LED<br />#define LCD_LED_TOG LCD_LED_PORT ^= LCD_LED<br /><br />// przyciski<br />#define KEY_PORTPORTC<br />#define KEY_DDRDDRC<br />#define KEY_PINPINC<br /><br />#define KEY1(1&lt;&lt;PC7)<br />#define KEY2(1&lt;&lt;PC6)<br />#define KEY3(1&lt;&lt;PC5)<br /><br />//diody led<br />#define LED_PORTPORTD<br />#define LED_DDRDDRD<br /><br />#define LED1(1&lt;&lt;PD2)<br />#define LED2(1&lt;&lt;PD3)<br />#define LED3(1&lt;&lt;PD4)<br /><br />#define LED1_TOGLED_PORT ^= LED1<br />#define LED2_TOGLED_PORT ^= LED2<br />#define LED3_TOGLED_PORT ^= LED3<br /><br />//definicje ADC<br />#define _OFFSET_ADC0<br />#define kx1<br />#define VREF_256(1&lt;&lt;REFS1)|(1&lt;&lt;REFS0)<br />#define VREF_256_MUL 25 //(uint16_t)((2.56*10000)/1024)<br /><br />//podstawy czasowe dla timerow programowych<br />#define _50ms25<br />#define _75ms37<br />#define _100ms50<br />#define _250ms125<br />#define _350ms175<br />#define _500ms250<br />#define _750ms375<br />#define _1s500<br /><br />//przechowuje pomiar temperatury<br />typedef struct{<br />uint8_t subzero, cel, cel_fract_bits,present;<br />}_T;<br /><br />//przechowuje pomiar napiecia<br />typedef struct {<br />uint32_t wynik;<br />uint8_t cz_d,cz_u;<br />uint16_t pm;<br /><br />} _N;<br /><br /><br />extern _N napiecie;<br />extern _T TEMP;<br />extern volatile uint16_t Timer1;<br /><br />int get_adc(uint8_t kanal);<br /><br />void key1_press(void);<br />void key2_press(void);<br />void key3_press(void);<br />void Debounce(volatile uint8_t *KPIN, uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void));<br /><br />#endif /* MAIN_H_ */[/syntax]<br /><br />Komendy_at.c<br /><span style="color: #FF0000">......</span><br /><br />komendy_at.h<br /><span style="color: #FF0000">......</span><br /><br /><em><strong>Wyniki</strong></em><br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Projekt C#<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=393">savian86</a> — 25 lip 2013, o 22:08</p><hr />
]]></content>
</entry>
</feed>