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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-25T12:19:38+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=11801&amp;mode</id>
<entry>
<author><name><![CDATA[piotr_1547]]></name></author>
<updated>2015-05-25T12:19:38+01:00</updated>
<published>2015-05-25T12:19:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130061#p130061</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130061#p130061"/>
<title type="html"><![CDATA[Re: Nie mogę sobie poradzić z kodem pilota RC5 z bluebooka]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130061#p130061"><![CDATA[
tak, mam w innej części kodu, przy starcie systemu:<br /><br />[syntax=c]//ADC - inicjalizacja<br />ADC_init();<br /><br />    //timery - inicjalizacja<br />timer_init();<br /><br />//wylaczenie komparatora analogowego, aby pobor pradu byl jak najnizszy<br />ACSR |= (1&lt;&lt;ACD);<br /><br /><br />//globalne uaktywnienie przerwań<br />sei();<br />//...[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2740">piotr_1547</a> — 25 maja 2015, o 12:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matekogon]]></name></author>
<updated>2015-05-25T11:33:32+01:00</updated>
<published>2015-05-25T11:33:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130057#p130057</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130057#p130057"/>
<title type="html"><![CDATA[Re: Nie mogę sobie poradzić z kodem pilota RC5 z bluebooka]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130057#p130057"><![CDATA[
Kolego nie widzę w kodzie [syntax=c]sei(); // zezwolenie na globalne przerwania[/syntax] chyba że masz gdzie indziej w kodzie którego nie pokazałeś<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1380">matekogon</a> — 25 maja 2015, o 11:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[piotr_1547]]></name></author>
<updated>2015-05-25T05:09:08+01:00</updated>
<published>2015-05-25T05:09:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130042#p130042</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130042#p130042"/>
<title type="html"><![CDATA[Nie mogę sobie poradzić z kodem pilota RC5 z bluebooka]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11801&amp;p=130042#p130042"><![CDATA[
Witam.<br /><br /><span style="color: #FF0000">[ poprawiłem tytuł wątku - mirekk36 ]</span><br /><br />Mam pewien problem z nadawaniem kodów w RC5. Korzystam z kodów zamieszczonych w niebieskiej książce Mirosława Kardasia, po przystosowaniu ich do Atmegi32, taktowanej takim samym rezonatorem kwarcowym jak w książce, czyli 8MHz. W programie wykorzystuję TIMER0, więc musiałem przerobić kod w taki sposób, że do generacji fali nośnej jest wykorzystywany TIM2.<br /><br />Program  w skrócie wygląda tak:<br /><br /><br />Różne definicje RC5,  diody IR i konf. portu:<br /><br />[syntax=c]//RC5<br />#define _ADDRESS_RC5 4<br />#define _CMD1_RC5 1 //enter<br />#define _CMD2_RC5 2 //cofnij<br />#define _CMD3_RC5 3 //prawo<br />#define _CMD4_RC5 4 //lewo<br />#define _CMD5_RC5 5 //gora<br />#define _CMD6_RC5 6 //dol<br /><br />//IR<br />#define LED_IR_PORT PORTD<br />#define LED_IR_PIN PIND<br />#define LED_IR_DDR DDRD<br />#define LED_IR_PIN_NR 7 //oc2<br />#define LED_IR (1&lt;&lt;LED_IR_PIN_NR)<br />#define LED_IR_OFF PORTD |= LED_IR<br />#define LED_IR_ON PORTD &amp;= ~LED_IR<br /><br />// ustawienia poerow - dioda IR<br />    LED_IR_DDR |= (LED_IR);<br />    LED_IR_PORT |= (LED_IR);//OFF = 1[/syntax]<br /><br />Konfiguracja timerów i funkcje wysyłające RC5:<br /><br />[syntax=c]void timer_init (){ //inicjalizacja TIMERA0<br />TCCR0 |= (1&lt;&lt;WGM01); //CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00); //preskaler = 1024<br />OCR0=78;<br />TIMSK |= (1&lt;&lt;OCIE0); //zezwolenie na występowanie przerwań<br /><br />//inicjalizacja T2<br />//jest uzywany do generowania fali nosnej dla IR<br />//zaladowanie OCRA do generowania falai nosnej ok 36kHz = 110<br />OCR2 = 110;<br />//ustawienie T0 w tryb = 2<br />TCCR2 |= (1&lt;&lt;WGM21); //tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20);<br /><br />//tim 1 sluzy do odmierzania opoznien z dokladnoscia do wielokrotnosci 1us.<br />//nie uzywamy przerwan<br />//ustawiami tim1 w tryb = 4 - CTC<br />TCCR1B |= (1&lt;&lt;WGM12);<br /><br />}<br /><br />//dokladna petla opozniajaca = wielokrotnosci 1us w oparciu o timer 1, taktowanie 8MHz, presc = 8<br />void czekaj_us (uint16_t usekundy) {<br />OCR1A = usekundy;<br />TIFR |= (1&lt;&lt;OCF1A);<br />TCCR1B |= (1&lt;&lt;CS11);<br />while (!(TIFR &amp; (1&lt;&lt;OCF1A))) {};<br />TCCR1B &amp;= ~(1&lt;&lt;CS11);<br />}<br /><br />//przeslanie bitu o wartosci 1<br />void send_rc5_one() {<br />czekaj_us(889);<br />TCCR2  |= (1&lt;&lt;COM20);<br />czekaj_us(889);<br />TCCR2  &amp;= ~(1&lt;&lt;COM20);<br />}<br /><br />//przeslanie bitu o wartosci 0<br />void send_rc5_zero() {<br />TCCR2  |= (1&lt;&lt;COM20);<br />czekaj_us(889);<br />TCCR2  &amp;= ~(1&lt;&lt;COM20);<br />czekaj_us(889);<br />}<br /><br />//przeslanie kompetnej ramki RC5<br />void send_rc5(uint8_t adr, uint8_t cmd, uint8_t tog) {<br />uint16_t data = 0;<br />uint8_t i = 15;<br /><br />//formowanie ramki RC5<br />//przesuwanie bitow w lewa strone<br /><br />data |= ((1&lt;&lt;15)|(1&lt;&lt;14)|(tog&lt;&lt;13)|(adr&lt;&lt;8)|(cmd&lt;&lt;2));<br /><br />//wysylanie kolejno 14 bitow<br />//2 bity startu, 1 bit tog, 5 bitow adr, 6 bit komendy<br />do {<br />if (!(data&amp; (1&lt;&lt;i))) send_rc5_zero();<br />else send_rc5_one();<br />} while (--i&gt;1);<br />}[/syntax]<br /><br /><br />i przerwanie od T0, gdzie wysyłane są kody RC5:<br /><br /><br />[syntax=c]ISR(TIMER0_COMP_vect) { //przerwanie od licznika T0 (co 10ms, zatem f_próbkowania = 100Hz)<br /><br />//inny kod.....<br />//...<br />//...<br /><br />// program odbiera dane przez USART i jak przyjdą odpowiednie znaki, wysylana jest wlasciwa komenda przez RC5<br /><br />odebrane_znaki = uart_getc();<br /><br />if (odebrane_znaki == 101) { //ENTER<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0); //dezaktyw t0<br />toggle_bit ^= (1&lt;&lt;0);<br />send_rc5(_ADDRESS_RC5, _CMD1_RC5, toggle_bit);<br />TIMSK |= (1&lt;&lt;OCIE0); //aktyw t0<br />}<br /><br />if (odebrane_znaki == 99) { //COFNIJ<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0); //dezaktyw t0<br />toggle_bit ^= (1&lt;&lt;0);<br />send_rc5(_ADDRESS_RC5, _CMD2_RC5, toggle_bit);<br />TIMSK |= (1&lt;&lt;OCIE0);<br />}<br /><br />if (odebrane_znaki == 112) { //PRAWO<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0); //dezaktyw t0<br />toggle_bit ^= (1&lt;&lt;0);<br />send_rc5(_ADDRESS_RC5, _CMD3_RC5, toggle_bit);<br />TIMSK |= (1&lt;&lt;OCIE0);<br />}<br /><br />if (odebrane_znaki == 108) { //LEWO<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0); //dezaktyw t0<br />toggle_bit ^= (1&lt;&lt;0);<br />send_rc5(_ADDRESS_RC5, _CMD4_RC5, toggle_bit);<br />TIMSK |= (1&lt;&lt;OCIE0);<br />}<br /><br />if (odebrane_znaki == 103) { //GORA<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0); //dezaktyw t0<br />toggle_bit ^= (1&lt;&lt;0);<br />send_rc5(_ADDRESS_RC5, _CMD5_RC5, toggle_bit);<br />TIMSK |= (1&lt;&lt;OCIE0);<br />}<br /><br />if (odebrane_znaki == 100) { //DOL<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0); //dezaktyw t0<br />toggle_bit ^= (1&lt;&lt;0);<br />send_rc5(_ADDRESS_RC5, _CMD6_RC5, toggle_bit);<br />TIMSK |= (1&lt;&lt;OCIE0);<br />}<br />}[/syntax]<br /><br /><br />Dioda jest podłączona katodą do portu uP, a anodą do +. NA pinie musi być &quot;0&quot;, aby dioda świeciła.<br /><br /><br />Problem jest w tym, że układ coś wysyła (sprawdziłem to kamerą, która pokazała, że dioda świeci -szybko miga - po przyjściu litery), jednak odbiornik RC5 nic nie odbiera. Oczywiście adresy i komendy, które mają sterować odbiornikiem, są poprawne. A sam odbiornik działa również OK, bo napisałem prosty program w BASCOMIE, aby sprawdzić działanie tego odbiornika - wyniki testów były pomyślne.<br />Zastanawia mnie, co może być tutaj problemem?<br /><br /><br /><br /><br />PS<br /><br />Nawiasem - odbiornikiem jest mikrokontroler z dołączonym układem TSOP 31236. Napisałem prosty program w BAscomie, który nadzoruje pracę odbiornika, tj. odczytuje przysyłane kody (które wysyła wcześniej opisany nadajnik, z którym jest problem) i steruje właściwie wyjściami uP. Zamieszczam dodatkowo program odbiornika, choć nie jest on głównym przedmiotem tego tematu:<br /><br /><br /><br />[syntax=basic4gl]$regfile = &quot;m8adef.dat&quot;<br />$crystal = 1000000<br />$lib &quot;mcsbyte.lbx&quot;<br /><br /><br />'KOMUNIKACJA IR<br /><br />Config Int0 = Falling       'przerwanie reaguje na zbocze opadające<br />On Int0 Podczerwien       'etykieta przerwania<br /><br />Config Rc5 = Pind.2 , Timer = 0 , Wait = 2000       ' użyta linia wejściowa PD2; licznik T0; oczekiwanie na ramkę-nastawy czasu<br /><br />Dim Address As Byte       'dane IR<br />Dim Command As Byte       'zmienna z danymi IR<br />Dim Odebrano As Bit       'flaga odpowiedzialna za odebranie danych przez IR<br /><br />Config Pind.2 = Input       'odbiornik IR<br />Config Pinb.1 = Output       'przek2<br />Config Pinb.2 = Output       'przek1<br />Config Pinb.3 = Output       'buzzer<br /><br />Reset Portb.1<br />Reset Portb.2<br />Set Portb.3       'buzzer<br /><br />Buzzer Alias Portb.3<br />Przek1 Alias Portb.1<br />Przek2 Alias Portb.2<br /><br />Wait 1<br />Reset Buzzer<br />Reset Przek2<br />Set Przek1<br />Wait 1<br />Set Buzzer<br />Reset Przek1<br /><br />Wait 2<br /><br />Reset Buzzer<br />Set Przek2<br />Wait 1<br />Reset Przek2<br />Set Buzzer<br /><br /><br />Enable Interrupts<br />Enable Int0       'włączenie przerwania (zewnętrzne)<br /><br /><br />Do<br /><br />If Odebrano = 1 And Address = 4 Then<br /><br /><br />   Select Case Command<br /><br />      Case 2       'off<br />         Reset Przek1<br />         Reset Przek2<br />         Reset Buzzer<br />         Waitms 200<br />         Set Buzzer<br /><br />      Case 4       'lewo - wolne<br />         Reset Buzzer<br /><br />         Reset Przek2<br />         Waitms 200<br />         Set Przek1<br /><br />         Waitms 500<br />         Set Buzzer<br /><br />      Case 3       'prawo - szybkie<br />         Reset Buzzer<br /><br />         Reset Przek1<br />         Waitms 200<br />         Set Przek2<br /><br />         Waitms 200<br />         Set Buzzer<br />         Waitms 200<br />         Reset Buzzer<br />         Waitms 400<br />         Set Buzzer<br /><br />   End Select<br /><br /><br />Odebrano = 0<br />Enable Int0<br />End If<br /><br />Loop<br /><br /><br />Podczerwien:       'odbiór danych IR<br /><br />   Disable Int0       'wyłączenie przerwań<br />   Enable Interrupts<br />   Getrc5(address , Command)<br />   If Address &lt;&gt; 255 And Command &lt;&gt; 255 Then       'jak dane są sensowne<br />      Command = Command And &amp;B01111111       'maskowanie niepotrzebnego bitu<br />      Odebrano = 1       'flaga informująca o odebraniu danych<br />   End If<br />Return[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2740">piotr_1547</a> — 25 maja 2015, o 05:09</p><hr />
]]></content>
</entry>
</feed>