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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-07-13T20:20:17+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7757&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-07-13T20:20:17+01:00</updated>
<published>2014-07-13T20:20:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7757&amp;p=87499#p87499</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7757&amp;p=87499#p87499"/>
<title type="html"><![CDATA[Re: Problem z RC5]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7757&amp;p=87499#p87499"><![CDATA[
Schemat jest dobry i zakładam, że pracujesz na wewnętrznym taktowaniu 8MHz. Kod jest błędny w wielu miejscach i w zasadzie to nawet nie powinien dać się skompilować po w ATMEGA32A nie ma bitu OCIE2A ani wektora przerwań TIMER2_COMPA_vect.<br />1. Patrząc na schemat powinieneś użyć timera 1, który będzie generował nośną na pinie z funkcją alternatywną OC1B.<br />2. Dodatkowa konfiguracja wyjścia PD4 jest błędem, bo to timer 1 przejmuje kontrolę nad tym wyprowadzeniem.<br />3. Włącznie przerwań jest tutaj niepotrzebne (usuń z kodu sei() i ISR)<br />4. Funkcja wysyłająca ramkę RC5 powinna być napisana w sposób, że jeśli bit w ramce to 1 to kolejene kroki są nastęujące: _delay_us(889) potem włączenie RC5_TRANSMITTER_PORT_ON znowu czekanie i wyłączenie i tak dla wszystkich bitów z tym, że dla 0 najpierw włącza się nośną, a potem czeka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 13 lip 2014, o 20:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Thaid]]></name></author>
<updated>2014-07-13T19:24:08+01:00</updated>
<published>2014-07-13T19:24:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7757&amp;p=87486#p87486</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7757&amp;p=87486#p87486"/>
<title type="html"><![CDATA[Problem z RC5]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7757&amp;p=87486#p87486"><![CDATA[
Cześć,<br />znów się zwracam do Was o pomoc, także pewnie dla Was błahym problemem. Otóż męczę się z nadawaniem sygnałów w standardzie RC5.<br /><br />Pierwszym problemem jest wysyłanie. Zrobiłem z innego uC przyrząd do debugowania i okazało się, że jakaś fale nośną generuje, ale nic nie przesyła.<br />Drugą kwestią jest bardzo krótki zasięg. Dioda IR z nadajnikiem muszą być do siebie przystawione.<br /><br />Pracuję na ATmega32A.<br /><br />Schemat:<br /><a href="http://forum.atnel.pl/_obrazki/o/4591/a4f7567cea4e401b748bad821505807d.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/4591/a4f7567cea4e401b748bad821505807d.png" alt="Obrazek" /></a><br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br /><br />#include &quot;RC5_transmitter.h&quot;<br /><br />uint8_t key_lock;<br /><br />struct RC5_packet pakiet;<br /><br />int main(void) {<br />RC5_transmitter_init();<br /><br />DDRD &amp;= ~(1&lt;&lt;PD0);<br />PORTD |= (1&lt;&lt;PD0);<br /><br />pakiet.startBit = 1;<br />pakiet.fieldBit = 1;<br />pakiet.toggleBit = 1;<br />pakiet.address = 0;//TV<br />pakiet.command = 0x10;//Podglosnienie (Volume Up)<br /><br /><br />while(1){<br />if( !key_lock &amp;&amp; !(PIND &amp; (1&lt;&lt;PD0))) {<br />   key_lock=1;<br /><br />   RC5_transmitter_send(&amp;pakiet);<br /><br />  } else if( key_lock &amp;&amp; (PIND &amp; (1&lt;&lt;PD0))) key_lock++;<br />}<br />}[/syntax]<br /><br />RC5_transmitter.h<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;stdbool.h&gt;<br /><br />#ifndef RC5_TRANSMITTER_H_<br />#define RC5_TRANSMITTER_H_<br /><br />#define RC5_LED_DDR DDRD//Rejestr kierunki diody LED podczerwonej<br />#define RC5_LED_PORTPORTD//Port diody LED podczerwonej<br />#define RC5_LED (1&lt;&lt;PD4)//Pin diody LED podczerwonej<br /><br />#defineRC5_TRANSMITTER_START_TIMER TCCR2B |= (1&lt;&lt;CS20)//Preskaler 1<br />#defineRC5_TRANSMITTER_STOP_TIMER TCCR2B &amp;= ~(1&lt;&lt;CS20)//Preskaler 0 (wyłączenie timera)<br /><br />#defineRC5_TRANSMITTER_PORT_ON TCCR2A |= (1&lt;&lt;COM2B0)//Toggle OC2B on Compare Match<br />#defineRC5_TRANSMITTER_PORT_OFF TCCR2A  &amp;= ~(1&lt;&lt;COM2B0)//Normal port operation, OC2B disconnected<br />#defineRC5_TRANSMITTER_PORT_TOGGLE TCCR2A ^= (1&lt;&lt;COM2B0)//Toggle OC2B on Compare Match albo Normal port operation, OC2B disconnected<br /><br /><br />struct RC5_packet {<br />bool startBit;<br />bool fieldBit;<br />bool toggleBit;<br />uint8_t address;<br />uint8_t command;<br />};<br /><br />void RC5_transmitter_init(void);//Inicjalizacja nadajnika RC5<br /><br />void RC5_transmitter_send(struct RC5_packet* packet);//Wysłanie<br />#endif[/syntax]<br /><br />[syntax=c]#include &quot;RC5_transmitter.h&quot;<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br /><br /><br />unsigned int data;<br /><br />void RC5_transmitter_init() {<br />RC5_LED_DDR |= RC5_LED;//Ustawianie OC2 na wyjście<br /><br />//Ustawienie Timera<br />TCCR2A |= (1&lt;&lt;WGM21); //Tryb CTC<br />TIMSK2 |= (1&lt;&lt;OCIE2A);//Włączenie przerywań<br />OCR2A = 111;//36 kHz * 2<br /><br />sei();//Zezwolenie na przerywania<br />}<br /><br /><br />void RC5_transmitter_send(struct RC5_packet* packet) {<br />data |= packet-&gt;startBit<br />| (packet-&gt;fieldBit&lt;&lt;1)<br />| (packet-&gt;toggleBit&lt;&lt;2)<br />| (packet-&gt;address&lt;&lt;3)<br />| (((unsigned int)packet-&gt;command)&lt;&lt;8);<br /><br /><br />RC5_TRANSMITTER_START_TIMER;<br /><br />//Jeśli pierwszy bit jest 1 nic nie rob<br />if(data &amp; 1) {<br />RC5_TRANSMITTER_PORT_OFF;<br />}else {<br />RC5_TRANSMITTER_PORT_ON;<br />}<br />}<br /><br /><br /><br />//Przerwanie wywoływane z częstotliwością 76 kHz;<br />ISR(TIMER2_COMPA_vect) {<br />static uint8_t period;<br />static uint8_t counter;<br />period++;<br /><br />//Jeśli jest połowa bitu, zmień stan wysyłania<br />if(period == 32) {<br />RC5_TRANSMITTER_PORT_TOGGLE;<br /><br />//Jeśli koniec bitu, przesuń wskaźnik<br />}else if(period == 64) {<br />counter++;<br /><br />//Jeśli ostatni to był bit, kończ nadawanie<br />if(counter == 15) {<br />RC5_TRANSMITTER_STOP_TIMER;<br />RC5_TRANSMITTER_PORT_OFF;<br />RC5_LED_PORT &amp;= ~RC5_LED;<br />counter = 0;<br />}else {<br />if(data &amp; 1&lt;&lt;counter) {<br />RC5_TRANSMITTER_PORT_OFF;<br />}else {<br />RC5_TRANSMITTER_PORT_ON;<br />}<br />}<br />period = 0;<br />}<br />}[/syntax]<br /><br />Proszę &quot;nie bić&quot; za popełnione przeze mnie błędy, gdyż jestem początkujący.<br /><br />Dzięki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4591">Thaid</a> — 13 lip 2014, o 19:24</p><hr />
]]></content>
</entry>
</feed>