logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR w C] Problemy z odbiornikiem RC5 i diodą LED na TSOP1736

marenc 28 Mar 2008 15:07 9416 27
  • #1 4965154
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Witam, na potrzeby projektu wymyśliłem, że sterowanie będzie się odbywało podczerwienią za pomocą uniwersalnego pilota. Poczytałem to i tamto o podczerwieni i myślałem, że jest ona na tyle prosta, że nie będzie problemu z jej implementacją. Ale byłem w błędzie...

    Kupiłem czujnik podczerwieni TSOP1736 i podłączyłem go(prawidłowo). Nogę danych podłączyłem do INT1 i przygotowałem to przerwanie do pracy na zboczu opadającym. W ten sposób wykrywam start. W obsłudze przerwania odczekuje 0.4ms(na stabilizację stanu). Po tym czasie sprawdzam stan i jeżeli L to do danych bit na H i odwrotnie(testuję drugą część bitu, a transmisja jest zanegowana przez czujnik). Następnie w pętli 13 razy odczekuje 1.8ms i sprawdzam stany zapisując dane. Na końcu sprawdzam czy odebrano dwa razy z rzędu tą samą daną i jeżeli tak to neguje stan dla diody LED.

    Sposób prosty, ale czasem dioda nie chciała zmienić stanu, lub miało to miejsce tylko dla określonego przycisku pilota lub samego pilota.

    Większość tego typu problemów jest oparta o liczniki, ale moim zdaniem ich używanie nie jest konieczne, a na prędkości wykonywania kodu mi nie zależy.

    Elektrodę przeszukałem, ale tylko BASCOM'a znalazłem :|

    Czy może ktoś podpowiedzieć jak napisać poprawny odczyt podczerwieni? Co robię źle? W ostateczności gotową bibliotekę dla C bym prosił...
  • #2 4965263
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Dla C biblioteki nie szukałem, ale dla assemblera polecam notę aplikacyjną Atmela AVR410. Jest tam też opisany algorytm dekodowania. Opiera się na timerze i posiada synchronizację dla każdego bitu. Korzystałem z tego i działa świetnie.
  • #3 4965340
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Hmmm ... na poczekaniu postaram się utworzyć coś na przerwaniu obydwu-zboczowym, ale nie chcę używać timera, bo może się przydać do innych rzeczy. Notę już mam i czytałem.

    Ale tok rozumowania działania odbioru podczerwieni mam poprawny, tak?

    //Witam ... napisałem na szybko taki kod:

    #define IR_PIN		PD3
    #define IR_STATUS	PIND
    
    uint16_t Data = 0;
    uint16_t Last = 0;
    
    SIGNAL(SIG_INTERRUPT1)
    {
    
    	_delay_ms(0.45);
    	if(!(IR_STATUS&(1<<IR_PIN)))
    	{
    	
    		Data++;
    		
    	}
    
    	Data <<= 1;
    
    	if(Data&0x2000)
    	{
    
    		if(Data&0x1000)
    		{
    
    			if(Data==Last){PORTD ^= 0x80;}
    
    			if(!(Last)){Last = Data;}
    
    			Data = 0;
    
    		}
    
    	}
    
    }

    Ze strony programowej wydaje mi się poprawny(może nie najszybszy, ale poprawny). Układ jednak reaguje na różne przyciski pilota.

    Znalazłem kolejny problem. Odczytywałem dwa zbocza, ale nie koniecznie środkowe dla bitu. Teraz układ działa, ale nie zawsze dla danego przycisku i dla różnych też działa. Help.
  • #4 4965693
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Po pierwsze dobrze odfiltruj zasilanie odbiornika podczerwieni bo lubi sie taki wzbudzaći i nadawac rózne smieci (nie wszystkie ale większość). Ja zawsze daje opornik z 12V w i diode zenera 5.1V oczywiscie kondensatorki. Niewielki koszt a skuteczne. Do prób to koniecznośc potem to mozna spróbowac ze wspolnego 5V.
  • #5 4965727
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Mam kondensator 1000uF(elektrolit) i 100nF(ceramik) zaraz przy nogach czujnika podczerwieni.
  • #6 4965975
    dawid512
    Poziom 32  
    Posty: 1439
    Pomógł: 229
    Ocena: 6
    Witam.

    Osobiscie odbiornik podlaczam wg tego schematu i powiem ze dziala b. dobrze i bez odbierania jakichs smieci.
    Załączniki:
    • [AVR w C] Problemy z odbiornikiem RC5 i diodą LED na TSOP1736 tsop.JPG (9.22 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 4966031
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Witam, dodałem ten rezystor(470R) szeregowy przy zasilaniu, ale nic się nie zmieniło. Teraz mam kod poniższy, i program działa, ale wolno i czasem dla innego przycisku niż powinien:
    #define IR_PIN		PD3
    #define IR_STATUS	PIND
    
    uint16_t Data = 0;
    uint16_t Last = 0;
    
    void IR_Initiate(void)
    {
    
    	MCUCR |= (1<<ISC10);
    	GICR |= (1<<INT1);
    
    }
    
    SIGNAL(SIG_INTERRUPT1)
    {
    
    	if(Data&0x8000)
    	{
    	
    		Data &= 0x7fff;
    		
    	}
    	else
    	{
    
    			Data |= 0x8000;	
    
    		_delay_ms(0.45);
    		if(!(IR_STATUS&(1<<IR_PIN)))
    		{
    	
    			Data++;
    		
    		}
    
    		Data <<= 1;
    
    		if(Data&0x2000)
    		{
    
    			if(Data&0x1000)
    			{
    
    				if(Data==Last){PORTD ^= 0x80;}
    
    				if(Last==0){Last = Data;}
    
    			}
    
    			Data = 0;
    
    		}
    
    	}
    
    }

    Jeżeli ktoś ma coś sprawdzonego w C to chętnie przyjmę dla sprawdzenia poprawności pracy czujnika podczerwieni.
  • #9 4966373
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Zrobiłem ignorowanie tego bitu i kod zachowuje się podobnie. Wywaliłem z programu dosłownie wszystko co zbędne - zostawiłem tylko to co wkleiłem na forum, a mimo to program reaguje na kilka przycisków, podczas gdy program wymusza obsługę tylko jednego z nich...
  • #10 4966591
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Zapominałeś o skasowaniu flagi INT1 w GIFR.

    Piotrek
  • #11 4966618
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Flaga zostaje wyzerowania automatycznie podczas wywoływania wektora przerwania. Dla pewności dodałem do kodu. Nie pomogło ;)
  • #12 4966652
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    mariuszlorenc napisał:
    Flaga zostaje wyzerowania automatycznie podczas wywoływania wektora przerwania. Dla pewności dodałem do kodu. Nie pomogło ;)

    Takiej odpowiedzi sie spodziewałem :(
    Masz skasować te flagę , tuż przed zakończeniem obsługi przerwania( ostatnia instrukcja w ISR)

    Piotrek
  • #13 4966753
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    No zmieniłem i nic to nie zmieniło. Całkiem przypadkiem doszedłem do wniosku, że mój pilot od wierzy HiFi chyba jest jakiś specjalny(w zależności od sekwencji przyciskania przycisków wysyła różne kody) :D No ale kod nadal nie powinien działać na kilku przyciskach nieprawdaż?
  • Pomocny post
    #14 4966958
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Jezeli nie masz sprawdzonego pilota to ciężko ci bedzie dojsć.
    Proponuje najpierw zrzucic na analizator cyfrowy przebieg wychodzący z pilota i dopiero walczyc.
    Jakiej marki wieża??

    Dodano po 26 [minuty]:

    [AVR w C] Problemy z odbiornikiem RC5 i diodą LED na TSOP1736
  • #15 4967541
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Panasonic, ale próbowałem też z pilotem od TV Daewoo(ten w ogóle nie chce pracować z tym układem). Ten z wierzy przynajmniej dla kilku przycisków ma na 100% stałe kody: Power, Sleep. A przy tym kodzie który mam to oba wpływają na świecenie diody :(

    Niestety analizatora stanów logicznych jeszcze nie posiadam. Jak skończę parę projektów to biorę się za własnie analizator stanów logicznych oraz oscyloskop cyfrowy. Tylko muszę skończyć te projekty...
  • Pomocny post
    #16 4967633
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Jak nie masz analizatora to poprostu napisz program który mierzy poszczególne umpulsy. Poprostu odczytuj licznik L1 po kazdym przerwaniu od zbocza i zgromadz to w pamieci. Program do napisania w 5 minut. Jak juz bedziesz miał te liczby to wystarczy przeanalizowac a najlepiej sobie narysowan.
    Analizator mam zrobiony na wejsciu COM 4 kanałowy:-) max 1MHz
  • #17 4967643
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Jeśli masz port RS232 w komputerze, to poskładaj sobie prościutki odbiornik do programu Girder. Możesz w nim odczytać odebrane dane i na tej podstawie stwierdzić jaki masz standard kodowania. RC5 jest niby popularny, ale mi akurat nie udało się znaleźć takiego pilota w mojej kolekcji:) Musiałem kupić.
  • #18 4967981
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    @ diego nie trudno, ale to piszącemu ma zależeć na tym, aby mu pomóc, nie nam:>
    Idąc dalej to cudo nie ma jtaga, więc pewnie masz gdzieś zwarcie, niepodłączone R/!W do masy? Pomylone przewody?
    (Poza tym, dalej nie wiemy gdzie masz co podłączone)....
  • #19 4968179
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Podłączenie jest zgodne z dokumentacją odbiornika. Zapomniałem, że mam JTAG'a :P Zaraz go podłącze i zobaczę co z tego będzie. Jeżeli chodzi o analizator stanów logicznych to chyba rzeczywiście na szybko napiszę coś prostego.

    Tak w ogóle to zapomniałem dodać, że całość uruchamiam na ATmega16 z 16MHz.

    //Podłączyłem JTAG'a i program odbiera różne dane z tego samego przycisku(dla 5 przycisków ta sama sytuacja), więc problem leży po stronie kodowej. Zabiorę się dzisiaj za jakiś prosty analizator logiczny i zobaczę w którym momencie jakie są stany na wyjściu z czujnika, jakie są timingi na wyjściu z czujnika oraz kiedy sprawdzam stan mikrokontrolerem. Dam znać jak coś zauważę...
  • #20 4968518
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Mam pilot, który tak się zachowuje (standard NEC). Wysyła po 3 różne kody pod każdym klawiszem. Dopóki nie będziesz na 100% pewien, że masz RC5 w pilocie nie ma sensu walczyć z kodem.
  • #21 4968574
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    No właśnie składam ten analizator stanów logicznych, ale chyba mam piloty w tym standardzie o którym piszesz. Jak naciskałem przycisk, to co 3 raz ZAWSZE program dobrze załapywał. Tego standardu nie da się opanować?
  • #22 4968655
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    Nie ma, że się nie da:) Ale format ramki jest zupełnie inny.
  • Pomocny post
    #23 4968684
    Pijopic
    Poziom 17  
    Posty: 235
    Pomógł: 10
    Ocena: 2
    Watpie by Panasonic dzialal w RC5...
  • Pomocny post
    #24 4968767
    don diego
    Poziom 32  
    Posty: 1557
    Pomógł: 165
    Ocena: 63
    RC5 to przede wszystkim Philips. Natomiast Panasonic prawdopodobnie wykorzystuje jakiś swój protokół (ten mój pilot chyba też w nim pracuje). Według książki "Mikrokontrolery w systemach zdalnego sterowania" Z. Hajduka, Panasonic nadaje w 48 bitowych ramkach, o czasie trwania 76ms, z kodem typu SPACE. Starsze modele Panasonica miały ramkę 22bit i czas trwania 41,13ms.
    /edit/ Zerknij tutaj
  • #25 4968831
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Cytat:
    001001001100110111111011111001111111111111111111
    000110010011001001100100110010111111111111111111
    000110010001001001100100110010111111111111111111

    Oto dane jakie otrzymałem po naciśnięciu 3 razy tego samego przycisku w różnych odstępach czasu. Wygląda na to, że ramka ma co najmniej 30b(ciężko mi określić timingi, bo program na szybko napisałem).

    Ale to i tak projekt mi się wali ... chciałem zrobić urządzenie, które będzie miało funkcję uczenia się obsługi dowolnego pilota. Myślałem, że sygnał nadawany z danego przycisku jest zawsze taki sam, więc obsługa polegała by na porównywaniu z tabelą(EEPROM'em).

    Macie jakieś pomysły jak to inaczej rozwiązać? Koniecznie podczerwień i raczej bez tworzenia nowego pilota specjalnie dla tego urządzenia :(
  • #26 4979745
    Pijopic
    Poziom 17  
    Posty: 235
    Pomógł: 10
    Ocena: 2
    Z danych ktore zamiesciles wynika ze sa identyczne tylko zle odebrane, musisz poproacowac nad tym, moze byc rowniez tak ze masz zly odbiornik podczerwieni pracujacy z inna czestotliwoscia modulacji niz pilot, by odbiornik mogl byc uniwersalny musisz wykorzystac zamiast modulu SFH zwykla diode odbiorcza IR.
  • #27 4979779
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Kupiłem pilota zgodnego z RC5 i wszystko ładnie śmiga. Rozpoznawanie przycisków na potrzeby projektów jest bardzo proste, bo opiera się o zasadę zapisz-porównaj-wykonaj. Przy obecnym pilocie wszystko śmiga aż miło :D Dzięki wszystkim za pomoc ;)

    //Witam ponownie ... niestety potrzebuję dalszej pomocy. Okazało się, że kody odbierane przez mikrokontroler czasem są takie same dla kilku przycisków lub są różnie odbierane w zależności od odległości od czujnika. Zdecydowałem się jednak odpalić licznik. Poniżej kod:
    uint16_t Data;
    
    ...
    
    void IR_Initiate(void)
    {
    
    	MCUCR |= (1<<ISC11);
    	GICR |= (1<<INT1);//Włączenie przerwania rozpoczęcia
    
    	OCR2 = 85;//Pierwsza pętla 1,35ms
    	TIMSK |= (1<<OCIE2);
    
    }
    
    SIGNAL(SIG_INTERRUPT1)
    {
    
    	TCCR2 = (1<<WGM21)|(1<<CS22)|(1<<CS21);
    
    	GICR &= ~(1<<INT1);
    
    }
    
    SIGNAL(SIG_OUTPUT_COMPARE2)
    {
    
    	OCR2 = 113;//Kolenja pętla 1,8ms
    
    	if(!(PIND&0x08)){Data++;}
    
    	Data <<= 1;
    
    	if((Data&0xc000)==0xc000)
    	{
    	
    		LCD_Upper_line();
    		LCD_Send_integer_in_binary(Data>>8);
    		LCD_Send_integer_in_binary(Data);
    
    		TCCR2 = 0x00;
    
    		OCR2 = 85;//Pierwsza pętla nowej ramki 1,35ms
    
    		GICR |= (1<<INT1);//Włączenie przerwania rozpoczęcia
    	
    	}
    
    }

    Problem opisany powyżej. Dodam, że to czego nie znacie ma na tyle proste etykiety, że chyba złapiecie o co chodzi ;) Całość wyświetla odebrany kod na LCD. Ten kod jest różny dla tego samego przycisku. Jak mogę poprawić odbiór transmitowanej ramki? Już mi się pomysły kończą :(
  • #28 4990926
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Panowie ... pomocy, bo tracę cierpliwość :(

    Dajcie dowolny przykład lub pomysł w C, który może pracować również z licznikiem(ale raczej T2 bym prosił).

    ps. ATmega16 z 16MHz

    //Napisany w celu przeniesienia wątku na górę listy w podtemacie mikrokontrolery.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z implementacją odbiornika podczerwieni RC5 na mikrokontrolerze ATmega16 (16MHz) z użyciem czujnika TSOP1736 i diody LED. Autor opisuje próbę dekodowania sygnału IR za pomocą przerwania INT1 na zboczu opadającym, z opóźnieniem stabilizacyjnym 0,4 ms i pomiarem stanów logicznych w określonych odstępach czasowych. Problemy obejmowały niestabilne rozpoznawanie przycisków, reakcję na różne przyciski lub piloty, a także błędne odczytywanie kodów. Wskazano na konieczność odpowiedniego filtrowania zasilania odbiornika (kondensatory, rezystory, diody Zenera) oraz uwzględnienie bitu toggle w protokole RC5. Zasugerowano użycie noty aplikacyjnej Atmel AVR410, która opisuje algorytm dekodowania z wykorzystaniem timera i synchronizacji bitów. Wskazano, że piloty różnych marek (Panasonic, Daewoo) mogą używać różnych protokołów IR, niekoniecznie RC5, co komplikuje implementację. Zalecane jest użycie analizatora stanów logicznych lub prostego programu mierzącego długości impulsów do identyfikacji protokołu i poprawnej interpretacji sygnału. Autor rozważał stworzenie uniwersalnego urządzenia uczącego się kodów pilotów, jednak napotkał na problem zmienności kodów i różnych standardów transmisji. Ostatecznie zakup pilota zgodnego z RC5 rozwiązał część problemów, ale nadal pojawiały się błędy związane z odległością i powtarzalnością kodów. W dyskusji pojawiły się sugestie dotyczące implementacji obsługi przerwań, konieczności zerowania flagi INT1, oraz wykorzystania licznika Timer2 do pomiaru czasów impulsów. Podkreślono, że Panasonic prawdopodobnie używa własnego protokołu IR, a RC5 jest standardem głównie Philipsa. Wskazano na potrzebę dokładnej analizy sygnału i dostosowania oprogramowania do konkretnego protokołu pilota.
Wygenerowane przez model językowy.
REKLAMA