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.

Podczerwień, C i ATmega 8L

03 Sie 2005 08:59 1650 3
  • Poziom 17  
    Witam.

    Jestem początkującym i umiem już kontrolować LED (mruganie, gaszenie, itp.) Mam pod ręką odbiornik TSOP1736 (Out do PB2), diodę Ir podłączoną do PB3 i chciałbym aby po zbliżeniu ręki i po odbiciu podczerwieni dioda świeciła się a jak oddalę rękę, żeby zgasła.
    I teraz mam problem, jak się za to zabrać ? może jakiś przykład ?
    bo z tej strony cos nie bardzo chcą chodzić te przykłady. http://www.patron.net.pl/AVRintropl.htm#_Toc91331573
    Mam ATmega 8L i WinAVR.

    pozdr.
  • Poziom 39  
    kidzar89 napisał:
    Witam.

    Jestem początkującym i umiem już kontrolować LED (mruganie, gaszenie, itp.) Mam pod ręką odbiornik TSOP1736 (Out do PB2), diodę Ir podłączoną do PB3 i chciałbym aby po zbliżeniu ręki i po odbiciu podczerwieni dioda świeciła się a jak oddalę rękę, żeby zgasła.
    I teraz mam problem, jak się za to zabrać ? może jakiś przykład ?
    ...
    pozdr.


    Aby odbiornik TSOP reagował na podczerwień wytwarzaną przez diodę IR, to ta dioda musi wysyłać światło zmodulowane częstotliwoścą 36kHz, czyli mówiąc najprościej należy ją włączyć i wyłączyć 36000 w ciągu sekundy.Jak to zrobić :?: Zerknij może : https://www.elektroda.pl/rtvforum/topic335889.html
    Wprawdzie przykłady są w Bascomie , ale może z treści postów "wyłuskasz" coś dla siebie.
    Napisz z jakim zegarem pracuje Twoja Mega.

    Pozdrawiam
    Piotrek
  • Poziom 17  
    Zastanawiam się jak przerobić ten program aby LED zaczęła migać kiedy zbliżę rękę a zgasła gdy oddalę

    pozdr.

    Code:
    #include <avr/io.h>
    

    /******************************************************

                               Definicje stałych

    *******************************************************/

    #define F_CPU        1000000                                       /* 1MHz zegar procesora */

    #define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */

    /**************************************************************

                                                  Koniec definicji stałych

    **************************************************************/

     

    //definiujemy stany portu sterującego diodą LED

    #define LED_ON sbi(DDRB,PB1);sbi(PORTB,PB1)

    #define LED_OFF sbi(DDRB,PB1);cbi(PORTB,PB1)

    // Piszemy procedury opóźnienia czasowego

    void delay(unsigned int us)

    {

        unsigned int delay_loops;

        register unsigned int  i;

        delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)

        for (i=0; i < delay_loops; i++) {};

    }

    void delayms(unsigned int ms)

    {

                unsigned int i;

                for (i=0;i<ms;i++)

                            {

                            delay(999);

                            asm volatile (

                            "WDR"::);

                                                   }

    }

    int main (void)

    {

           for (;;) 

                      {

                            LED_ON;

                            delayms(1000);

                            LED_OFF;

                            delayms(1000);

                      }

     

        return (0);     

    }
  • Pomocny post
    Poziom 30  
    Witam...

    Generalnie rzecz biorąc procedury opóźnienia czasowego nie nadają się do modulowania diody IR...
    Częstotliwość nie jest zbyt stabilna to raz...
    Dwa nie uzyskasz 36kHz musisz skorzystać z dobrodziejstw timera...

    Np. tak...
    Code:

    #include<avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <inttypes.h>


    int main(void)
    {
     sbi(DDRC,2);
     sbi(PORTC,2);
     
     TCNT0 = 34; //wartość początkowa dla timer0
     TCCR0 = (1 << CS00);   //| (1 << CS00); // 0b00000111; prescaler na 1
     TIMSK |= (1 << TOIE0);  // aktywne przerwanie overflow

     for(;;);

     return(0):
    }

     SIGNAL (SIG_OVERFLOW0)
     {
      TCNT0 = 34;
      PORTC ^= (1 << PC2);
     }


    To dotyczy oczywiście samej modulacji 36kHz...
    Co do reszty to już wykombinujesz...


    Aha zapomniałem napisać, że te parametry są słuszne tylko przy zegarze 8MHz...