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

[ATmega16][c/AVR] Nadajnik RC5 Problem z nadaniem ramki

mgiro 19 Mar 2010 11:48 1687 2
REKLAMA
  • #1 7851285
    mgiro
    Poziom 22  
    Witam,

    Chciałem zrobić nadajnik RC5. Chciałem sprawdzić na moim TV. Jako ramkę wysyłam polecenie wyłączenia TV. Niestety TV nie chce się wyłączyć. Problem chyba jest z częstotliwością.


    
    //ATmega 16    F_CPU = 16000000
    #include <avr/io.h>
    #include <avr/interrupt.h> 
    volatile uint16_t g_licznik = 0;
    
    ISR(TIMER1_COMPA_vect)
    {
    	g_licznik++;
    
    }
    void wait_modulacja(void)
    {
    	g_licznik = 0;
    	TCCR2 = (1<<WGM21) | (1<<COM20) | (1<<CS21) | (1<<CS20);//TCCR2 = (1<<COM20);
    	while(g_licznik<889) //889us
    	{
    		
    	}
    }
    void wait_bezmodulacji(void)
    {
    	g_licznik = 0;
    	TCCR2 = 0;//TCCR2 &= 0b11101111;//(1<<COM20);
    	while(g_licznik<889) //889us
    	{
    		
    	}
    }
    void wait(void)
    {
    	g_licznik = 0;
    	while(g_licznik<889) //889us
    	{
    	}
    }
    void zero(void)
    {
    	wait_modulacja();
    	wait_bezmodulacji();
    }
    void jeden(void)
    {
    	wait_bezmodulacji();
    	wait_modulacja();
    }
    int main(void)
    {
    	uint16_t i = 0;
    	DDRD = 0x80; // dioda IR podlaczona do PD7 OC2
    	OCR2 = 6; // f =35714,28571 zgodnie ze wzorem ze str 116 => 1+OCR2 = Fcpu/(2*N*Fszukana)
    	TCCR2 = (1<<WGM21) | (1<<COM20) | (1<<CS21) | (1<<CS20);//tryb CTC; TOOGLE OC2; preskaler 32
    
    	TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
        OCR1A = 1; // Ustawia wartość pożądaną na 1MHz(1us) dla preskalera 8
    	TCCR1B |= (1 << CS11); // Ustawia timer z preskalerem Fcpu/8
    
    	sei();
    
    	while(1)
    	{
    		//ramka = 11000000001100 => kod wylaczenia TV
    		jeden();
    		jeden();
    		zero();
    		zero();
    		zero();
    		zero();
    		zero();
    		zero();
    		zero();
    		zero();
    		jeden();
    		jeden();
    		zero();
    		zero();
    		for(i=0;i<1778;i++) // odczekanie 88,9 ms na transmisje kolejnej ramki
    		{
    			wait();
    		}
    		
    	}
    	
    }
    
    
    


    Wcześniej zrobiłem odbiornik dla RC5. Kody przycisków odczytuje prawidłowa np klawisz wyłącz to 0xc = 0b1100

    Jak mam ustawione w funkcji while na poczatku dwa zera, to dioda działa(widzialem przez aparat fotograficzny), gdy mam dwa zera na poczatku tak jak jest wyżej, dioda IR nie świeci :cry:
  • REKLAMA
  • #2 7851300
    Kabuto15
    Poziom 19  
    Jesteś pewny że Twój telewizor działa w RC5 ? Większość pilotów do telewizorów ma swoją własną specyfikację (co prawda podobną do RC5 lub RC6).
  • #3 7851374
    mgiro
    Poziom 22  
    Chcę na początek, aby mój odbiornik odczytał poprawnie kod polecenia. Dla pilotów Philipsa robi to poprawnie.

    Mój telewizor to Philips model:21pt1653
REKLAMA