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

Problem z kwarcem zegarkowym i obsługą przerwania

tomaszek1988 08 Lis 2010 20:12 1994 14
REKLAMA
  • #1 8719184
    tomaszek1988
    Poziom 11  
    Witam!

    Mam pewien problem, otóż napisałem funkcję obsługi przerwania od licznika T0 w atmega16 która wygląda następująco:

    	 SIGNAL (SIG_OVERFLOW0) 
    		{
    						
    			if(licznik==128) 
    				{
    				s++;
    				if(s==60)
    					{
    					s=0;
    					m++;
    					
    					}
    				if(m==60)
    					{
    					m=0;
    					h++;
    					}
    				if(h==24)
    					{
    					h=0;
    					}
    				licznik=0;
    				}
    				licznik++;
    				
    		} 
    


    Do wejścia TOSC1 oraz TOSC2 mam podłączony kwarc zegarkowy.
    Mój problem polega na tym że zegar działał poprawnie dopóki nie zacząłem zabawy z taktowaniem mikroprocesora zewnętrznym kwarcem. Od tamtej pory zegar działa 2 razy wolniej (a nie wydaje mi się żeby miało to coś wspólnego z częstotliwością taktowania uC). Sprawdzałem już na innym kwarcu 32,768 KHz i dalej to samo. Może jakieś sugestie? Dodam iż zmieniałem zarówno w pliku makefile jak i w programie wartość F_CPU ale nie przynosi to żadnych rezultatów.

    Z góry dziękuję za pomoc.
  • REKLAMA
  • #2 8720922
    MarsJan^
    Poziom 16  
    zdefiniuj F_CPU w kodzie programu i zobacz czy to coś zmieni. Możliwe że nie masz włączonego zewnętrznego oscylatora tylko pracujesz na wewnętrznym (włącza się go fusbitem)
  • REKLAMA
  • #3 8730611
    tomaszek1988
    Poziom 11  
    MarsJan^ napisał:
    zdefiniuj F_CPU w kodzie programu i zobacz czy to coś zmieni. Możliwe że nie masz włączonego zewnętrznego oscylatora tylko pracujesz na wewnętrznym (włącza się go fusbitem)


    Próbowałem definiować F_CPU również w kodzie programu, ale nie daje to pożądanych skutków, co do fusebitów to są poprawnie ustawione, ponieważ po odlutowaniu kwarcu układ przestaje działać. Zastanawia mnie czy może nie popełniłem gdzieś błędu przy ustawianiu obsługi przerwania:

     
     TCCR0=_BV(CS00);	       //zewnętrzny kwarc sterujący pracą licznika T0, bez preskalera
     TCCR0=_BV(CS01);
     TCCR0=_BV(CS02);
     TIMSK|=_BV(TOIE0);           //odblokowanie makski przerwania overflow T0 
     sei();                                // włącz obsługę przerwań
    
  • #4 8730835
    landy13
    Poziom 31  
    Przy takim zapisie do rejestru TCCR0 masz ustawiony tylko bit CS02. A to oznacza preskaler 256.
  • #5 8730849
    tomaszek1988
    Poziom 11  
    landy13 napisał:
    Przy takim zapisie do rejestru TCCR0 masz ustawiony tylko bit CS02. A to oznacza preskaler 256.


    Może mógłbyś mi doradzić jak to poprawnie rozwiązać żeby działało?
  • #6 8730977
    Andrzej__S
    Poziom 28  
    tomaszek1988 napisał:

    
     TCCR0=_BV(CS00);          //zewnętrzny kwarc sterujący pracą licznika T0, bez preskalera 
     TCCR0=_BV(CS01); 
     TCCR0=_BV(CS02);
    


    Jeśli rezonator masz podłączony pod XTAL1 i XTAL2, to musisz wybrać wewnętrzne źródło zegara, a nie zewnętrzne. Jak ma być bez preskalera, to pierwsza linijka wystarczy, następne dwie wyrzuć.

    Możesz też taktować procesor wewnętrznym oscylatorem RC lub zewnętrznym kwarcem o dowolnej (min. czterokrotnie większej od 32,768kHz) częstotliwości, a czas odmierzać timer'em 2 w trybie asynchronicznym (trzeba ustawić bit AS2 w ASSR), podłączając rezonator 32,768kHz pod TOSC1 i TOSC2.
  • #7 8730993
    tomaszek1988
    Poziom 11  
    Andrzej__S napisał:
    tomaszek1988 napisał:

    
     TCCR0=_BV(CS00);          //zewnętrzny kwarc sterujący pracą licznika T0, bez preskalera 
     TCCR0=_BV(CS01); 
     TCCR0=_BV(CS02);
    


    Jeśli rezonator masz podłączony pod XTAL1 i XTAL2, to musisz wybrać wewnętrzne źródło zegara, a nie zewnętrzne. Jak ma być bez preskalera, to pierwsza linijka wystarczy, następne dwie wyrzuć.

    Możesz też taktować procesor wewnętrznym oscylatorem RC lub zewnętrznym kwarcem o dowolnej częstotliwości, a czas odmierzać timer'em 2 w trybie asynchronicznym (trzeba ustawić bit AS2 w ASSR), podłączając rezonator pod TOSC1 i TOSC2.



    Hmm to widzę że chyba ja troszkę namieszałem. Chciałem to zrobić w taki sposób aby przerwanie od licznika T0 było wyzwalane kwarcem zegarkowym który mam podłączony do TOSC1 i TOSC2. Jak się do tego zabrać bo teraz już mi się troszkę pogubiłem?
  • REKLAMA
  • #8 8731038
    Andrzej__S
    Poziom 28  
    Cytat:

    Chciałem to zrobić w taki sposób aby przerwanie od licznika T0 było wyzwalane kwarcem zegarkowym który mam podłączony do TOSC1 i TOSC2.

    Niestety w trybie asynchronicznym (taktowanie zegarem z TOSC1 i TOSC2) może pracować tylko timer 2.

    Możesz podłączyć rezonator 32,768kHz pod XTAL1 i XTAL2 (odpowiednio ustawiając fusebity), ale wtedy cały procesor jest taktowany małą częstotliwością, więc niektóre funkcje mogą działać wolno.
  • REKLAMA
  • #9 8731176
    ZbeeGin
    Poziom 39  
    Andrzej__S napisał:
    Możesz podłączyć rezonator 32,768kHz pod XTAL1 i XTAL2 (odpowiednio ustawiając fusebity), ale wtedy cały procesor jest taktowany małą częstotliwością, więc niektóre funkcje mogą działać wolno.

    Procesor w fusach przełącza się na Int RC, a licznik rejestrowo na Async. Wtedy rdzeń procesora może być taktowany nawet 8MHz, a licznik 32kHz; co przy preskalerze 128 daje równe, 1 sekundowe okresy przerwań.

    Taktowanie procesora z 32kHz to nie jest dobry pomysł, zwłaszcza jak posiada się tylko programator ISP.
  • #10 8731215
    tomaszek1988
    Poziom 11  
    Cytat:
    Głupstwa wypisujesz. Procesor w fusach przełącza się na Int RC, a licznik rejestrowo na Async. Wtedy rdzeń procesora może być taktowany nawet 8MHz, a licznik 32kHz; co przy preskalerze 128 daje równe, 1 sekundowe okresy przerwań.


    Więc w jaki sposób powinienem ustawić rejestry oraz przerwanie od którego licznika wykorzystać, ponieważ chcę właśnie taki jednosekundowy czas osiągnąć?
  • #11 8731243
    ZbeeGin
    Poziom 39  
    Wszystko napisane.
    Procesor Internal RC Oscillator 1MHz. Pod XTAL1/2 podłączyć zegarkowy kwarc (żadnych kondensatorów!). Wykorzystać przewanie przepełnienia TIMER2. Ustawić bit AS2 i bity prescalera na fosc/128. I gotowe.
  • #12 8731254
    asembler
    Poziom 32  
    Poprawka zegarkowy po tosc1/2 gdyz nie w kazdym jest to rownoznaczne z xtial1/2
  • #14 8733678
    Andrzej__S
    Poziom 28  
    ZbeeGin napisał:

    Andrzej__S napisał:

    Możesz podłączyć rezonator 32,768kHz pod XTAL1 i XTAL2 (odpowiednio ustawiając fusebity), ale wtedy cały procesor jest taktowany małą częstotliwością, więc niektóre funkcje mogą działać wolno.


    Procesor w fusach przełącza się na Int RC, a licznik rejestrowo na Async. Wtedy rdzeń procesora może być taktowany nawet 8MHz, a licznik 32kHz; co przy preskalerze 128 daje równe, 1 sekundowe okresy przerwań.

    Taktowanie procesora z 32kHz to nie jest dobry pomysł, zwłaszcza jak posiada się tylko programator ISP.


    To była tylko jedna z opcji i z góry zaznaczyłem, że to nie najlepszy pomysł. Chociaż z drugiej strony nie wiem, dlaczego zaprogramowanie procesora z zewnętrznym zegarem 32,768kHz poprzez ISP miałoby być niemożliwe.

    Wcześniej zaproponowałem:
    Cytat:

    Możesz też taktować procesor wewnętrznym oscylatorem RC lub zewnętrznym kwarcem o dowolnej (min. czterokrotnie większej od 32,768kHz) częstotliwości, a czas odmierzać timer'em 2 w trybie asynchronicznym (trzeba ustawić bit AS2 w ASSR), podłączając rezonator 32,768kHz pod TOSC1 i TOSC2.

    Jak bardzo to się różni od propozycji ZbeeGin?

    ZbeeGin napisał:

    Procesor Internal RC Oscillator 1MHz. Pod XTAL1/2 podłączyć zegarkowy kwarc (żadnych kondensatorów!).

    No tak to się chyba nie da (autor wątku napisał w pierwszym poście, że używa ATmega16).
  • #15 8733701
    tomaszek1988
    Poziom 11  
    
     TCCR2=_BV(CS20)|_BV(CS22);		
     ASSR=_BV(AS2);
     TIMSK|=_BV(TOIE2); 
     
     sei(); 
    


    Problem rozwiązany. Kwarc 32,768 podłączony do pinów TOSC1 oraz TOSC2, powyższa konfiguracja rejestrów i wszystko ładnie działa z preskalerem 128.
REKLAMA