<?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=22&amp;t=9989&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-01-02T22:29:16+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=22&amp;t=9989&amp;mode</id>
<entry>
<author><name><![CDATA[eMCe2]]></name></author>
<updated>2015-01-02T22:29:16+01:00</updated>
<published>2015-01-02T22:29:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111875#p111875</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111875#p111875"/>
<title type="html"><![CDATA[Re: Translator pilota NEC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111875#p111875"><![CDATA[
<div class="quotetitle">Mscichu napisał(a):</div><div class="quotecontent"><br />Bardzo fajne rozwiązanie aby pozbyć się pilotów (znaczy się z kilku zrobić jeden). Też muszę coś wykombinować bo nie mam pilota do TV a uniwersalne nie działają:/<br />Czy tuner jest jeszcze na gwarancji? Można się pokusić o zmniejszenie oraz wytrawienie PCB i wszystko wsadzić w obudowę tunera.<br /></div><br /><br /><br />Polecam logitech harmony... Sam uzywam do sterowania tv,cd,amplituner i dekoder... Kupilem kiedys sprzet onkyo bez pilotow i tez szukalem czegos uniwersalnego... Fakt ze za swojego pilota 3 lata temu polozylem prawie 400 ale bylo warto! Fajne bo mozna sobie definiowac makra... I np jednym guzikiem odpala mi sie wszystko co potrzeba do ogladania tv... Na dodatek zmienie sprzet a pilot to obsluzy bo jest baza kodow online na serwerze logitecha...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1363">eMCe2</a> — 2 sty 2015, o 22:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michciobb]]></name></author>
<updated>2015-01-02T17:03:46+01:00</updated>
<published>2015-01-02T17:03:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111816#p111816</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111816#p111816"/>
<title type="html"><![CDATA[Re: Translator pilota NEC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111816#p111816"><![CDATA[
Tuner nie jest już na gwarancji. Oczywiście można byłoby się pokusić o włożenie układu do środka. Można by całość jeszcze uprościć, biorąc napięcie zasilania z tunera, sygnał z oryginalnego odbiornika Irda i wejść z nowym sygnałem bezpośrednio bez modulowania 38 kHz. Ale pomyślałem sobie, że taki bezinwazyjny sposób stworzy mniejsze ryzyko braku telewizji na święta <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> Dla mnie BARDZO ważne było aby moja żona zobaczyła, że też może mieć jakieś korzyści z tego mojego siedzenia przed kompem... <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5403">michciobb</a> — 2 sty 2015, o 17:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mscichu]]></name></author>
<updated>2015-01-02T16:00:02+01:00</updated>
<published>2015-01-02T16:00:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111811#p111811</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111811#p111811"/>
<title type="html"><![CDATA[Re: Translator pilota NEC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111811#p111811"><![CDATA[
Bardzo fajne rozwiązanie aby pozbyć się pilotów (znaczy się z kilku zrobić jeden). Też muszę coś wykombinować bo nie mam pilota do TV a uniwersalne nie działają:/<br />Czy tuner jest jeszcze na gwarancji? Można się pokusić o zmniejszenie oraz wytrawienie PCB i wszystko wsadzić w obudowę tunera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=853">Mscichu</a> — 2 sty 2015, o 16:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michciobb]]></name></author>
<updated>2015-01-02T14:52:50+01:00</updated>
<published>2015-01-02T14:52:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111802#p111802</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111802#p111802"/>
<title type="html"><![CDATA[Translator pilota NEC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9989&amp;p=111802#p111802"><![CDATA[
Witam wszystkich uczestników forum.<br />Niniejszym chciałbym zaprezentować mój pierwszy projekt na AVR. Dzięki bezcennym poradnikom Mirka powoli uczę się programowania, dlatego też proszę o łaskawe potraktowanie moich rozwiązań. Zdaję sobie sprawę, że z całą pewnością można to rozwiązać inaczej, z pewnością łatwiej, ale mój stan wiedzy w programowaniu pozwolił mi na opracowanie tego w poniższej formie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br />A o co chodzi... Projekt powstał oczywiście z potrzeby chwili. Mam telewizor LG i do niego pilota, który może obsługiwać dwa urządzenia (można przełączać pomiędzy dwoma adresami urządzeń). Oraz, nie chwaląc się, posiadam tuner telewizyjny DVBT firmy WIWA <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" />. Tuner ten jest obsługiwany pilotem, który również działa przy kodowaniu podczerwieni NEC. Oczywiście ani adres urządzenia ani kody poszczególnych klawiszy nie odpowiadały pilotowi od telewizora. Nie rozwodząc się zbytnio pilot od tunera wyzionął ducha. Tak więc przyszedł mi do głowy pomysł, aby zbudować układ na Atmega 16, który podmieni kody wysyłane przez pilota LG dla drugiego urządzenia, na adres i kody zrozumiałe dla tunera. Ot cała filozofia.<br />Na poniższym zdjęciu pokazałem założenia czasowe dla odbierania danych i wysyłania nowych.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/5403/11c74ddf28b3c62aaffa3f9d56204749.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5403/11c74ddf28b3c62aaffa3f9d56204749.jpg" alt="Obrazek" /></a><br /><br />Przepraszam za jakość rysunku ale chyba widać ogólną zasadę. W górnej części przebieg odbierany przez odbiornik podczerwieni, a na dole przebiegi wysyłane przez diodę Irda. Najpierw odbieramy pierwszą ramkę danych. Ze względu na to, że jest za mało czasu przed pojawieniem się ewentualnego impulsu powtórki tego samego kodu, wprowadziłem zwłokę na wysłanie nowego kodu. Dlatego dopiero w następnym okresie jest dużo więcej &quot;ciszy&quot; i właśnie w tym momencie wysyłam zmienioną ramkę. W praktyce całkiem nieźle to działa.<br />Zastanawiałem się czy w ogóle jest możliwość jednoczesnego odbierania i wysyłania danych, zupełnie niezależnie od siebie, ale tu moja wiedza się niestety kończy (takie luźne pytanie).<br /><br />Na poniższym zdjęciu pokazałem &quot;zamontowane&quot; urządzenie tzn ustawione przed tunerem w taki sposób aby obudowa zasłaniała odbiornik tunera a tylko dioda nadawcza go oświetlała.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/5403/2c4b190c635723c251ce8dda157cabc7.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5403/2c4b190c635723c251ce8dda157cabc7.jpg" alt="Obrazek" /></a><br /><br />A tak wygląda po otwarciu obudowy. Jak widać całość zmontowana na płytce uniwersalnej, ale całość zmontowałem w ciągu jednego wieczoru. Wiem, że można by to wykonać ładniej ale byłem bardzo ciekawy czy będzie działać. <br /><br /><a href="http://forum.atnel.pl/_obrazki/o/5403/14463a6123da8f62892402dc3471b867.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5403/14463a6123da8f62892402dc3471b867.jpg" alt="Obrazek" /></a><a href="http://forum.atnel.pl/_obrazki/o/5403/4419545d9840e2b7c1169a68720bef81.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/5403/4419545d9840e2b7c1169a68720bef81.jpg" alt="Obrazek" /></a><br /><br />A teraz to czego boję się najbardziej  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> mój kod. Na pewno będzie tam widoczny wpływ wielu rad Mirka i z czym się liczę wielu niedociągnięć, przed którymi przestrzegał  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> * Created: 10/22/2014 6:11:10 PM<br /> *  Author: michciobb<br /> * Odczytuje kody pilota w formacie NEC telewizora LG<br /> * po przełączeniu na drugie urządzenie i zamienia je<br /> * na kody sterujące tunerem TV firmy WIVA<br /> * Oba urządzenia pracują w systemie nadawania NEC.<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />// Definicja nazwy portu, do którego podłączamy odbiornik podczerwieni<br />#define NEC_IN (PINB &amp; (1&lt;&lt;PB0))<br /><br />// Uruchamia świecenie diody nadawczej z częstotliwością 38 kHz<br />#define LED_ON (TCCR0 = (1&lt;&lt;FOC0) | (1&lt;&lt;WGM01) | (1&lt;&lt;COM00) | (1&lt;&lt;CS00))<br /><br />// Wyłącza nadawanie diody nadawczej.<br />#define LED_OFF (TCCR0 = (1&lt;&lt;FOC0) | (1&lt;&lt;COM01) | (1&lt;&lt;CS00))<br /><br />// Definicja typu zmiennych<br />typedef unsigned char uchr_8;<br /><br />//Zmienne globalne odliczające czas<br />volatile uchr_8 timerL;<br />volatile uchr_8 timerH;<br />volatile uchr_8 tH;<br />volatile uchr_8 tL;<br />volatile uint8_t timerRepeat; // Zmienna inkrementowana co 1 ms przez TIMER2.<br />// Mierzy czas od początku każdego nowego Headera.<br />volatile uint8_t REPEAT;// Zmienna ustawiana po wykryciu impulsu powrórki komendy<br />volatile uint8_t tR;<br /><br />// Zmienna przechowująca ostatnio odczytaną komendę z pilota<br />volatile uint16_t command = 0, adres = 0;<br /><br />//Tablica zawierająca oryginalne kody pilota telewizora LG (kodowanie NEC)<br />//                                 0     1     2     3     4     5     6<br />const unsigned char tvCodes&#91;&#93; = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,<br />//       7     8     9    up    down  left  right menu power   ch-  ch+   ok   input  vol+  vol-  mute<br />0x17, 0x18, 0x19, 0x40, 0x41, 0x07, 0x06, 0x43, 0x08, 0x01, 0x00, 0x44,<br />0x0b, 0x02, 0x03, 0x09 };<br /><br />//Tablica zawierająca oryginalne kody pilota tunera telewizyjnego WIWA (kodowanie NEC)<br />//                                    0     1     2     3     4     5     6<br />const unsigned char tunerCodes&#91;&#93; = { 0x01, 0x4e, 0x0d, 0x0c, 0x4a, 0x09, 0x08,<br />//       7     8     9    up    down  left  right menu power  info  exit  ok   audio  play  FF    EPG<br />0x46, 0x05, 0x04, 0x16, 0x1a, 0x51, 0x50, 0x55, 0x41, 0x58, 0x54, 0x13,<br />0x06, 0x18, 0x10, 0x59 };<br /><br />// TIMER0 wykorzystywany jest do pracy w dwóch trybach:<br />// 1- Do liczenia czasu pomiędzy zmieniającymi się stanami w trakcie odbierania bitów<br />// 2- Do generowania nośnej 38 kHz dla diody nadawczej IRDA<br /><br />// Inicjuje TIMER0 na potrzeby odbioru kodów<br />void reciveTimerInit() {<br />// włącza timer0 bez preskaletra; przepełnienie co (256* 1/8MHz)= 32us<br />TCCR0 |= (1 &lt;&lt; CS00);<br />// zerujemy bity ustawiane w trakcie inicjacji i obsługi timera w trakcie nadawania nowych kodów<br />TCCR0 &amp;= ~(1 &lt;&lt; WGM01);<br />TCCR0 &amp;= ~(1 &lt;&lt; COM00);<br />TCCR0 &amp;= ~(1 &lt;&lt; COM01);<br />TCCR0 &amp;= ~(1 &lt;&lt; FOC0);<br /><br />TIMSK |= (1 &lt;&lt; TOIE0); // włącza przerwania od przepełnienia<br />sei();<br />// uruchamia globalne przerwania<br />}<br /><br />// Inicjuje Timer0 na potrzeby generowania nośnej dla diody nadawczej Irda - 38 kHz<br />void sendTimerInit() {<br />TCCR0 |= (1 &lt;&lt; WGM01); // TIMER0 CTC MODE<br />TCCR0 |= (1 &lt;&lt; COM00); // Toggle OC0 on compare match<br />TCCR0 |= (1 &lt;&lt; CS00); // No prescaler<br />OCR0 = 110;// <br />LED_OFF;// Profilaktycznie wyłącza Led Irda<br />}<br /><br />// TIMER2 wykorzystywany jest do odmierzania maksymalnego czasu ramki.<br />// Najpóźniej po tym czasie wysyłany jest nowy cały kod lub sygnał powtórki<br /><br />// Inicjuje TIMER2 do pracy - stan OCR2 osiągany co 1 ms.<br />void repeatTimerInit() {<br />TCCR2 |= (1 &lt;&lt; WGM21); // TIMER2 CTC MODE<br />TCCR2 |= (1 &lt;&lt; COM21); // Clear OC2 on compare match<br />TCCR2 |= (1 &lt;&lt; CS21) | (1 &lt;&lt; CS20); // Set prescaler /32<br />OCR2 = 249; // generate an output compare interrupt on 249<br />TIMSK |= (1 &lt;&lt; OCIE2); //Timer2 Output Compare Match Interrupt Enable<br />}<br /><br />// Procedura uruchamiana przy przepełnieniu TIMER0<br />// Zmienne do zliczania dłuższego czasu.<br />ISR(TIMER0_OVF_vect) {<br />//zmienna timerL zwiększa się co 32 us (256 * 1/8MHz)<br />timerL++;<br /><br />//zmienna timerH zwiększa się co 8.192 ms (256 * 32 us)<br />if (!timerL)<br />timerH++;<br />}<br /><br />// Procedura uruchamiana przy osiągnięciu stanu ustawionego w OCR2<br />// wywoływana co 1 ms.<br />ISR(TIMER2_COMP_vect) {<br />timerRepeat++;<br />if (timerRepeat &gt; 138)// Jeżeli nie odbierze Headera w ciągu 138 ms<br />REPEAT = 0; // to nastąpi wyzerowanie dodatkowej zmiennej<br />}<br /><br />//Odczytanie Headera <br />uint8_t header() {<br />// zeruje liczniki<br />TCNT2 = 0;<br />timerRepeat = 0;<br /><br />TCNT0 = 0;<br />timerL = 0;<br />timerH = 0;<br /><br />// Mierzy długość trwania pierwszej nośnej<br />// Sprawdza czy pierwsza nośna trwa 9 ms<br />while (!NEC_IN) {<br />if ((timerH &gt;= 1) &amp;&amp; (timerL &gt;= 31)) //Jeżeli nośna trwa dłużej niż 9.2 ms to błąd<br />{<br />return 0;  // 0-błąd<br />}<br />}<br />// Zapamiętuje czas w dodatkowych zmiennych<br />tH = timerH;<br />tL = timerL;<br />if ((tH &lt;= 1) &amp;&amp; (tL &lt;= 19)) //Jeżeli nośna trwa krócej niż 8.8 ms to błąd<br />{<br />return 0;  // 0-błąd<br />}<br />// Sprawdza ile czasu trwa pierwsza przerwa w nośnej<br />TCNT0 = 0;<br />timerL = 0;<br />timerH = 0;<br /><br />while (NEC_IN) {<br />if (timerL &gt;= 146) //Jeżeli przerwa trwa dłużej niż 4.7 ms to błąd<br />{<br />return 0;  // 0-błąd<br />}<br />}<br />// Zapamiętuje czas w dodatkowych zmiennych<br />tH = timerH;<br />tL = timerL;<br /><br />//Jeżeli przerwa trwa około 4.5 ms to zwraca kod 1 - header początkowy<br />if ((tL &gt;= 134 &amp;&amp; tL &lt;= 146))<br />//PORTB ^= (1 &lt;&lt; PB1);<br />return 1;<br /><br />//Jeżeli przerwa trwa około 2.25 ms to zwraca kod 2 - header powtórki<br />if ((tL &gt;= 64 &amp;&amp; tL &lt;= 76))<br />_delay_us(600);<br />return 2;<br /><br />return 0; // Jeżeli czas jest inny to błąd<br />}<br /><br />//Procedura odczytu 32 bitów kodu pilota<br />uint8_t detect(void) {<br />//Definicja zmiennych lokalnych<br />uchr_8 bitcnt, temp, ref1, ref2;<br />//Zerowanie zmiennych odliczających czas<br />TCNT0 = 0;<br />timerL = 0;<br />timerH = 0;<br /><br />// Sprawczam czy pierwszy stan &quot;1&quot; nie trwa za długo<br />while (!NEC_IN)<br />if (timerL &gt; 26)<br />return 0; //Jeżeli tak to zwraca kod błędu = 0<br /><br />//Oblicza dodatkowe zmienne określające granice czasowe<br />temp = timerL; // temp przechowuje czas trwania &quot;1&quot; (powinien być taki sam dla wszystkich odczytywanych bitów<br />ref1 = temp + (temp &gt;&gt; 1); //ref1 = 1.5 * temp<br />ref2 = (temp &lt;&lt; 1) + temp + (temp &gt;&gt; 1); //ref2 = 3.5 * temp<br /><br />TCNT0 = 0;<br />timerL = 0;<br />timerH = 0;<br /><br />// Sprawdza po kolei 32 bitów<br />for (bitcnt = 0, command = 0, adres = 0; bitcnt &lt; 32; bitcnt++) {<br /><br />while (NEC_IN) {<br />}; // Czeka na zakończenie &quot;0&quot; w poszczególnym bicie<br /><br />// Jeżeli upłynie mniej niż ref1 to oznacza, że odebrano &quot;0&quot;<br />if (timerL &lt;= ref1) {<br /><br />command &lt;&lt;= 1; //Przesuwa wszystkie bity w lewo o jedno miejsze dodając &quot;0&quot; na końcu<br />//Jeżeli &quot;1&quot; nie skończy się odpowiednio szybko to :<br />while (!NEC_IN)<br />if (timerL &gt; ref2)<br />return 0;//zwraca kod błędu = 0<br />} else //Jeżeli stan &quot;0&quot; trwał dłużej niż ref1 to oznacza, że odebrano &quot;1&quot;<br />{<br />command = (command &lt;&lt; 1) | 0x01; //Przesuwa o jeden bit w lewo i dodaje &quot;1&quot; na końcu<br /><br />// Jeżeli &quot;0&quot; trwa dłużej niż ref2 to:<br />timerL = 0;<br />while (!NEC_IN)<br />if (timerL &gt; ref1)<br />return 0; //Jeżeli tak to zwraca kod błędu = 0<br />}<br /><br />if (bitcnt == 15) {<br />adres = command;<br />}<br />timerL = 0;<br /><br />}<br />timerH = 0;<br />// Zwraca 16 bitów adresu i komendy<br />return 1;<br />}<br /><br />// Funkcja odwracająca bity w przekazanym bajcie<br />// ponieważ NEC nadaje bity w odwrotnej kolejności<br />unsigned char zamiana(unsigned char b) {<br />b = (b &amp; 0xF0) &gt;&gt; 4 | (b &amp; 0x0F) &lt;&lt; 4;<br />b = (b &amp; 0xCC) &gt;&gt; 2 | (b &amp; 0x33) &lt;&lt; 2;<br />b = (b &amp; 0xAA) &gt;&gt; 1 | (b &amp; 0x55) &lt;&lt; 1;<br />return b;<br />}<br /><br />// Funkcja dokonująca wyszukania w tabli tvCodes&#91;&#93; odebranej komendy<br />// i zwraca odpowiadającą jej komendę z tablicy tunerCodes&#91;&#93;.<br />// (o tym samym indeksie i.<br />unsigned char nowaKomenda(unsigned char com) {<br />unsigned char comTemp = 0;<br />for (int i = 0; i &lt; 23; i++) {<br />if (com == tvCodes&#91;i&#93;) {<br />comTemp = tunerCodes&#91;i&#93;;<br />return comTemp;<br />}<br />}<br />return 0xff; // Jeżeli nie znalazł danego kodu to zwraca 0xFF<br />}<br /><br />void sendHeader() {<br />LED_ON;<br />_delay_ms(9);<br />LED_OFF;<br />_delay_ms(4);<br />_delay_us(500);<br />}<br />void sendRepeatHeader() {<br />sendTimerInit();<br />LED_ON;<br />_delay_ms(9);<br />LED_OFF;<br />_delay_ms(2);<br />_delay_us(250);<br />LED_ON;<br />_delay_us(560);<br />LED_OFF;<br />}<br /><br />void transmision(unsigned char addr, unsigned char comm) {<br />unsigned int addresAll, commandAll;<br />unsigned int m;<br />unsigned char a, c;<br />a = zamiana(addr);<br />c = zamiana(comm);<br />addresAll = (((a &lt;&lt; 8) | (a ^ 0xFF)));<br />commandAll = (((c &lt;&lt; 8) | (c ^ 0xFF)));<br /><br />for (m = (1 &lt;&lt; 15); m &gt; 0; m &gt;&gt;= 1) {<br />if (addresAll &amp; m) { // jeżeli bit o wartości 1<br />LED_ON;<br />_delay_us(560);<br />LED_OFF;<br />_delay_ms(1);<br />_delay_us(690);<br />} else {  // Jeżeli bit o wartości 0<br />LED_ON;<br />_delay_us(560);<br />LED_OFF;<br />_delay_us(560);<br />}<br />}<br />for (m = (1 &lt;&lt; 15); m &gt; 0; m &gt;&gt;= 1) {<br />if (commandAll &amp; m) {  // jeżeli bit o wartości 1<br />LED_ON;<br />_delay_us(560);<br />LED_OFF;<br />_delay_ms(1);<br />_delay_us(690);<br />} else {  // Jeżeli bit o wartości 0<br />LED_ON;<br />_delay_us(560);<br />LED_OFF;<br />_delay_us(560);<br />}<br />}<br />LED_ON;<br />_delay_us(560);<br />LED_OFF;<br />TCCR0 = 0;<br />}<br />void send(unsigned char adress, unsigned char znak) {<br />sendHeader();<br />transmision(adress, znak);<br />}<br /><br />int main(void) {<br />reciveTimerInit();<br />repeatTimerInit();<br /><br />//PORTC - PB0 - wejście z odbiornika podczerwieni<br />DDRB &amp;= ~(1 &lt;&lt; PB0);<br />PORTB &amp;= ~(1 &lt;&lt; PB0);<br /><br />//Dodatkowy led do PB1<br />DDRB |= (1 &lt;&lt; PB1);<br />PORTB &amp;= ~(1 &lt;&lt; PB1);<br /><br />//PB3 (OC0) - wyście dla led IRDA<br />DDRB |= (1 &lt;&lt; PB3);<br />PORTB &amp;= ~(1 &lt;&lt; PB3);<br /><br />unsigned char comBajt = 0;<br />unsigned char addrBajt = 0;<br />//char commTab&#91;5&#93;;<br />//commTab&#91;4&#93; = 0;<br />//char addrTab&#91;5&#93;;<br />//addrTab&#91;4&#93; = 0;<br />//char cmdTab&#91;5&#93;;<br />//cmdTab&#91;4&#93; = 0;<br /><br />while (1) {<br /><br />while (NEC_IN) {<br />//Pętla wykonuje się do momentu pojawienia się nośnej<br />}<br />uint8_t h = header();<br /><br />if (h == 1) {<br /><br />if (detect()) {<br />addrBajt = zamiana(adres &gt;&gt; 8) &amp; 0xFF;<br /><br />comBajt = zamiana(command &gt;&gt; 8) &amp; 0xFF;<br />comBajt = nowaKomenda(comBajt);<br />}<br />while (timerRepeat &lt; 123) {<br />if (!NEC_IN) {<br />REPEAT = 1;<br />if (header() == 2)<br />break;<br />}<br />}<br /><br />if (h == 1 &amp;&amp; !(comBajt == 0xff) &amp;&amp; (addrBajt == 0xf7)<br />&amp;&amp; (REPEAT == 0)) {<br /><br />sendTimerInit();<br />send(0x00, comBajt);<br />reciveTimerInit();<br /><br />}<br /><br />if (h == 1 &amp;&amp; !(comBajt == 0xff) &amp;&amp; (addrBajt == 0xf7)<br />&amp;&amp; (REPEAT == 1)) {<br /><br />while (timerRepeat &lt; 15) {<br />}<br />sendTimerInit();<br />send(0x00, comBajt);<br />reciveTimerInit();<br /><br />}<br />}<br /><br />if ((h == 2) &amp;&amp; !(comBajt == 0xff) &amp;&amp; (addrBajt == 0xf7)) {<br /><br />while (timerRepeat &lt; 15) {<br /><br />}<br /><br />sendRepeatHeader();<br />reciveTimerInit();<br /><br />}<br /><br />}<br /><br />return 0;<br />}[/syntax]<br /><br />Jeśli ktoś miałby ochotę to przeanalizować to będę wdzięczy za komentarze. Krytykę przyjmuję również - oczywiście w granicach rozsądku... <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> <br /><br />Najlepsze Życzenia Noworoczne<br />michciobb<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5403">michciobb</a> — 2 sty 2015, o 14:52</p><hr />
]]></content>
</entry>
</feed>