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

protokół IR pilota Grundig

iceCocoo 08 Wrz 2009 13:17 2070 10
REKLAMA
  • #1 6994537
    iceCocoo
    Poziom 10  
    Witam,

    Trochę szukałem protokołu wysyłania sygnałów IR do telewizorów Grundig i znalazłem tylko to: http://lirc.sourceforge.net/remotes/grundig/TP_750C (dokładnie taki model jaki chcę). Jednakże nie rozumiem z tego opisu zbyt dużo.
    Odszyfrowałem to tak:
    (gdzie H to dioda świeci przez 512us, L - nie świeci, przez 512us. Nie ma przerw.)
    Część startowa: LHHHHH (512us wył., 2560us włącz.);
    bitowe 1 - LH;
    bitowe 0 - HL;


    komendy zamieniam z hexa na binarną postać i wysyłam 10 bitów + część startowa.

    Czyli np dla komendy 'prog +' wysłałbym tak:
    start + 0101010111 albo LHHHHH HL LH HL LH HL LH HL LH LH LH

    Czy to jest dobrze i jak mam to poprawić?

    512 L, 2560H, 512H, 512
  • REKLAMA
  • REKLAMA
  • #3 6997323
    iceCocoo
    Poziom 10  
    Najwyraźniej czegoś nie rozumiem, bo nie wychodzi mi.
    Wysyłam tak jak w części Pulse Diagram wiadomość i nic się nie dzieje. Wysyłałem wszystkie 511 kombinacji i żadnej reakcji na ekranie nie zobaczyłem.

    Kod mojego uC podaję poniżej. Długość odpowiednich części jest idealnie wymierzona (sprawdzałem debbugerem w AVRStudio). Robione jest to na kwarcu wbudowanym i jak
    czytałem, to jest on mało dokładny, ale czy to aż takie wielkie znaczenie ma tutaj?

    Jak widać po kodzie - jestem początkujący w uC i programowaniu. Mile widziana każda wskazówka :)

    #define F_CPU           1000000ul    // częstotliwość zegara w Hz
    
    #include <avr/io.h>             
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    #define LED_DDR			DDRB
    #define LED_PORT        PORTB                // port diody LED
    #define LED_BIT			0x01
    
    #define LED_ON  (LED_PORT = LED_BIT)
    #define LED_OFF (LED_PORT = 0x00)
    
    void init(void);
    void led_flashing(uint16_t data);
    
    
    void start_signal(void);
    void command_signal(uint16_t data);
    void adress_signal(void);
    
    void logic_1(void);
    void logic_0(void);
    
    void init(void)
    {
    	UCSRB = _BV(RXEN);
    	LED_DDR = LED_BIT;
    	LED_OFF;
    
    }
    
    
    int main(void)                        
    {
      init();
      uint16_t data[6] = {0x17F, 0xEF, 0x157, 0x57, 0xFF, 0xDF};
      int i;
    
      while(1)
      {
    
        //data = USART_receive();
    	for(i=0;i<6;++i)
    	{
    		led_flashing(data[i]+0x200);
    		LED_OFF;
    		_delay_ms(100);
    		_delay_ms(100);
    	}
      }
    }
    
    void led_flashing(uint16_t data)
    {
    	// start section
    	start_signal();
    	// signal received
    	command_signal(data);
    
    }
    
    void start_signal(void)
    {
    	LED_ON;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(59);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    	LED_OFF;
    	_delay_ms(2);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(80);
    	asm("nop"); 
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    
    }
    
    void command_signal(uint16_t data)
    {
    	int i=10;
    	while(i)
    	{
    		if(data &0x200) 
    		{	// trzeba dodac nop, bo robi mniej clocka
    			asm("nop");
    			logic_1();
    		}
    		else logic_0();
    		data <<= 1;
    		--i;
    	}
    }
    
    
    void logic_1(void)
    {
    	LED_ON;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(58);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    	LED_OFF;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(34);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    }
    
    void logic_0(void)
    {
    	LED_OFF;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(56);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    	LED_ON;
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(40);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    }
    
  • REKLAMA
  • #5 7001157
    iceCocoo
    Poziom 10  
    Sam nie wiem czemu pominąłem to, mimo, że na każdej stronie jest bardzo wyraźnie podkreślone, że jedynka to migania.

    Poprawiłem kod, ale wciąż mam jakiś problem (tj. nie działa jakbym chciał). Czytałem kilka razy - bardzo dokładnie (a przynajmniej tak mi się wydaje) - i nie wiem co powinienem zrobić jeszcze żeby działało.

    Załączam kod oraz schemat nadawcy.

    Jestem pewien co do tego, że dioda świeci na LED_ON i gaśnie na LED_OFF. Całość sprawdzam poprzez skierowanie diody bezpośrednio na odbiornik w telewizorze z odległości mniejszej jak 10 cm.

    W AVRStudio ustawiłem, że komenda jest wysyłana z dokładnością co do us (bez tych przerw powyżej 10ms). Sygnały są jak w pdfie przy założeniu częstotliwości 500kHz.

    Miłe by było nawet zobaczenie gotowego schematu i kodu do uC z czego mógłbym wyciągnąć jakieś wnioski.
    Chciałbym w końcu zrobić większy krok naprzód.

    Dziękuję i pozdrawiam.

    #define F_CPU           1000000ul    // częstotliwość zegara w Hz
    
    #include <avr/io.h>             
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    #define LED_DDR			DDRB
    #define LED_PORT        PORTB                // port diody LED
    #define LED_BIT			0x01
    
    #define LED_ON  (LED_PORT = LED_BIT)
    #define LED_OFF (LED_PORT = 0x00)
    
    void USART_send(uint16_t Data);
    uint8_t USART_receive(void);
    void init(void);
    void led_flashing(uint16_t data);
    
    
    void start_signal(void);
    void command_signal(uint16_t data);
    
    void blink(void);
    void logic_1(void);
    void logic_0(void);
    
    void init(void)
    {
    	LED_DDR = LED_BIT;
    	LED_OFF;
    }
    
    
    int main(void)                        
    {
      init();
      uint16_t data[6] = {0x17F, 0xEF, 0x157, 0x57, 0xFF, 0xDF};
      int i, j;
    
      while(1)
      {
    
    	for(i=0;i<6;++i)
    	{
    		j = 10;
    		led_flashing(data[i]+0x200);
    		
    		_delay_ms(19);  // ~19,968ms
    		_delay_us(200);
    		_delay_us(200);
    		_delay_us(200);
    		_delay_us(148);
    
    		while(j)
    		{
    			led_flashing(data[i]+0x200);
    			_delay_ms(177);
    			_delay_us(72);
    			--j;
    		}
    	}
    	_delay_ms(200);
      }
    
      return 0;
    }
    
    
    void led_flashing(uint16_t data)
    {
    	// start section
    	start_signal();
    	// signal received
    	command_signal(data);
    
    }
    
    void start_signal(void)
    {
    	blink();   // for 512us blinks in 'good' way
    
    	_delay_ms(2);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(90);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    
    }
    
    void command_signal(uint16_t data)
    {
    	int i=10;
    	while(i)
    	{
    		if(data &0x200) 
    		{	// trzeba dodac nop, bo robi mniej clocka
    			asm("nop");
    			logic_1();
    		}
    		else logic_0();
    		data <<= 1;
    		--i;
    	}
    }
    
    
    void logic_1(void)
    {
    	blink();   // for 512us blinks in 'good' way
    
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(52);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    }
    
    void logic_0(void)
    {
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(150);
    	_delay_us(56);
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    
    	blink();   // for 512us blinks in 'good' way
    	asm("nop");
    	asm("nop");
    	asm("nop");
    }
    	
    void blink(void)
    {
    	int i=15;
    	while(i)
    	{
    		LED_ON;
    		asm("nop");
    		asm("nop");
    		asm("nop");
    
    		asm("nop");
    		asm("nop");
    
    		asm("nop");
    		asm("nop");
    
    		LED_OFF;
    		_delay_us(20);
    		asm("nop");
    
    		--i;
    	}
    	LED_ON;
    	asm("nop");
    	asm("nop");
    	asm("nop");
    
    	asm("nop");
    	asm("nop");
    
    	asm("nop");
    	asm("nop");
    
    	LED_OFF;
    }
    
  • #6 7001414
    kulmar
    Poziom 31  
    Narysuj porządnie schemat, zwłaszcza podłączenie tranzystora w układzie. Bo z tego trudno cokolwiek wywnioskować - BC547 jest tranzystorem NPN, a u Ciebie wygląda jakby był podłączony jako PNP. I od tego trzeba zacząć - na nic testowanie programu, jeśli schemat jest błędny.

    Pozdrawiam

    Mariusz
  • #7 7002958
    iceCocoo
    Poziom 10  
    Faktycznie, masz rację. Po prost pomyliłem oznaczenia rysując.
    Dla pewności podam, że nóżki tranzystora są podłączone (patrząc na płaski a nóżki w dół): lewa do zasilania, środkowa do kondensatora z oporem, prawa do rezystora i diody.
    Dioda jest podłączona dłuższą nóżką do opornika.

    Opory sprawdziłem mulitmetrem. Pierwszy ma dokładnie 10,2k a drugi 69.

    Czy ten kod co napisałem powinien działać? Jaki mogą być powody, że 'sygnał' nie jest rozumiany?
  • REKLAMA
  • Pomocny post
    #10 7014294
    kulmar
    Poziom 31  
    Ok. Mam pewne uwagi co do wartości rezystorów, ale skoro sprawdzasz elektronikę w odległości 10cm od TV, to na razie zostawmy to tak jak jest.
    Ten link, który Ci podałem nie opisuje wszystkich niuansów kodu SDA2208 (przepraszam, nie sprawdziłem), ale nic lepszego nie znalazłem.
    Na razie zrób prosty test. Kod SDA 2208 wymaga, aby paczka startowa (rozpoczynająca transmisję) składała się z 9 jedynek. Piszę z pamięci, bo nie mam w tej chwili dostępu do dokumentacji. I tak samo paczka końcowa, to 9 jedynek. Jeśli się pomyliłem, to jutro sprostuję. I dlatego (pomijając inne możliwe błędy) Twój TV nie reaguje. Bo jeśli wysyłałeś kod 511 (9 jedynek), co było OK z punktu widzenia startu i stopu, to najprawdopodoniej ta komenda (511) nie jest dla odmiany komendą Twojego TV. Napisz program, który wysyła następującą sekwencję kodów:

    Start - 511
    Komenda - 0 (najprawdopodobniej nr kanału)
    Stop - 511

    Rozpiszę Ci to na czasy:
    Start:
    512H 2560L i 10x(512H + 512L)
    teraz przerwa - 20ms
    Komenda:
    512H 2560L 512H 1024L i 9x(512H + 512L)
    teraz przerwa - 178ms
    Stop:
    jak Start

    Spróbuj wygenerować ten kod i napisz, czy dało to efekt.

    Pozdrawiam

    Mariusz
  • #11 7018750
    iceCocoo
    Poziom 10  
    Wpisałem tak jak napisałeś i... działa!
    Co prawda, będę potrzebował jeszcze znaleźć komend pod ten pilot, ale to już żaden problem ;)

    Dziękuję bardzo :)
REKLAMA