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

Jak zrealizować detekcję zbliżenia ręki z TSOP1736 na ATmega 8L?

kidzar89 03 Sie 2005 08:59 1800 3
REKLAMA
  • #1 1702260
    kidzar89
    Poziom 17  
    Posty: 289
    Pomógł: 2
    Ocena: 7
    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.
  • REKLAMA
  • #2 1702389
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    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
  • REKLAMA
  • #3 1703040
    kidzar89
    Poziom 17  
    Posty: 289
    Pomógł: 2
    Ocena: 7
    Zastanawiam się jak przerobić ten program aby LED zaczęła migać kiedy zbliżę rękę a zgasła gdy oddalę

    pozdr.

    #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
    #4 1703129
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    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...
    
    #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...
REKLAMA