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

Atmega8, kwarc zegarkowy, Timer0 multipleksuje tylko do 64..

Dr. Kuj 20 Gru 2010 16:58 2793 4
  • #1 8892559
    Dr. Kuj
    Poziom 13  
    Jak w temacie.

    Podłączyłem do atmegi kwarce 32768Hz, Ustawiony jest tylko fus CKOPT (dołącza wewnętrzne kondensatory do kwarcu), CKSEL nie ruszane (powinny być 1001 ale takie ich ustawienie zawiesza procka, jest więc wartość domyślna 0001 czyli wewnętrzny RC 1MHz).
    Program działa ale nie moge wyregulować timera tak żeby odmierzał sekunde. Postanowiłem multipleksować przez 256 (niestety nie da się przez 128 :( ) i w timerze odliczać 128 takich impulsów.
    Niestety licznik staje kiedy ustawie multiplekser na 256, przy 64 działa ale za szybko jak na moje potrzeby.

    TCCR0 = _BV(x<<CS00);
    
    dla x=1,2 działa, dla większych nie
    
    dla 1 - preskaler 8
         2 - 64
        3  - 256
       4 - 1024
    Czy ktoś wie dlaczego?
  • Pomocny post
    #2 8892686
    Andrzej__S
    Poziom 28  
    Cytat:

    
    TCCR0 = _BV(x<<CS00);
    


    Źle użyłeś makra _BV.
    _BV(x) jest równoznaczne z ( 1 << x ), czyli w Twoim przypadku próbujesz wykonać podwójnie przesunięcie bitowe.
    Jeżeli x = 3 (CS00=0):
    _BV(3<<CS00) = _BV(3) = (1<<3) = 0b00001000
    czyli TCCR0 będzie równe 0b00001000.
    Innymi słowy, próbujesz ustawić bit tylko do odczytu, zamiast ustawić bity odpowiedzialne za preskaler.
    Zamiast tego powinieneś to zapisać bez tego _BV:
    
    TCCR0 = (x<<CS00);
    


    Dodano po 1 [godziny] 26 [minuty]:

    Dr. Kuj napisał:

    Podłączyłem do atmegi kwarce 32768Hz, Ustawiony jest tylko fus CKOPT (dołącza wewnętrzne kondensatory do kwarcu), CKSEL nie ruszane (powinny być 1001 ale takie ich ustawienie zawiesza procka, jest więc wartość domyślna 0001 czyli wewnętrzny RC 1MHz).

    Szczerze mówiąc, nie za bardzo rozumiem. Gdzie podłączyłeś ten kwarc 32768Hz?
    Skoro go podłączyłeś, to dlaczego wybierasz wewnętrzny generator RC 1MHz?
    Jeśli chcesz użyć asynchronicznego taktowania, to dlaczego używasz timera 0 a nie timera 2? Tylko timer 2 może być taktowany (asynchronicznie) dodatkowym kwarcem, niezależnym od taktowania reszty procesora, podłączonym do pinów TOSC1 i TOSC2.
  • #3 8895438
    Dr. Kuj
    Poziom 13  
    te piny to te same do których podłącza się zewnętrzny kwarc.
    Pozatym jest możliwość taktowania "całości" kwarcem zegarkowym nie tylko asynchronicznie.
    I tak nie moge poprawnie przestawić fusów więc całość puszcze na 8MHz.

    Pozatym co do _BV() to masz racje. Dzięki. Nie wiem dlaczego ale wydawało mi się że x<<y podstawia liczbe x do y..
  • #4 8895673
    Andrzej__S
    Poziom 28  
    Dr. Kuj napisał:

    Pozatym jest możliwość taktowania "całości" kwarcem zegarkowym nie tylko asynchronicznie.

    Wcale nie twierdziłem, że nie ma takiej możliwości, tylko wtedy nie możesz ustawić fusebit'ów na wewnętrzny zegar, tylko na zewnętrzny niskiej częstotliwości. Niemniej taktowanie procesora taką częstotliwością znacznie ograniczy jego wydajność, chociaż z kolei ograniczy zdecydowanie pobór prądu. Wszystko zależy od tego, co chcesz z tego zbudować. Próba zastosowania zegarkowego kwarcu 32768Hz może sugerować, że potrzebujesz dużej precyzji odmierzania czasu, a jeśli oprócz tego oczekujesz większej wydajności, wtedy taktowanie asynchroniczne jest najlepszym rozwiązaniem. I w dodatku nie wymaga ustawiania fusebitów, wystarczy programowo ustawić bit AS2 w rejestrze ASSR. Nawet kwarc jest podłączony w tym samym miejscu. Oczywiście wtedy należy użyć do odmierzania czasu timera 2 (nie timera 0), a "resztę" procesora taktować wewnętrznym generatorem RC.
REKLAMA