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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2025-09-16T14:28:30+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=24845&amp;mode</id>
<entry>
<author><name><![CDATA[Aven154]]></name></author>
<updated>2025-09-16T14:28:30+01:00</updated>
<published>2025-09-16T14:28:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239258#p239258</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239258#p239258"/>
<title type="html"><![CDATA[Re: Komunikacja radiowa 433Mhz modułu FS1000A z ATMEGA32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239258#p239258"><![CDATA[
Narazie odkryłem ze nadajnik nie mający podłaczonego lcd nie nadaje to znaczy procesor nie wysyła sygnału do nadajnika. Mimo ze mam już dwa lcd do dalej z jakiegoś powodu nie ma poprawnej transmisji będę działał dalej i szukał problemu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=22247">Aven154</a> — 16 wrz 2025, o 14:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2025-09-15T20:56:25+01:00</updated>
<published>2025-09-15T20:56:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239254#p239254</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239254#p239254"/>
<title type="html"><![CDATA[Re: Komunikacja radiowa 433Mhz modułu FS1000A z ATMEGA32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239254#p239254"><![CDATA[
no to dziwna sprawa albo jeszcze gdzieś jakiś błąd robisz - może w połączeniach?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 15 wrz 2025, o 20:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Aven154]]></name></author>
<updated>2025-09-15T16:51:45+01:00</updated>
<published>2025-09-15T16:51:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239253#p239253</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239253#p239253"/>
<title type="html"><![CDATA[Re: Komunikacja radiowa 433Mhz modułu FS1000A z ATMEGA32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239253#p239253"><![CDATA[
Właśnie wgrałem kod prosto z płyty i mimo to nie powstała transmisja pomiędzy tymi modułami a na wyświetlaczu ciągle widnieje waiting data wygląda na to ze wszystko styka podłączenia sprawdzałem kilka razy nawet same moduły zamieniałem parami napięcie na nadajniku pojawia się po wciśnieciu przycisku a transmisji jak nie było tak nie ma <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> hlip hlip<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=22247">Aven154</a> — 15 wrz 2025, o 16:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekK]]></name></author>
<updated>2025-09-13T19:18:05+01:00</updated>
<published>2025-09-13T19:18:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239246#p239246</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239246#p239246"/>
<title type="html"><![CDATA[Re: Komunikacja radiowa 433Mhz modułu FS1000A z ATMEGA32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239246#p239246"><![CDATA[
Też kiedyś zamówiłem FS1000A. Gdy zaczęły się kłopoty z uruchomieniem, to doczytałem na forach i YouTube, że są bardzo zawodne, szczególnie odbiornik. Polecam wyrzucić na elektrośmieci.<br />U mnie w odbiorniku brakuje wlutowanego kondensatorka łączącego sygnał między blokami wzmocnienia. <br />Szukaj takich RF, gdzie jest rezonator kwarcowy w nadajniku i odbiorniku.<br />Na kod nie patrzyłem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=224">JarekK</a> — 13 wrz 2025, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2025-09-12T08:52:07+01:00</updated>
<published>2025-09-12T08:52:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239244#p239244</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239244#p239244"/>
<title type="html"><![CDATA[Re: Komunikacja radiowa 433Mhz modułu FS1000A z ATMEGA32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239244#p239244"><![CDATA[
Nie potrzeba do tego żadnego zestawu ATB natomiast kody źródłowe wcale nie masz z książki - są jakoś niestety tragicznie pomieszane - ni to C ni to andruino - skąd te funkcje pinmode ? wiem widzę, że są w kodzie ale nawet nie analizuję bo nie za bardzo mam czas - za to dziwię się, że nie wykorzystujesz kodu źródłowego wprost z książki który działa i dopiero wtedy jak ci zadziała to wprowadzaj swoje modyfikacje. To jest najlepsza droga<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 12 wrz 2025, o 08:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Aven154]]></name></author>
<updated>2025-09-11T09:28:33+01:00</updated>
<published>2025-09-11T09:28:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239238#p239238</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239238#p239238"/>
<title type="html"><![CDATA[Komunikacja radiowa 433Mhz modułu FS1000A z ATMEGA32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=24845&amp;p=239238#p239238"><![CDATA[
Cześć,<br />mam problem z dokończeniem projektu i liczę, że ktoś bardziej doświadczony pomoże mi go rozwiązać.<br />Mam dwa układy ATmega32 (docelowo), do których podpiąłem tanie moduły radiowe 433 MHz FS1000A (nadajnik/odbiornik). Chcę zrealizować bardzo prostą komunikację: wciśnij przycisk → wyślij dane → odbiornik zapala diodę po odebraniu poprawnych danych.<br />Starałem się bazować na przykładach z zielonej książki Mirosława Kardasia, jednak nie mam takiej wiedzy programistycznej, żeby poprawnie to samemu poskładać. Niestety nie działa mi paczka od użytkownika ryba84 z tematu: „Pseudo OneWire i/lub biblioteka do obsługi tanich modułów RF” – nawet po moich poprawkach pod ATmega32 (o ile dobrze to zrobiłem). Nie chcę też inwestować w zestaw ATB, dlatego chcę zrobić to na samych gołych AVR-ach na płytce stykowej tak aby projekt był możliwie najmniej złożony ze zbędnych elementów.<br /><br />Poniżej wklejam mój kod nadajnika (ATmega32 w C, z własnym Manchesterem):<br />[syntax=c]Nadajnik<br />#define F_CPU 8000000UL<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define RF_PIN PIND5<br />#define LED_PIN PIND5<br />#define BUTTON_PIN PIND0<br />uint8_t checksuma;<br /><br />// półokres bitu (Manchester) = 500us<br />#define HALF_BIT_US 500<br /><br />#define INPUT 0<br />#define OUTPUT 1<br /><br /><br />void setLedOn()<br />{<br />PORTB |= (1 &lt;&lt; LED_PIN);<br />}<br /><br />void setLedOff()<br />{<br />PORTB &amp;= ~(1 &lt;&lt; LED_PIN);<br />}<br /><br />void pinMode(char port, uint8_t pin, uint8_t mode)<br />{<br />switch (port)<br />{<br />case 'B':<br />if (mode == OUTPUT)<br />DDRB |= (1 &lt;&lt; pin);<br />else<br />DDRB &amp;= ~(1 &lt;&lt; pin);<br />break;<br /><br />case 'C':<br />if (mode == OUTPUT)<br />DDRC |= (1 &lt;&lt; pin);<br />else<br />DDRC &amp;= ~(1 &lt;&lt; pin);<br />break;<br /><br />case 'D':<br />if (mode == OUTPUT)<br />DDRD |= (1 &lt;&lt; pin); // wpisuje 1 w miejsce pin<br />else<br />DDRD &amp;= ~(1 &lt;&lt; pin);<br />break;<br />/*<br />case 'A':<br />if (mode == OUTPUT)<br />DDRA |= (1 &lt;&lt; pin);<br />else<br />DDRA &amp;= ~(1 &lt;&lt; pin);<br />break;<br />*/<br />}<br />}<br /><br />void enablePullup(char port, uint8_t pin)<br />{<br />switch (port)<br />{<br />case 'B':<br />PORTB |= (1 &lt;&lt; pin);<br />break;<br /><br />case 'C':<br />PORTC |= (1 &lt;&lt; pin);<br />break;<br /><br />case 'D':<br />PORTD |= (1 &lt;&lt; pin);<br />break;<br />/*<br />case 'A':<br />PORTA |= (1 &lt;&lt; pin);<br />break;<br />*/<br />}<br />}<br /><br />uint8_t isButtonPressed()<br />{<br />return !(PIND &amp; (1 &lt;&lt; BUTTON_PIN));<br />}<br /><br />// --- Funkcje pomocnicze ---<br />void manchester_send_bit(uint8_t bit)<br />{<br />if (bit)<br />{<br />// Manchester &quot;1&quot; = &#91;LOW-HIGH&#93;<br />PORTD &amp;= ~(1 &lt;&lt; RF_PIN);<br />_delay_us(HALF_BIT_US);<br />PORTD |= (1 &lt;&lt; RF_PIN);<br />_delay_us(HALF_BIT_US);<br />}<br />else<br />{<br />// Manchester &quot;0&quot; = &#91;HIGH-LOW&#93;<br />PORTD |= (1 &lt;&lt; RF_PIN);<br />_delay_us(HALF_BIT_US);<br />PORTD &amp;= ~(1 &lt;&lt; RF_PIN);<br />_delay_us(HALF_BIT_US);<br />}<br />}<br /><br />void manchester_send_byte(uint8_t data)<br />{<br />for (uint8_t i = 0; i &lt; 8; i++)<br />{<br />uint8_t bit = (data &amp; 0x80) ? 1 : 0;<br />manchester_send_bit(bit);<br />data &lt;&lt;= 1;<br />}<br />}<br />uint8_t calculate_checksum(uint8_t checksuma) {<br />return checksuma ^ 0xAA;<br />}<br /><br />void disableTransceiver()<br />{<br />PORTD &amp;= ~(1 &lt;&lt; RF_PIN);<br />}<br /><br />void send_frame(void)<br />{<br />// Preambuła: 10 połówek (1010...)<br />//for (uint8_t i = 0; i &lt; 5; i++)<br />for (uint8_t i = 0; i &lt; 32; i++) //lub 16<br />{<br />manchester_send_bit(1);<br />manchester_send_bit(0);<br />}<br /><br />// Wysyłamy bajt danych (np. 0b10100000)<br />manchester_send_byte(0b10100000);<br />manchester_send_byte(calculate_checksum(checksuma));<br />//___________________________________________________________________________________________________________________<br />// Wrazie gdzyby dalej zostawało w stanie wysokim należy pierwszy bit '1' po 0b zmienić na zero albo dać inne dane<br />//opcja 2 po wykonaniu programu wykonać reset atmegi poprzez pin reset lub pinem wymusić<br />//______________________________________________________________________________________________________________<br />disableTransceiver();<br />}<br /><br /><br /><br />int main(void)<br />{<br />pinMode('D', RF_PIN, OUTPUT);<br />pinMode('D', LED_PIN, OUTPUT);<br />pinMode('D', BUTTON_PIN, INPUT);<br />enablePullup('D', BUTTON_PIN);<br /><br />while (1)<br />{<br /><br />// if (isButtonPressed())<br />// { // naciśnięto przycisk<br />setLedOn();<br />_delay_ms(2000);<br />send_frame();<br />setLedOff();<br />_delay_ms(500); // prosty debouncing<br /><br />// }<br />}<br />}[/syntax]<br />Do testów użyłem Arduino UNO jako odbiornika (zamiast drugiej ATmegi) z powodu chwilowego braku drugiej atmegi. Odbiornik próbuje rozpoznać preambułę i odebrać bajt danych, ale coś nie działa stabilnie – Odbiera bity i wyświetla w serial port ale nie są one stabilne i nie zgodne z danymi które założyłem.<br />[syntax=c]#include &lt;Arduino.h&gt;<br /><br />// Piny<br />#define PIN_ODBIORU 2<br />#define PIN_LED 13<br /><br />// Czas półbitu w mikrosekundach (zgodnie z nadajnikiem)<br />#define POL_BITU_US 500<br />#define TIMEOUT_MS 1000<br />/*<br />int read_rf(void){<br />    int bit = digitalRead(PIN_ODBIORU);<br />        delayMicroseconds(40);<br />        if(digitalRead(PIN_ODBIORU) == bit)<br />        {delayMicroseconds(40);<br />                if(digitalRead(PIN_ODBIORU) == bit)<br />                {delayMicroseconds(40);<br />                    if(digitalRead(PIN_ODBIORU) == bit)<br />                    {<br />                        return bit;<br />                    }<br />                }<br />        }<br />}*/<br />int read_rf()<br />{<br />    int read&#91;5&#93;;<br />    for (int i = 0; i &lt; 5; i++)<br />    {<br />        read&#91;i&#93; = digitalRead(PIN_ODBIORU);<br />        delayMicroseconds(20);<br />    }<br />    // Zlicz wystąpienia HIGH<br />    int high_count = 0;<br />    for (int i = 0; i &lt; 5; i++)<br />    {<br />        if (read&#91;i&#93; == HIGH)<br />            high_count++;<br />    }<br /><br />    // Zwróć stan dominujący<br />    return (high_count &gt;= 3) ? HIGH : LOW;<br />}<br />// Czekaj na początek transmisji<br />bool wait_for_transmission_start()<br />{<br />    unsigned long start_time = millis();<br />    int state_changes = 0;<br />    int last_state = read_rf();<br /><br />    while (millis() - start_time &lt; TIMEOUT_MS)<br />    {<br />        int current_state = read_rf();<br /><br />        if (current_state != last_state)<br />        {<br />            state_changes++;<br />            last_state = current_state;<br /><br />            // Jeśli wykryto kilka zmian stanu, prawdopodobnie zaczyna się transmisja<br />            if (state_changes &gt;= 4)<br />            {<br />                return true;<br />            }<br />        }<br /><br />        delayMicroseconds(POL_BITU_US / 4);<br />    }<br /><br />    return false;<br />}<br /><br /><br />// Odbiór pojedynczego bitu Manchester<br />int odbierz_bit_manchester()<br />{<br />    int pierwszy = read_rf();<br />    // czeka na zmiane statusu timeout<br />    unsigned long start = micros();<br /><br />    // Czekaj aż zmieni się stan lub minie czas połowy bitu * 2<br />    while ((read_rf() == pierwszy))<br />    {<br />        if (micros() - start &gt; POL_BITU_US * 2)<br />        {<br />            return -1; // timeout<br />        }<br />        delayMicroseconds(10);<br />    }<br />    // Poczekaj do środka drugiej połowy bitu<br />    delayMicroseconds(POL_BITU_US / 2);<br />    int drugi = read_rf();<br />    // dekodowanie<br />    if (pierwszy == LOW &amp;&amp; drugi == HIGH)<br />        return 1;<br />    if (pierwszy == HIGH &amp;&amp; drugi == LOW)<br />        return 0;<br />    return -1; // błąd w odczycie<br />}<br />bool reciver_preamble()<br />{<br />    int correct_patterns = 0;<br />    for (int i = 0; i &lt; 32; i++)<br />    {<br />        int bit1 = odbierz_bit_manchester();<br />        // if (bit != 1)<br />        //     return false; // błąd<br />        int bit2 = odbierz_bit_manchester();<br />        // if (bit != 0)<br />        // return false; // błąd<br />        if(bit1 == 1 &amp;&amp; bit2 == 0) {<br />            correct_patterns++;<br />        } else if(correct_patterns &lt; 2) {<br />            // Pozwól na błędy na początku<br />            continue;<br />        } else {<br />            return false;<br />        }<br />    }<br />     return correct_patterns &gt;= 3;<br />}<br />// Odbiór bajtu (8 bitów)<br />bool odbierz_bajt(uint8_t &amp;bajt)<br />{<br />    reciver_preamble();<br />    bajt = 0;<br />    for (int i = 0; i &lt; 8; i++)<br />    {<br />        int bit = odbierz_bit_manchester();<br />        if (bit == -1)<br />            return false; // błąd<br />        bajt = (bajt &lt;&lt; 1) | bit;<br />    }<br />    return true; // OK<br />}<br />//suma kontrolna XOR<br />uint8_t licz_checksum(uint8_t data)<br />{<br />    return data ^ 0xAA;<br />}<br />void setup()<br />{<br />    pinMode(PIN_ODBIORU, INPUT);<br />    pinMode(PIN_LED, OUTPUT);<br />    Serial.begin(9600);<br />    Serial.println(&quot;Odbiornik gotowy&quot;);<br />}<br /><br />void loop()<br />{<br />    uint8_t bajt;<br /><br />    if (odbierz_bajt(bajt))<br />    {<br /><br />        Serial.print(&quot;ODEBRANO: 0b&quot;);<br />        Serial.println(bajt, BIN);<br /><br />        // Jeśli odebrano konkretny bajt, włącz diodę LED<br />        if (bajt == 0b10100000)<br />        {<br />            digitalWrite(PIN_LED, HIGH);<br />            delay(300);<br />            digitalWrite(PIN_LED, LOW);<br />        }<br />    }<br />   <br />   <br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=22247">Aven154</a> — 11 wrz 2025, o 09:28</p><hr />
]]></content>
</entry>
</feed>