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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-12-30T17:39:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=9937&amp;mode</id>
<entry>
<author><name><![CDATA[icer_cmg]]></name></author>
<updated>2014-12-30T17:39:37+01:00</updated>
<published>2014-12-30T17:39:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9937&amp;p=111313#p111313</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9937&amp;p=111313#p111313"/>
<title type="html"><![CDATA[Re: Transmisja 433MHz - kodowanie typu PULSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9937&amp;p=111313#p111313"><![CDATA[
Podpowiem, że jeśli chcesz zastosować zwykły moduł 433 to długość impulsów w nadajniku i odbiorniku będzie różna. Nie chcę podawać czasów, bo nie pamiętam, ale mam zanotowane, że podając sygnał 30% &quot;1&quot; 70% &quot;0&quot; w pętli, na odbiorniku miałem 22% &quot;1&quot; i 78% &quot;0&quot;. Tak więc należy to wziąć pod uwagę. Pamiętam, że podobna sprawa była przy MagicLed, gdzie ramy czasowe &quot;0&quot; i &quot;1&quot; były luźne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1636">icer_cmg</a> — 30 gru 2014, o 17:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[piotrek_194]]></name></author>
<updated>2014-12-30T15:39:47+01:00</updated>
<published>2014-12-30T15:39:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=9937&amp;p=111292#p111292</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=9937&amp;p=111292#p111292"/>
<title type="html"><![CDATA[Transmisja 433MHz - kodowanie typu PULSE]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=9937&amp;p=111292#p111292"><![CDATA[
Witam! Po przerobieniu lekcji z Greenbook`a dotyczącej transmisji 433MHz postanowiłem na jej podstawie napisać kod do transmisji danych (na razie  tylko 1 bajtu danych bez żadnych zabezpieczeń) z wykorzystaniem kodowania PULSE, a nie bifazowego jak to było w GB. Kod nadajnika wgrany jest na ATmega8, odbiornika na ATmega328P. Póki co testuję go bez modułów radiowych przy połączonym pinie wyjściowym nadajnika z pinem wejściowym odbiornika. Błąd leży gdzieś najprawdopodobniej w procedurze obsługi przerwania ICP w pliku receiver.c . Nie posiadam w domu oscyloskopu, stąd próbuję znaleźć przyczynę błędu poprzez pułapki programowe, ale męczę się z tym bezskutecznie, stąd proszę o pomoc bardziej zaawansowanych użytkowników <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Nadajnik:<br />[syntax=c]#ifndef TRANSMITTER_H_<br />#define TRANSMITTER_H_<br /><br />//*** Konfiguracja pinów<br /><br />#define LED_PIN (1&lt;&lt;PC2)<br /><br />// Pin sterujący włączaniem/wyłączaniem zasilania nadajnika<br /><br />#define TRANSMITTER_PWR_PIN (1&lt;&lt;PB0)<br />#define TRANSMITTER_PWR_PORT PORTB<br />#define TRANSMITTER_PWR_DDR DDRB<br />#define TRANSMITTER_ON TRANSMITTER_PWR_PORT |= TRANSMITTER_PWR_PIN;_delay_ms(5);<br />#define TRANSMITTER_OFF TRANSMITTER_PWR_PORT &amp;= ~TRANSMITTER_PWR_PIN;<br /><br /><br />// Pin podający sygnał na wejście nadajnika<br />#define TRANSMITTER_IN_PIN (1&lt;&lt;PD7)<br />#define TRANSMITTER_IN_PORT PORTD<br />#define TRANSMITTER_IN_DDR DDRD<br /><br />#define TRANSMITTER_IN_HIGH TRANSMITTER_IN_PORT |= TRANSMITTER_IN_PIN<br />#define TRANSMITTER_IN_LOW TRANSMITTER_IN_PORT &amp;= ~TRANSMITTER_IN_PIN<br /><br />//*** Ustawienia parametrów transmisji<br /><br />// Ilość bitów ramki synchronizacyjnej<br />#define SYNC_COUNT 20<br /><br />// Czas trwania stanu wysokiego (impulsu) w bicie &#91;us&#93;<br />#define PULSE_HIGH_BIT 200<br /><br />// Tolerancja dla czasów trwania stanu niskiego i wysokiego w biice &#91;us&#93;<br />#define TOLERANCE 50<br /><br />// Czasy trwania poszczególnych stanów w bicie 0 oraz 1<br />#define MAX_PULSE_HIGH (PULSE_HIGH_BIT + TOLERANCE)<br />#define MIN_PULSE_HIGH (PULSE_HIGH_BIT - TOLERANCE)<br />#define MAX_PULSE_LOW (2*PULSE_HIGH_BIT + TOLERANCE)<br />#define MIN_PULSE_LOW (2*PULSE_HIGH_BIT - TOLERANCE)<br /><br />// Deklaracje funkcji globalnych<br />void transmitter_init(void);<br />void send_start_bit(void);<br />void send_one(void);<br />void send_zero(void);<br />void send_sync_pack(void);<br />void wyslij_bajt(uint8_t data);<br /><br /><br />#endif /* TRANSMITTER_H_ */[/syntax]<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;transmitter.h&quot;<br /><br /><br />// pomocnicze definicje pinów klawiszy<br />#define KL1 (1&lt;&lt;PC3)<br />#define KL2 (1&lt;&lt;PC4)<br />#define KL3 (1&lt;&lt;PC5)<br /><br /><br /><br />int main(void)<br />{<br />DDRC |= KL1|KL2|KL3;// klawisze - wyjścia<br />PORTC |= KL1|KL2|KL3; // klawisze - podciąganie<br />DDRC |= LED_PIN;<br />PORTC |= LED_PIN;<br />uint8_t i;<br /><br />transmitter_init();<br /><br />_delay_ms(1000);<br /><br /><br />sei();// odblokowanie przerwań globalnych<br /><br />while(1)<br />{<br /><br />if( !(PINC &amp; KL2) ) {<br />_delay_ms(30);<br />if( !(PINC &amp; KL2) ) {<br />send_sync_pack();<br />wyslij_bajt(170);<br />TRANSMITTER_OFF;<br />_delay_ms(500);<br /><br />}<br />}<br /><br />}<br /><br /><br />}[/syntax]<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;transmitter.h&quot;<br /><br />// Funkcja inicjalizująca piny wychodzące z uC na NADAJNIK - pin IN i PWR<br />void transmitter_init(void)<br />{<br />TRANSMITTER_IN_DDR |= TRANSMITTER_IN_PIN;<br />TRANSMITTER_IN_HIGH;<br /><br /><br />TRANSMITTER_PWR_DDR |= TRANSMITTER_PWR_PIN;<br />TRANSMITTER_OFF;<br /><br />}<br /><br />//*** Kodowanie syganłu typu PULSE (stały czas trwania stanu wysokiego) - funkcje nadawcze<br /><br />void send_one(void)<br />{<br />TRANSMITTER_IN_LOW;<br />_delay_us(2*PULSE_HIGH_BIT);<br />TRANSMITTER_IN_HIGH;<br />_delay_us(PULSE_HIGH_BIT);<br /><br />}<br />void send_zero(void)<br />{<br />TRANSMITTER_IN_LOW;<br />_delay_us(PULSE_HIGH_BIT);<br />TRANSMITTER_IN_HIGH;<br />_delay_us(PULSE_HIGH_BIT);<br />}<br /><br />void send_sync_pack(void)<br />{<br />uint8_t num, i;<br />num = SYNC_COUNT;<br /><br />TRANSMITTER_ON; // włączenie nadajnika (po samej inicjalizacji domyślnie wyłączony)<br /><br />TRANSMITTER_IN_LOW;<br />_delay_us(4*PULSE_HIGH_BIT);<br />// Nadawanie określonej liczby bitów synchronizacyjnych<br />for(i=0; i&lt;num; i++)<br />{<br />send_zero();<br />}<br /><br />TRANSMITTER_IN_HIGH;<br />_delay_us(3*PULSE_HIGH_BIT); // czas na odbiór dla odbiornika<br /><br />}<br /><br />// Funkcja testowa<br />void wyslij_bajt(uint8_t data)<br />{<br />uint8_t i;<br /><br />uint8_t sreg;<br />// blokujemy przerwania na czas emisji danych<br />// aby zachować odpowiednie czasy trwania impulsów<br />sreg = SREG;<br />cli();<br /><br />TRANSMITTER_IN_HIGH;<br />_delay_us(3*PULSE_HIGH_BIT);<br />// właściwy bajt danych<br />for( i=0; i&lt;8; i++ ) {<br />if ( !(data &amp; 0x80) ) send_zero();<br />else send_one();<br />data&lt;&lt;=1;<br />}<br /><br /><br />// zablokowanie nadajnika aby nie generował szumu<br />TRANSMITTER_IN_HIGH;<br /><br /><br />// odblokowujemy przerwania, jeśli były uprzednio włączone<br />SREG = sreg;<br /><br />_delay_us(PULSE_HIGH_BIT*3);<br />}[/syntax]<br /><br />Odbiornik:<br />[syntax=c]#ifndef RECEIVER_H_<br />#define RECEIVER_H_<br /><br />//*** Konfiguracja pinów<br /><br />#define LED_PIN (1&lt;&lt;PC5)<br />#define LED_PIN2 (1&lt;&lt;PC4)<br /><br />#define RECEIVER_OUT_PIN (1&lt;&lt;PB0)<br />#define RECEIVER_OUT_DDR DDRB<br />#define RECEIVER_OUT_PORT PORTB<br /><br />//*** Ustawienia parametrów transmisji<br /><br />// Ilość bitów ramki synchronizacyjnej<br />#define SYNC_COUNT 16<br /><br />// Czas trwania stanu wysokiego (impulsu) w bicie &#91;us&#93;<br />#define PULSE_HIGH_BIT 200<br /><br />// Tolerancja dla czasów trwania stanu niskiego i wysokiego w biice &#91;us&#93;<br />#define TOLERANCE 50<br /><br />// Czasy trwania poszczególnych stanów w bicie 0 oraz 1<br />#define MAX_PULSE_HIGH (PULSE_HIGH_BIT + TOLERANCE)<br />#define MIN_PULSE_HIGH (PULSE_HIGH_BIT - TOLERANCE)<br />#define MAX_PULSE_LOW (2*PULSE_HIGH_BIT + TOLERANCE)<br />#define MIN_PULSE_LOW (2*PULSE_HIGH_BIT - TOLERANCE)<br />#define MAX_PULSE_LOW_ZERO (PULSE_HIGH_BIT + TOLERANCE)<br />#define MIN_PULSE_LOW_ZERO (PULSE_HIGH_BIT - TOLERANCE)<br /><br />// Deklaracje funkcji globalnych<br />void receiver_init(void);<br />void receive_event(void);<br />void register_binary_callback(void (*callback)(uint8_t received_byte, uint8_t repeat));<br /><br /><br />#endif /* RECEIVER_H_ */[/syntax]<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;receiver.h&quot;<br /><br />volatile uint8_t received_flag; // Flaga zakończenia odbioru - ustawiana pod koniec przerwania<br />volatile uint8_t received_byte; // 1 bajt danych z odebranej 24-biotwej ramki<br />volatile uint8_t repeat; // krotność przesłania tej samej ramki danych (gdy przycisk jest trzymany po wciśnięciu)<br />volatile uint8_t toggle_bit; // pozostaje niezmienny przy emisji tych samych ramek<br /><br /><br />// Funkcja inicjalizująca pin uC (ICP) oodbierający sygnał z odbiornika<br />void receiver_init(void)<br />{<br />RECEIVER_OUT_DDR &amp;= ~RECEIVER_OUT_PIN; // pin odbierający sygnał jako wejście<br />// Konfiguracja i odblokowanie przerwania ICP<br />TCCR1B = (1&lt;&lt;CS11);// ustawienie preskalera dla Timer1 = 8<br />TCCR1B &amp;= ~(1&lt;&lt;ICES1);// reakcja na zbocze opadające<br />TIMSK1 |= (1&lt;&lt;ICIE1);// odblokowanie przerwania ICP<br /><br />}<br /><br />// wskaźnik do funkcji callback<br />static void (*received_byte_callback)(uint8_t received_byte, uint8_t repeat);<br /><br />// funkcja do rejestracji funkcji zwrotnej<br />void register_received_byte_callback(void (*callback)(uint8_t received_byte, uint8_t repeat)) {<br />received_byte_callback = callback;<br />}<br /><br />// Zdarzenie odbioru danych<br />void receive_event(void)<br />{<br /><br />if(received_flag)<br />{<br />received_flag = 0; // można odebrać kolejną ramkę danych<br />if(received_byte_callback) (*received_byte_callback)(received_byte, repeat);<br />}<br />//PORTC &amp;= ~LED_PIN;<br /><br />}<br /><br />// Możliwe statusy odbieranej ramki<br />enum status { FRAME_START, FRAME_RESTART, FRAME_OK, FRAME_END};<br /><br />// Procedura testowa przerwania<br />ISR(TIMER1_CAPT_vect)<br />{<br /><br />static enum status frame_status;<br />static uint16_t ICP_last; // czas uchwycenie ostatniego zbocza<br />uint16_t Pulse_width, PulseLow_width, PulseHigh_width;<br />static uint8_t SlopeCount; // licznik zboczy<br />static uint8_t BitCount; // licznik bitów<br />static uint8_t FrameContent; // zawartość 16-bitowej ramki danych<br />static uint8_t StartSlope ;<br />static uint8_t zero_wait;<br />static uint8_t one_wait;<br />//uint8_t start_byte = 0;<br />//static uint8_t ktory;<br /><br />Pulse_width = ICR1 - ICP_last;<br />ICP_last = ICR1;<br />PORTC ^= LED_PIN;<br /><br />TCCR1B ^= (1&lt;&lt;ICES1); // zmiana sposobu wyzwolenia przerwania ICP<br /><br />if(frame_status == FRAME_START)<br />{<br />frame_status = FRAME_OK;<br />SlopeCount = 1;<br /><br />}<br /><br />// gdy czas dłuższy niż 2T + tolerancja i StartSlope równe 0 - początek ramki danych<br />if((Pulse_width &gt; MAX_PULSE_LOW) &amp;&amp; (StartSlope != 1))<br />{<br /><br />{<br />StartSlope = 1;<br />BitCount = 0;<br />SlopeCount = 0;<br />}<br /><br />if(SlopeCount == 0 &amp;&amp; StartSlope == 1)<br />{<br />FrameContent = 0;<br />TCCR1B |= (1&lt;&lt;ICES1);<br />frame_status = FRAME_START;<br />}<br /><br />}<br /><br />else<br />{<br /><br />// jeśli zbocze parzyste, sprawdzamy PulseHigh_width, w przeciwnym razie PulseLow_width<br />if((SlopeCount &gt; 0) &amp;&amp; ((SlopeCount % 2) == 0))<br />{<br />PulseHigh_width = Pulse_width;<br />}<br />else if((SlopeCount &gt; 0) &amp;&amp; ((SlopeCount % 2) != 0))<br />{<br />PulseLow_width = Pulse_width;<br />}<br /><br />}<br /><br />// sprawdzamy, czy szerokość impulsu mieści się w granicznym przedziale<br />if((frame_status == FRAME_OK) &amp;&amp; (SlopeCount &gt; 0))<br />{<br />if(PulseHigh_width == Pulse_width &amp;&amp; ((SlopeCount % 2) == 0))<br />{<br /><br />if(PulseHigh_width &gt; MAX_PULSE_HIGH)<br />{<br />frame_status = FRAME_RESTART;<br />}<br /><br />if(PulseHigh_width &lt; MIN_PULSE_HIGH)<br />{<br />frame_status = FRAME_RESTART;<br /><br />}<br />}<br /><br />else<br />{<br />if(PulseLow_width == Pulse_width &amp;&amp; ((SlopeCount % 2) != 0))<br />{<br />if(PulseLow_width &gt; MAX_PULSE_LOW)<br />{<br />frame_status = FRAME_RESTART;<br />}<br /><br />if(PulseLow_width &lt; MIN_PULSE_LOW)<br />{<br />frame_status = FRAME_RESTART;<br />}<br />}<br />}<br /><br /><br />}<br />// jeśli impulsy mieszczą się w przyjętych granicach, możemy je zdekodować<br />if(frame_status == FRAME_OK)<br />{<br />if(SlopeCount != 1) SlopeCount++;<br />// Określenie wartości bitu<br />if((SlopeCount &gt; 0) &amp;&amp; (SlopeCount % 2 == 0))<br />{<br />// sprawdzenie czy stan niski wynosi T - wtedy bit o wartości 0, gdy 2T - bit o wartości 1<br />if((PulseLow_width &gt; MIN_PULSE_LOW) &amp;&amp; (PulseLow_width &lt; MAX_PULSE_LOW_ZERO))<br />{<br />zero_wait = 1; // czekamy na impuls wysoki kończący bit<br />}<br />if((PulseLow_width &gt; MIN_PULSE_LOW) &amp;&amp; (PulseLow_width &lt; MAX_PULSE_LOW))<br />{<br />one_wait = 1; // czekamy na impuls wysoki kończący bit<br />}<br />}<br />else if((SlopeCount &gt; 0) &amp;&amp; (SlopeCount % 2 == 0))<br />{<br />if((PulseHigh_width &gt; MIN_PULSE_HIGH) &amp;&amp; (PulseHigh_width &lt; MAX_PULSE_HIGH))<br />{<br />FrameContent = FrameContent &lt;&lt; 1;<br />if(zero_wait)<br />{<br />FrameContent |= 0x00;<br />zero_wait = 0;<br />}<br />else<br />{<br />FrameContent |= 0x01;<br />one_wait = 0;<br />}<br /><br />BitCount++;<br /><br />if(BitCount == 8)<br />{<br />lcd_locate(1,0);<br />lcd_str(&quot;PELNA RAMKA&quot;);<br /><br />// gdy odebrano poprzednią ramkę danych<br />if(received_flag == 0)<br />{<br />received_byte = FrameContent;<br /> received_flag = 1;<br />}<br />frame_status = FRAME_RESTART;<br />}<br />}<br />}<br /><br />}<br /><br />if(frame_status == FRAME_RESTART)<br />{<br />TCCR1B &amp;= ~(1&lt;&lt;ICES1);<br />StartSlope = 0;<br />}<br /><br />}[/syntax]<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;receiver.h&quot;<br />#include &quot;lcd44780.h&quot;<br /><br />void moja_obsluga_binarna(uint8_t received_byte, uint8_t repeat);<br /><br />int main(void)<br />{<br />DDRC |= LED_PIN | LED_PIN2;<br />PORTC |= LED_PIN | LED_PIN2;<br />//PORTC &amp;= ~LED_PIN;<br />lcd_init();<br /><br /><br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;START &quot;);<br /><br />receiver_init();<br />register_received_byte_callback(moja_obsluga_binarna);<br /><br />_delay_ms(1000);<br /><br />sei();// odblokowanie przerwań globalnych<br /><br />while(1)<br />{<br />receive_event();<br />}<br />}<br /><br />void moja_obsluga_binarna(uint8_t received_byte, uint8_t repeat) {<br />lcd_locate(0,0);<br />lcd_str(&quot;odbior binarny  &quot;);<br />lcd_locate(1,0);<br />lcd_str(&quot;bajt:&quot;);<br />lcd_int(received_byte);<br />lcd_str(&quot;      &quot;);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3505">piotrek_194</a> — 30 gru 2014, o 15:39</p><hr />
]]></content>
</entry>
</feed>