Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

IR SFH5..-36. Odkodowanie RC5 na detektorze. Pilot philipsa z wieży.

05 Gru 2006 00:13 914 1
  • Poziom 17  
    Witam.
    Chcailbym sie pochawalic kodem zrodlowym a zarazem prosic o pomoc ...niby banalne ale nie chce dzialac. Chodzi o odkodowanie RC5 na tym detektorze. Uzywam pilota philipsa z wiezy. Nawet dzis badalem przebieg na oscyloskopie z detektora...wszytko gra tak jak w przykladach ksiazkowych. Np odkodowalem przycisk "stop" i to ze jest to przycisk do obslugi CD co by sie zgadzalo.
    Moze wy mi pomozecie rozwiazac problem...

    plik RC5.C

    #include <project.h>

    #ifdef rc5_h

    void initRC(void)
    {
    time(2188); //pominiecie AGC,AGC,CHK,
    // DDRD &= ~_BV(PD3);
    DDRA |= 0xff;


    for(a=0;a<11;)
    if(bit_is_set(PIND,PD3)) //pominiecie 5 bitow adresu
    {
    dane[a] = 1;
    a++;
    // time(588);
    time(795);
    PORTA ^= _BV(PA6);
    }
    else
    {
    dane[a] = 0;
    a++;
    //time(588);
    time(795);
    PORTA ^= _BV(PA7);
    }

    for(a = 0;a<11;)
    {
    fprintf_P(&UART,PSTR("dane= %ul %ul\r\n"),dane[a],a);
    a++;
    }
    // int1_ON();

    }
    #endif



    plik Timer1.C


    //-------------------------------------------------------------------------------
    // funkcja konfigurujaca licznik // czas rzeczywisty w us! //
    //-------------------------------------------------------------------------------

    void time(volatile unsigned int czas)
    {

    TCCR1A |= ( _BV(COM1A0)| _BV(COM1A1)); //set OC1A on compare
    TCCR1B |= _BV(WGM12); //Mode 4 - CTC
    OCR1A = czas;
    TIFR = TIFR ; // skasuj wszystkie flagi
    TCCR1B |= _BV(CS11); //rozpoczecie zliczanie prescale=8
    while(bit_is_clear(TIFR,OCF1A)); //czekaj na ustawienie OCF1A
    TCCR1B = 0x00;

    DDRA |= _BV(PA4);
    PORTA &= ~_BV(PA4);

    }
    //-----------------------------------------------------------------------------
    // timer wraz z przerwaniem // 4.752ms => OCR1A = 2188.7216 preskaler = 8
    // // 1.28ms => OCR1A = 588.824 preskaler = 8
    //-----------------------------------------------------------------------------


    plik INT1.C


    #include <project.h>

    #ifdef int1_h

    ISR(INT1_vect)
    {
    PORTA &= ~_BV(PA2);
    GICR = 0; //wylaczneie przerwania INT
    initRC();
    }

    //--------------------------------------------------------------------------
    void int1_ON(void)
    {
    MCUCSR |= _BV(ISC11); //przerwanie wlacza opadajace zbocze na (PD3)
    GICR |= _BV(INT1); //uaktywnienie przerwania INT1
    GIFR |= _BV(INTF1); //uaktywnienie flagi przerwania INT1

    }
    #endif


    plik rs.C


    #include <project.h>
    #ifdef UARTRS232_H
    FILE UART=FDEV_SETUP_STREAM(zapisz_znak,NULL,_FDEV_SETUP_WRITE);
    //deklaracja nazwy pliku ktora jest skojarzina ze standardowym wyjsciem i wykorzystuje
    //funkcje wyswietlania.
    //----------------------------------------------------------------------------
    void USART_init(unsigned int x)
    {
    UBRRH = (x>>8); //ustawienie predkosci transmisji
    UBRRL = x;

    UCSRB = _BV(RXEN) | _BV(TXEN); //wlaczenie portu transmisji i odbioru

    UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); //1-bit stopu + 8bit na znak

    }
    //-----------------------------------------------------------------------------
    void USART_transm(unsigned int x)
    {
    while(!(UCSRA & _BV(UDRE))); //gdy bit UDRE == 1 czyli mozna dokonac
    //zapisu bo bufor jest pusty
    UDR = x; //wpisuje dane do bufora
    }
    //-----------------------------------------------------------------------------
    unsigned int USART_odbior(void)
    {
    while(!(UCSRA & _BV(RXC)))
    // idle_proces(); //gdy bit RXC != 0 czyli w buforze
    //sa dane ktore nadal odbieramy dokonac
    return UDR; //wpisuje dane do bufora
    }
    //-----------------------------------------------------------------------------
    int zapisz_znak(char c, FILE *stream)
    {
    while(!(UCSRA & _BV(UDRE))); //gdy bit UDRE == 1 czyli mozna dokonac
    //zapisu bo bufor jest pusty
    UDR = c;

    return 0;
    }
    #endif


    plik main.C


    #include <project.h>


    int main (void)
    {

    #ifdef int1_h
    DDRD &= ~_BV(PD3);
    int1_ON();
    #endif

    #ifdef UARTRS232_H
    stdout = stdin = &UART; //standardowe wyjscie i standardowe wejscie
    //kojarzone z plikiem UART
    USART_init(myUBRR); //inicjacja UARTa

    #endif

    fprintf_P(&UART,PSTR("HELLO\r\n"));

    sei();

    do
    {
    PORTA ^= _BV(PA1);
    }
    while(1);
    return 0;
    }




    Dodam ze wszytko sie kompiluje i progrma niby dziala lecz jak wysiwtlam na terminalu RS232 wartosci odkodowanych bitow to sa to same zera i nie kumam co moze byc zle .. wydaje mi sie ze algorytm jest ok...moze sami ocencie.
    Z gory dziekuje za poswiecony czas