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

Odbiór podczerwieni, Atmega8, avr-gcc?

bogo88 22 Lis 2007 18:01 1752 3
  • #1 22 Lis 2007 18:01
    bogo88
    Poziom 10  

    Próbuje zrobić odbiornik kodu podczerwieni X sat. Opis tego standardu jest na stronie
    http://www.sbprojects.com/knowledge/ir/xsat.htm

    Napisałem program w avr-gcc, ale gdzieś jest błąd bo do portu cały czas podstawia tą samą wartość. Program testowałem w VMLAB-ie i wszystko symulowało ok. Dla sprawdzenia dałem zmiane stanu jednego wyprowadzenia na przeciwny przy zapisie zmiennej do portu wyjściowego i po nacisnięciu klawisza na pilocie dioda na tym porcie mruga, czyli przerwanie generuje się 8 razy.
    A może to wina sprzętu, bo po sprawdzeniu sygnału z odbiornika podczerwieni na oscyloskopie audio z karty dzwiękowej jest on bardzo zniekształcony. Trzeba zastosować jakieś dodatkowe elementy czy wystarczy wyjście odbiornika wpiąć prosto do wejścia przerwań?? Może to jakieś zakłócenia albo drgania generują przerwania między kolejnymi bitami???
    Aha, w programie sygnał podczerwieni podany jest na oba wejścia przerwań INT1 i INT2. Mikrokontroler to Atmega8 z kwarcem 8MHz.

    Może ktoś wie w czym tkwi błąd??? Nie zajmuje się długo mikrokontrolerami, ale wydaje mi się że program jest napisany dobrze.

    Code:
    #include <avr/io.h>
    
    #include <avr/interrupt.h>
    #include <avr/signal.h>

    #define tau 130;

    unsigned char bit,wyjscie,licznik;



    void czekaj(unsigned long pt)
    {
    #define tau2 10.38    //czas w ms
    unsigned char tp1;

    for(;pt>0;pt--)
       {
       for(tp1=255;tp1!=0;tp1--);
       }
    }

    SIGNAL(SIG_INTERRUPT0)
       {
       cbi(GICR,INT0);
       TCNT0=tau;
       TCCR0=5;
       
       
       while(bit_is_clear(TIFR,TOV0));
       sbi(TIFR,TOV0);
       TCCR0=0;
       bit=0;
       wyjscie=0;
       GIFR=0xff;
       sbi(GICR,INT1);
       }
       
    SIGNAL(SIG_INTERRUPT1)
          {
          licznik=TCNT0;
          TCNT0=0x00;
          TCCR0=4;
          
          if(bit>0)
                {
                if(licznik<45)
                   {
                   wyjscie++;
                   }
             
                wyjscie=(wyjscie*2);   
                }
          bit++;
          if(bit==8)
          {
          cbi(GICR,INT1);
          TCCR0=0;
          PORTC=~wyjscie;
          PORTB^=0x01;
          czekaj(5*tau2);
          GIFR=0xff;
          sbi(GICR,INT0);
          }
          }
          
    void init(void)
    {
       cbi(DDRD,PD2);
       cbi(DDRD,PD3);
       sbi(PORTD,PD2);
       sbi(PORTD,PD3);
       DDRC=0xFF;
       sbi(MCUCR,ISC01);
       sbi(MCUCR,ISC11);
       sbi(MCUCR,ISC10);
       sbi(GICR,INT0);
       DDRB=0x03;

    }

    int main(void)
    {
    init();
    sei();
    while(1)
    {

    czekaj(100*tau2);
    }
    }


    Acha, wytłumacze program, podczas wejścia w pierwsze przerwanie program czeka zanim przeleci adres a potem za pomocą drugiego przerwania odczytuje 8 razy po kolei czas na liczniku i w zależności od jego trwania wpisuje 1 lub 0 do zmiennej WYJSCIE i przesuwa w lewo bity. Gdy 8 razy wejdzie w przerwanie zapisuje stan zmiennej do PORTC.

    0 3
  • #2 22 Lis 2007 22:45
    migod
    Poziom 21  

    A jakiś schemat? Odbiornik podczerwieni wymaga modulacji (typowo 36-40kHz). Czego dokładnie użyłeś do odbioru sygnału?

    0
  • #3 23 Lis 2007 14:28
    bogo88
    Poziom 10  

    Do odbioru użyłem scalonego odbiornika podczerwieni TSOP.1736 i wyjście sygnału z niego podałem prosto na wejścia przerwań Atmegi8. A do portu wyjściowego tylko diody.
    Czy to wystarczy czy trzeba jakieś dodatkowe elementy przy odbiorniku??
    Nie mam pojęcia co może być źle, w symulatorze wszystko działa...

    0
  • #4 23 Lis 2007 17:18
    migod
    Poziom 21  

    Cytat ze wskazanej stronki.. czyli problem wynika z niewłaściwego odbiornika TSOP. Poszukaj wersji 1738 lub zamiennika (SFH..). Nie wiem też, po co użyte są oba przerwania, ale skoro na emulatorze chciało działać, to Ok. Zacznij od podmiany odbiornika.

    Code:

    The X-Sat protocol uses pulse distance encoding of the bits. Each pulse is a 526µs long [b]38kHz[/b] carrier burst (about 20 cycles). A logical "1" takes 2.0ms to transmit, while a logical "0" is only 1.0ms. The recommended carrier duty cycle is 1/4 or 1/3.

    0