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



Teraz jest 18 kwi 2024, o 03:09


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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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 3 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