Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 23 maja 2025, o 05:36


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 3 sty 2012, o 18:29 
    Offline
    Nowy

    Dołączył(a): 03 sty 2012
    Posty: 7
    Pomógł: 0

    Witam!

    Problem został rozwiązany. Błędnie miałem ustawione przerwanie od ICP1 na pin PD6 a w atmega8 jest to pin PB0.
    Ale poniżej zamieściłem kolejne pytania na temat kodu!


    Mam problem z działaniem dekodera RC5. Posiadam książkę która jest świetna :) i zbudowałem wszystko na płytce stykowej według schematów zamieszczonych w książce. Zgrałem sobie kod programu z płytki i zaprogramowałem.

    Jedyna różnica taka że u mnie korzystam z Atmega8 a nie 32. Ale to tutaj chyba się nic akurat nie różni.
    I diodę odbiorczą mam TSOP2236 ale to tylko trzeba zmienić miejsce GND i DATA :)

    Po odpaleniu wszystkiego na wyświetlaczu zapala się napis Kody pilota RC. Kupiłem sobie specjalnie nawet takiego pilota jak Pan polecał z jakiegoś innego wątku RC5. Lecz niestety nic mi się nie wyświetla i nic mi nie działa :(

    Fuse bity mam ustawione na 8MHz. Wszystko sprawdzałem już z 5 razy. Rozkładałem cały układ ze 3 razy i składałem od nowa i nadal nic nie chce ruszyć.
    Dodatkowo zbudowałem jeszcze tego prostego pilota z przykładów z książki to też mój układ nie chce sczytać kodu wysyłanego :( Już mi się skończyły pomysły :(

    Jest ktoś może ze Szczecina kto już to uruchamiał i mógłbym podejść na 5 minut i byśmy sprawdzili działanie mojego układu?
    Bo to już na prawdę mnie przerasta :(



    Ostatnio edytowano 3 sty 2012, o 21:23 przez StoQ, łącznie edytowano 2 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sty 2012, o 19:17 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27403
    Lokalizacja: Szczecin
    Pomógł: 1043

    Prześlij mi swój przerobiony kod dla m8 na maila, to rzucę okiem czy wsio dobrze przerobiłeś biuro@atnel.pl ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sty 2012, o 21:21 
    Offline
    Nowy

    Dołączył(a): 03 sty 2012
    Posty: 7
    Pomógł: 0

    Problem rozwiązany :)

    Okazało się, że źle miałem ustawione przerwanie oznaczone jako ICP1. bo w at32 jest to pin PD6 a w Atmega8 jest to pin PB0.

    Ale przy okazji mam dodatkowe pytanie.

    Wyświetla mi się ten napis "Kody pilota RC"

    Przy wciśnięciu klawisza nr 1 po spodem wyświetla mi się napis "key: 1"

    A chciałbym żeby po wciśnięciu klawisza na pilocie np nr 1 w pierwszej linijce wyświetliła się jego nazwa np TVP1 a w linijce pod spodem wyświetliła się 14 bitowa kompletna ramka RC5.
    Dodałem w ir_decode.c na górze volatile uint16_t IrData;
    oraz w ir_decode.h na górze extern volatile uint16_t IrData;

    i myślałem że w main.c wystarczy jak zmienię kod na taki:
    Kod:
    if( !address ) {      /* jeśli adres == 0 */
                lcd_locate(0,0);
                lcd_str("                        ");
                lcd_locate(0,0);
                lcd_str("key: ");
                lcd_int(command);   /* wyświetl w drugiej linii LCD kod klawisza */

                lcd_locate(1,0);
                lcd_str("                        ");
                lcd_locate(1,0);
                lcd_str(IrData);
             }

    Lecz o ile w pierwszej linijce jeszcze się pokazuje że np key: 1
    to w drugiej powstają chińskie znaczki..
    Czy jest jakaś komenda na wyczyszczenie ekranu i dopiero przesłanie?
    I jak już się uda wyświetlić tą IrData nie pod postacią chińskich znaczków to jak ją przedstawić bitowo?

    I jeśli chciałbym wyświetlić kompletną 14 bitową ramkę to wystarczy że w tym miejscu:
    Kod:
    if (IrPulseCount > 12)    {
                         if (Ir_key_press_flag == 0) {
                            command = IrData & 0b0000000000111111;
                            address = (IrData & 0b0000011111000000) >> 6;
                            toggle_bit = (IrData & 0b0000100000000000) >> 11;
                         }
                         frame_status = FRAME_RESTART;
                         Ir_key_press_flag = 1;
                      }

    pozmieniam na 14 i dodam kolejne maski i nowe nazwy jak np bit startu?

    Pozdrawiam i liczę na pomoc!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sty 2012, o 22:53 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27403
    Lokalizacja: Szczecin
    Pomógł: 1043

    Cieszę się, że udało ci się samemu rozwiązać problem. Jak widzisz był błahy - a już byłeś przekonany, że cię to przerasta ;)

    Odnośnie twojego nowego celu, to absolutnie i kompletnie nie rozumiem co ty chcesz usyskać:

    Kod:
    lcd_str(IrData);


    o jaką 14 bitową ramkę ci chodzi ???? W ogóle taki zapis powinien wywalać ci obrzydliwego warninga, na którego jak widzę nie zwracasz w ogóle uwagi - a niedobrze .... bo tyle pisałem w książce, żeby warningi traktować jak błędy na początku nauki. Jako poważne błędy.

    Ale do rzeczy - widzę, że nie rozumiesz za bardzo jeszcze co to są typy danych w C :( .... i musisz to dokładnie przestudiować jeszcze raz. Na razie abstrahując od tego celu, zapis taki jak wyżej powoduje, że zamiast argumentu do tej funkcji lcd_str(), który ma być wskaźnikiem typu char na tekst ty sobie niefrasobliwie wpisujesz po prostu zmienną IrData, która jest typu uint16_t i w ogóle nie jest wskaźnikiem. I o tym KRZYCZY ci kompilator w warningu, że robisz pan błąd, że tak nie można bo wyjdą głupoty i krzaki na LCD ;) .... ale ty to kompilujesz a potem się dziwisz że krzaki na ekranie.

    Dodam, że zmienna IrData nie powinna być w ogóle wykorzystywana przez ciebie w programie głównym, ona jest tylko do użytku w przerwaniu - no ale ty sprytnie sobie wyciągnąłeś ją ;) tak jak opisałeś to wyżej - no dobra - ok rozumiem - to jakiś cel. Niech będzie - ale zastanów się - to jest cały czas tylko i wyłącznie LICZBA CAŁKOWITA 16-bitowa bez znaku !!!

    Zatem w jakiej postaci ty chciałbyś sobie tą rzekomą ramkę wyświetlić ???? w postaci ?? - no w jakiej ? nawet tego nie sprecyzowałeś w poście. A sprecyzowałeś sobie to sam ? Czy chodzi (próbuję zgadywać) o to żeby wyświetliły się zera i jedynki ? chodzi ci o postać binarną ?

    Jeśli tak - to panie kochany - to wtedy chodzi ci o liczbę ale w formie binarnej. Wtedy teoretycznie można to zrobić tylko trzeba byłoby przerobić nieco funkcję

    Kod:
    lcd_int();


    która służy właśnie do wyświetlania liczb dziesiętnych. A więc na początek zamiast tego:

    Kod:
    lcd_str( IrData );


    co jest bezsensem niestety, daj sobie wyświetlenie liczby:

    Kod:
    lcd_int( IrData );


    wtedy przynajmniej zbliżysz się do celu, tzn wyświetlisz tę swoją zmienną chociaż na razie w postaci tylko dziesiętnej.
    A jak interesuje cię postać binarna (jeśli dobrze zgadłem cel powyżej) - to zajrzyj sobie do wnętrza funkcji lcd_int() i zmień parametr w wywoływanej funkcji itoa() z wartości 10 zdaje się na 2, wtedy zostanie wyświetlona liczba w postaci binarnej. Tylko prawdopodobnie będziesz musiał zwiększyć troszkę bufor na znaki ASCII tych zer i jedynek.

    poczytaj sobie w ogóle o funkcji itoa(), jak ona działa, jak dokonuje konwersji itd

    i koniecznie ale to koniecznie poczytaj o wskaźnikach i o tym jak są przekazywane w postaci argumentów do funkcji, szczególnie gdy chcemy wyświetlać czy wysyłać gdzieś jakieś teksty. Jest o tym w książce sporo. A jak coś to jeszcze dopytaj. Bo inaczej będziesz się wciąż kręcił w miejscu z takimi problemami.

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sty 2012, o 09:15 
    Offline
    Nowy

    Dołączył(a): 03 sty 2012
    Posty: 7
    Pomógł: 0

    Witam :)

    Dziękuję za słowa krytyki, ale faktycznie trochę wszystko zagmatwałem.
    Przeczytałem o itoa() i wiem że pobiera ona jako argument liczbę int. Do typu long int służy ltoa().

    Pozmieniałem tak jak Pan pisał i pięknie. W pierwszej linijce wyświetla mi się binarnie command :)
    a w drugiej 13 bitów ramki RC5.

    A chciałem uzyskać taki efekt że w pierwszej linijce o ile może tak zostać albo zdubluje funkcję lcd_int i pierwsza będzie mi wyświetlać dziesiętną liczbę natomiast linijkę niżej stworzę nową lcd_bin() która chciałbym żeby wyświetlała kompletną 14 bitową ramkę RC5 w wersji bitowej.
    Niestety w takiej formie wyświetla mi tylko 13 bitów. Gdzie musiałbym zagrzebać? Próbowałem zmienić IrPulseCount na wartość większą niż 12 ale wtedy cały układ przestaje działać :(

    I kolejne pytanie. Czy istnieje jakaś funkcja czyszcząca ekran? Czy trzeba po prostu cały ekran zapisać pustymi znakami?
    Kod:
    lcd_str("                ");



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sty 2012, o 10:57 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27403
    Lokalizacja: Szczecin
    Pomógł: 1043

    StoQ napisał(a):
    .... natomiast linijkę niżej stworzę nową lcd_bin() która chciałbym żeby wyświetlała kompletną 14 bitową ramkę RC5 w wersji bitowej.


    O! takie podejście to już mi się podoba ;) tzn o tym stworzeniu własnej funkcji. Bo z tymi 14 bitami to kolega przesadził ;) a skąd miałoby się ich pojawić 14 ? Tu znowu odesłałbym do dokładnej analizy odbioru RC5 bo widać po tym, że jeszcze nie do końca zaskoczyło - ale też nie ma co się stresować, powoli kolega dojdzie. W czym pomogą na pewno też takie własne testy.

    StoQ napisał(a):
    Niestety w takiej formie wyświetla mi tylko 13 bitów.


    No właśnie TAK MA BYĆ ;) ... Jak kolega dokładnie się przyjrzy wykresom RC5 to zobaczy kolega, że nie jesteśmy w stanie wykryć oddzielnie pierwszego bitu startu ;) bo dekodowanie rozpoczyna się dopiero w jego połowie na opadającym zboczu i to jest dopiero sygnał dla procedury dekodowania ramki prawda ? Zatem jeden bit ramki mamy z głowy ale wiadomo, że MUSIAŁ on mieć wartość 1 skoro cała ramka się poprawnie zdekodowała. Tu leży ten szkopuł, który kolega pominął w swoich rozważaniach RC5.

    StoQ napisał(a):
    Gdzie musiałbym zagrzebać?

    Nigdzie, po prostu można sobie ręcznie na siłę wyświetlić jedynkę na początku ;)


    StoQ napisał(a):
    Próbowałem zmienić IrPulseCount na wartość większą niż 12 ale wtedy cały układ przestaje działać :(
    teraz to już chyba kolega rozumie chociaż troszkę dlaczego ?

    StoQ napisał(a):
    I kolejne pytanie. Czy istnieje jakaś funkcja czyszcząca ekran? Czy trzeba po prostu cały ekran zapisać pustymi znakami?
    Kod:
    lcd_str("                ");


    A nie widział kolega przypadkiem funkcji:

    Kod:
    lcd_cls();


    Tylko proszę uważać - ona długo trwa więc jej używanie często mija się z celem. Lepiej przyzwyczaić się do funkcji lcd_locate();

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 sty 2012, o 23:34 
    Offline
    Nowy

    Dołączył(a): 03 sty 2012
    Posty: 7
    Pomógł: 0

    Mam kolejne pytanie w sprawie działania programu. Dokładnie to chciałbym się dowiedzieć jak to działa:

    Kod:
    static uint16_t LastCapture;
             uint16_t PulseWidth;
       static uint8_t  IrPulseCount;
       static uint16_t IrData;
       static uint8_t  frame_status;


       PulseWidth  = ICR1 - LastCapture; // co to ma na celu?
       LastCapture = ICR1;


    co to sa te LastCapture, PulseWidth oraz IrpulseCount oraz skąd się bierze ICR1?
    Szukałem trochę informacji na ten temat ale jakoś nie mogę tego zrozumieć na chłopski rozum..
    IrData i frame_status rozumiem jak działa jeszcze :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 sty 2012, o 23:45 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27403
    Lokalizacja: Szczecin
    Pomógł: 1043

    No ICR1 trudno nie znaleźć. Widać, że kolega chyba nie pracuje w Eclipse - a szkoda. Wystarczyłoby przytrzymać wciśnięty klawisz CTRL i kliknąć lewym klawiszem myszki na nazwę ICR1 i nagle wszystko stałoby się jasne. Dlatego polecam Eclipse ale też PDF - bo ICR1 toż to przecież podstawowy rejestr sprzętowego Timera1 odpowiedzialny za przechwytywanie. To w nim są zliczane takty, za pomocą których i zmiennych PulseWidth oraz LastCapture mierzymy dokładne czasy trwania impulsów w mikrosekundach w tym przykładzie programu.

    Żeby to lepiej zrozumieć - trzeba sobie jednak wziąć kartkę papieru, rozrysować ze dwa przebiegi jak wygląda ramka RC5 dla np klawisza 1 oraz 2 i zgodnie z opisem w książce oraz kodem procedury obsługi przerwania śledzić co się dzieje od zbocza do zbocza tych nadlatujących sygnałów z pilota.

    Nie wiem czy takie wyjaśnienie wystarczy.

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 sty 2012, o 00:36 
    Offline
    Nowy

    Dołączył(a): 03 sty 2012
    Posty: 7
    Pomógł: 0

    jutro spróbuję to rozrysować i zobaczymy czy dobrze myślę.. bo albo dzisiaj śpiący już jestem albo niekumaty :P



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 sty 2012, o 06:45 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27403
    Lokalizacja: Szczecin
    Pomógł: 1043

    dodam tylko, że ta konstrukcja:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    ma na celu obliczanie czasu pomiędzy przerwaniami. Zauważ, że niektóre zmienne są statyczne - prawda? A pamiętasz jak one działają ?

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 22 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO