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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-03-22T22:26:09+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2623&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-03-22T22:26:09+01:00</updated>
<published>2013-03-22T22:26:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31437#p31437</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31437#p31437"/>
<title type="html"><![CDATA[Re: RC5 - przerwania zewnętrzne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31437#p31437"><![CDATA[
<div class="quotetitle">ps19 napisał(a):</div><div class="quotecontent"><br />Co masz na myśli z innym timerem ?<br /></div><br /><br />Tak jak napisałem w książce i tak jak tłumaczy wyżej kolega Krauser - musisz spróbować najpierw dobrze zrozumieć zasadę działania tego co w książce - bo tak troszkę na razie po omacku dokonujesz zmian licząc że coś wyjdzie lub nie wyjdzie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />To przerwanie akurat od ICP jest tutaj połączone że tak powiem zsynchronizowane z odczytami Timera1, dzięki czemu bardzo precyzyjnie po każdym zboczu otrzymujemy czas w us - każdego impulsu.<br /><br />Owszem można to zrobić na innym przerwaniu i nawet na Timerze 8-bitowym, ale jednak trzeba wprowadzić wtedy dosyć drastyczne zmiany w kodzie. <br /><br />Pomyśl sobie jeśli nie doprowadziłeś sygnału z pilota do wejścia ICP jak to jest oryginalnie w książce to w tym co zrobiłeś to przerwanie od ICP w ogóle ci się nie odpali nigdy .... sprawdzasz sobie chociaż diodą LED czy program wchodzi w przerwanie ? żeby to przeanalizować we własnym zakresie ? jak podpowiadam w książce ? - chyba nie <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... a to podstawa - bo od razu byś widział że przerwanie nie działa bo jak ? co ma je wyzwalać ? <br /><br />A skoro chcesz to przenieść na przerwania od PCINT to wszystko musiałoby się zaczynać właśnie w takim przerwaniu i tam odpalaniu jakiegoś timera, który będzie startował dopiero i odliczał czas do kolejnego przerwania PCINT na kolejnym zboczu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 mar 2013, o 22:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2013-03-22T21:56:19+01:00</updated>
<published>2013-03-22T21:56:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31433#p31433</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31433#p31433"/>
<title type="html"><![CDATA[Re: RC5 - przerwania zewnętrzne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31433#p31433"><![CDATA[
Co masz na myśli z innym timerem ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 22 mar 2013, o 21:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-03-22T20:11:37+01:00</updated>
<published>2013-03-22T20:11:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31421#p31421</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31421#p31421"/>
<title type="html"><![CDATA[Re: RC5 - przerwania zewnętrzne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31421#p31421"><![CDATA[
Skoro chcesz użyć PCINT28 to używaj tylko przerwania od zmiany stanu na tym wejściu PCINT3_vect. Przepełnienie timera jest nieistotne. W obsłudze tego przerwania należy odczytać zawartość rejestrów timera 1 - TCNT1. Oczywiście taka metoda jest dużo mniej dokładna niż korzystanie z pinu ICP, bo tam zmiana powoduje automatyczne przepisanie wartości timera do rejestrów ICR1. Skoro nie używasz wejścia ICP możesz skorzystać z innego timera.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 14 minutach ]</span></strong><br /><br />INT2 i zmiany w rejestrze EICRA też nie są potrzebne, bo nic nie masz podpięte pod to wejście.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 22 mar 2013, o 20:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2013-03-22T20:10:04+01:00</updated>
<published>2013-03-22T20:10:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31420#p31420</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31420#p31420"/>
<title type="html"><![CDATA[Re: RC5 - przerwania zewnętrzne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31420#p31420"><![CDATA[
Uaktualniłem post<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 22 mar 2013, o 20:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-03-22T19:48:38+01:00</updated>
<published>2013-03-22T19:48:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31417#p31417</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31417#p31417"/>
<title type="html"><![CDATA[Re: RC5 - przerwania zewnętrzne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31417#p31417"><![CDATA[
TIMER1_OVF_vect ??? i co to przerwanie wg ciebie ma robić ? <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br /><br />do tego odpalone INT2<br /><br />EIMSK |= _BV(INT2);<br /><br />po co ?<br /><br />a jeszcze trzeci grzyb w barszcz PCINT ???? o co tu chodzi ? - sorki ale ja totalnie odjechałem próbując to przeanalizować .... a ty nie raczyłeś ANI jednego zdania napisać coś ty tu próbował wymodzić <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> .... Myślę, że jak krok po kroku byś opisał co chciałeś uzyskać to sam zobaczyłbyś jaki tu panuje zamęt <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> ....<br /><br />na prawdę - napisz coś przy wrzucaniu takiego kodu - bo nawet pytania nie ma tu zadanego <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> wiemy tylko że nie możesz sobie poradzić i co ? z czym ? jak ???? .... na tak zadane pytanie to trzeba byłoby zasiąść na parę godzin i próbować główkować jakie ty w ogóle miałeś zamiary a i tak podejrzewam że ciężko byłoby odgadnąć co tobą kierowało.<br /><br />Dlatego opisz dokładnie jakie zmiany wprowadzałeś , co miały na celu wg ciebie? jakie efekty / funkcjonalność w stosunku do oryginalnej chciałeś osiągnąć ? no i wreszcie precyzyjnie opisz co ci nie działa i w jakich miejscach ...... ??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 22 mar 2013, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ps19]]></name></author>
<updated>2013-03-22T20:13:53+01:00</updated>
<published>2013-03-22T19:38:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31416#p31416</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31416#p31416"/>
<title type="html"><![CDATA[RC5 - przerwania zewnętrzne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2623&amp;p=31416#p31416"><![CDATA[
Nie mogę poradzić sobie z RC5 - algorytm rozkodowania działa (Z niebieskiej książki).<br /><br />Teraz podłączone jest pod PD4 (PCINT28/OC1B/Timer 1) (Atmega644PA - kwarc 20Mhz)<br /><br />Więc tak, próbuję rozkodować sygnał RC5 bez użycia ICP tak jak opisywał to Pan w pierwszej książce.<br />Jako, że na pinie PD4 dostępne jest przerwanie zewnętrzne chciałem je wykorzystać w celu sprawdzenia rodzaju zbocza (Nie mam pomysłu na inny sposób  <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" />  )<br /><br />Po wciśnięciu num1 nic się nie dzieje  <img src="https://forum.atnel.pl/images/smilies/icon_neutral.gif" alt=":|" title="Średnio zadowolony" /> <br /><br />ir.h<br />[syntax=c]<br />//ir.h<br />#ifndef IR_H_<br />#define IR_H_<br /><br />#define IR_PORT D<br />#define IR_PIN 4<br />#define IR_IN (1&lt;&lt;IR_PIN)<br /><br />// stałe i zmienne potrzebne na wewnętrzne cele procedury obsługi RC5<br /><br />#define TIMER1_PRESCALER 8<br /><br />// przeliczanie tyknięć Timera1 przy danym preskalerze na mikrosekundy<br />#define ir_micro_s(num) ((num)*(F_CPU/1000000)/TIMER1_PRESCALER)<br /><br />// stałe czasowa i tolerancja wyrażone w us<br />#define TOLERANCE 200<br />#define MIN_HALF_BIT ir_micro_s(889- TOLERANCE)<br />#define MAX_HALF_BIT ir_micro_s(889 + TOLERANCE)<br />#define MAX_BIT ir_micro_s((889+889) + TOLERANCE)<br /><br />// Makra upraszczające dostęp do portów<br />// *** PORT<br />#define PORT(x) XPORT(x)<br />#define XPORT(x) (PORT##x)<br />// *** PIN<br />#define PIN(x) XPIN(x)<br />#define XPIN(x) (PIN##x)<br />// *** DDR<br />#define DDR(x) XDDR(x)<br />#define XDDR(x) (DDR##x)<br /><br />// ------------------------------------------- definicje klawiszy PILOTA IR<br /><br />#define num1 1<br />#define num2 2<br />#define num3 3<br />#define num4 4<br />#define num5 5<br />#define num6 6<br />#define num7 7<br />#define num8 8<br />#define num9 9<br />#define on_off 10<br />#define mute 13<br />#define presets 14<br />#define prawo 16<br />#define lewo 17<br />#define przod 32<br />#define tyl 33<br />#define ok 59<br /><br />// ------------------------------------------- definicje klawiszy KONIEC<br /><br />// zmienne charakterystyczne tylko dla obsługi RC5<br />extern volatile uint8_t toggle_bit;// bit TOGGLE<br />extern volatile uint8_t address;// adres<br />extern volatile uint8_t command;// komenda<br /><br />// flaga = 1 - informuje, że odebrany został nowy kod z pilota<br />extern volatile uint8_t Ir_key_press_flag;<br />extern void ir_init(void);<br />// deklaracje funkcji dla użytkownika<br /><br />#endif /* IR_DECODE_H_ */[/syntax]<br />ir.c<br />[syntax=c]//ir.c<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;ir.h&quot;<br /><br />volatile uint8_t address;      // adres RC5<br />volatile uint8_t command;      // komenda RC5<br />volatile uint8_t toggle_bit;      // bit TOGGLE<br /><br />// flaga = 1 - informuje, że odebrany został nowy kod z pilota<br />// po odczytaniu danych ze zmiennych należy wyzerować flagę aby<br />// zostały przyjęte kolejne kody z pilota<br />volatile uint8_t Ir_key_press_flag;<br /><br />volatile uint8_t rc5cnt;<br /><br />void ir_init() {<br />DDR(IR_PORT) &amp;= ~IR_IN;      // pin jako wejście<br />PORT(IR_PORT) |= IR_IN;      // podciągnięcie pinu do VCC<br />#if TIMER1_PRESCALER == 1<br />TCCR1B |= (1&lt;&lt;CS10);            // Timer1 / 1<br />#endif<br />#if TIMER1_PRESCALER == 8<br />TCCR1B |= (1&lt;&lt;CS11);            // Timer1 / 8<br />#endif<br />#if TIMER1_PRESCALER == 64<br />TCCR1B |= (1&lt;&lt;CS11) | (1&lt;&lt;CS10);            // Timer1 / 64<br />#endif<br />#if TIMER1_PRESCALER == 256<br />TCCR1B |= (1&lt;&lt;CS12);            // Timer1 / 256<br />#endif<br />#if TIMER1_PRESCALER == 1024<br />TCCR1B |= (1&lt;&lt;CS12) | (1&lt;&lt;CS10);            // Timer1 / 1024<br />#endif<br /><br />EICRA |= _BV(ISC21);         // Zbocze opadające na OC1B<br />rc5cnt = 0;                  // zerowanie licznika występująych zboczy<br /><br />PCICR |= _BV(PCIE3); //Kontrola na PCINT 24...31 włączona<br />PCMSK3 |= _BV(PCINT28); //Przerwanie na PD4 (PCINT28) Włączone<br />TIMSK1 |= _BV(TOIE1); //włączenie przerwania<br /><br />Ir_key_press_flag = 0;         // zerowanie flagi otrzymania kodu z pilota<br />}<br />sei();<br />// procedura obsługi przerwania ICP1<br />ISR(TIMER1_CAPT_vect) {<br /><br />#define FRAME_RESTART 0<br />#define FRAME_OK 1<br />#define FRAME_END 2<br />#define FRAME_ERROR 3<br /><br />static uint16_t LastCapture;<br />uint16_t PulseWidth;<br />static uint8_t IrPulseCount;<br />static uint16_t IrData;<br />static uint8_t frame_status;<br /><br />PulseWidth = TCNT1H - LastCapture;<br />LastCapture = TCNT1L;<br /><br />if(EICRA &amp; _BV(ISC21) &amp;&amp; !(EICRA &amp; _BV(ISC20))) //zmiana zbocza na przeciwne<br />{<br />EICRA |= _BV(ISC21) | _BV(ISC20);<br />}<br />if(EICRA &amp; _BV(ISC21) &amp;&amp; EICRA &amp; _BV(ISC20)) //zmiana zbocza na przeciwne<br />{<br />EICRA |= _BV(ISC21);<br />EICRA &amp;= ~_BV(ISC20);<br />}<br /><br />if (PulseWidth &gt; MAX_BIT) rc5cnt = 0;<br /><br />if (rc5cnt &gt; 0) frame_status = FRAME_OK;<br /><br />if (rc5cnt == 0) {<br />IrData = 0;<br />IrPulseCount = 0;<br /><br />if(EICRA &amp; _BV(ISC21) &amp;&amp; !(EICRA &amp; _BV(ISC20)))<br />{<br />EICRA |= _BV(ISC21) | _BV(ISC20);<br />}<br />if(EICRA &amp; _BV(ISC21) &amp;&amp; EICRA &amp; _BV(ISC20))<br />{<br />EICRA |= _BV(ISC21);<br />EICRA &amp;= ~_BV(ISC20);<br />}<br />rc5cnt++;<br />frame_status = FRAME_END;<br />}<br /><br />if (frame_status == FRAME_OK) {<br /><br />// gdy zakłócenia (szpilki) - RESTART<br />if(PulseWidth&lt;MIN_HALF_BIT) frame_status = FRAME_RESTART;<br /><br />// gdy błąd ramki danych (może inny standard niż RC5) RESTART<br />if( PulseWidth &gt; MAX_BIT ) frame_status = FRAME_RESTART;<br /><br />if (frame_status == FRAME_OK)    {<br />if (PulseWidth &gt; MAX_HALF_BIT) rc5cnt++;<br />if (rc5cnt &gt; 1)<br />if ( (rc5cnt % 2) == 0 ) {<br />IrData = IrData &lt;&lt; 1;<br />if(EICRA &amp; _BV(ISC21)) IrData |= 0x0001; //Jeżeli zbocze jest opadające<br />IrPulseCount++;<br />if (IrPulseCount &gt; 12)    {<br />if (Ir_key_press_flag == 0) {<br />command = IrData &amp; 0b0000000000111111;<br />address = (IrData &amp; 0b0000011111000000) &gt;&gt; 6;<br />toggle_bit = (IrData &amp; 0b0000100000000000) &gt;&gt; 11;<br />}<br />frame_status = FRAME_RESTART;<br />Ir_key_press_flag = 1;<br />}<br />}<br />rc5cnt++;<br />}<br />}<br />if (frame_status == FRAME_RESTART)   {<br />rc5cnt = 0;<br />EICRA &amp;= ~(_BV(ISC20) | _BV(ISC21));<br />}<br />}[/syntax]<br />main.c<br />[syntax=c]int main(void) {<br />//port_init();<br />//PWM_init();<br />//interrupt_init();<br />ir_init();<br />sei();<br />while(1)<br />{<br />if(Ir_key_press_flag)<br />{<br />if(!address &amp;&amp; num1==command)<br />{<br />LED2_ON;<br />_delay_ms(1000);<br />}<br />else<br />{<br />LED2_OFF;<br />}<br />}<br />Ir_key_press_flag = 0;<br />command = 0xff;<br />address = 0xff;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=230">ps19</a> — 22 mar 2013, o 19:38</p><hr />
]]></content>
</entry>
</feed>