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

[C][atmega8] pomiar czasu między dwoma impulsami na INT0

esnow 23 Lis 2009 00:51 3664 5
REKLAMA
  • #1 7297070
    esnow
    Poziom 14  
    witam,
    jak zmierzyć czas między dwoma impulsami wchodzącymi na INT0 od odbiornika podczerwieni TSOP1736.

    czy włączenie timera poczekanie do nasepnego impulsu i cała procedura może odbyć się w
    
    ISR(SIG_INTERRUPT0)
    {
    }
    

    edit:
    napewno w kodzie musi się pojawić to:
    
    TCNT0 = 0;        // wartość początkowa T/C0
    TCCR0 |= (1<<CS01);  //preskaler 8
    TIMSK = _BV(TOIE0);  //wlaczenie przerwan T/C0
    sei();               //wlacz globalna obsluge przerwan
    

    czy trzeba dodać jeszcze jedno przerwanie od timera?

    cel programu:
    przerwanie na INTO - timer on
    następne przerwanie na INTO - timer off i przepisanie wyniku do pomocniczej zmiennej.
  • REKLAMA
  • REKLAMA
  • #3 7297455
    wilk125
    Poziom 23  
    skorzystaj z pinu ICP1 i Input Capture Timera1, w rejestrze ICR1 bedziesz mial zliczone impulsy miedzy kolejnymi impulsami na pinie ICP1, w obsłudze przerwania Input Capture dodaj zerowanie timera.

    Dodano po 16 [minuty]:

    A jak chcesz to zrobic na INT0 to

    
    char zmienna=0;
    int wartosc;
    ISR(EXT_INT0_vect) 
    { 
       if (zmienna==1)
        {
         cbi(TCCR1B,CS11);//wylacz timer1
         wartosc=TCNT1;
         TCNT1=0;//zeruj timer
          zmienna=0;
        }
        else
        {
         TCCR0 |= (1<<CS01); // właczenie zegara
         zmienna=1;
        }
    
    } 
  • REKLAMA
  • REKLAMA
  • #5 7299691
    esnow
    Poziom 14  
    wilk125:
    wkleiłem Twój kod, dopisałem 3 linijki ale w terminalu dostaje same zera.
    potrzebuje zmierzyć czas, bo nie mogę poradzić sobie z odbiorem RC5.
    pilot philips 100% RC5, bo w bascomie getrc5() dzialała znakomicie:
    
    char zmienna=0;
    int wartosc;
    //ISR(EXT_INT0_vect)
    //SIGNAL(SIG_INTERRUPT0)
    ISR(INT0_vect)
    {
       if (zmienna==1)
        {
    	 TCCR1B &= ~_BV(CS11); //wylacz timer1 
         wartosc=TCNT1;
    	 
    	 PORTC ^= _BV(5);  //zmiana stanu diody
    	 sprintf(bufor,"%d",wartosc);
    	 send_string(bufor);
    	 
    	 
         TCNT1=0;//zeruj timer
          zmienna=0;
        }
        else
        {
         TCCR0 |= (1<<CS01); // właczenie zegara
         zmienna=1;
        }
    } 
    



    było:
    
        else
        {
         TCCR0 |= (1<<CS01); // właczenie zegara
         zmienna=1;
        }
    

    a powinno być:
    
        else
        {
         TCCR1B |= (1<<CS11); // właczenie zegara
         zmienna=1;
        }
    


    jeszcze mam takie pytanie,
    jeśli kwarc zew. mam 8MHz i preskaler ustawiony jest na 8, to jeden takt timera1 w tym przypadku będzie odpowiadał 1us ?
  • Pomocny post
    #6 7301465
    wilk125
    Poziom 23  
    esnow napisał:
    wilk125:

    jeszcze mam takie pytanie,
    jeśli kwarc zew. mam 8MHz i preskaler ustawiony jest na 8, to jeden takt timera1 w tym przypadku będzie odpowiadał 1us ?


    Tak

    Tak powinno być TCCR1B, moja pomyłka

    Przy odczycie wartości z TCNT1, sróbuj najpierw odczytac TCNT1L(młodszy bajt TCNT1), i następnie TCNT1H (starszy bajt). Chociaż odczyt jak wyżej tez powinien działać

    Dodano po 5 [minuty]:

    zmienna zrób volatile
    
    volatile char zmienna=0;
REKLAMA