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

ATMega8 – konfiguracja dwóch kwarców: osobny dla uC i osobny dla Timer2

Kubbaz 26 Paź 2007 15:19 1718 4
REKLAMA
  • REKLAMA
  • #2 4416875
    Pagodin
    Poziom 10  
    Posty: 48
    A po co ci 2 kwarce?
  • REKLAMA
  • #3 4416983
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    hmm... ok, chyba zaskoczyłem .... ze 117 strony dokumentacji ATMega8:
    Kiedy AS2 jest nie jest ustawiony (0), to Timer/Counter 2 is taktowany z I/O zegara. Kiedy AS2 jest ustawiony (1), to Timer/Counter 2 is taktowany z kwarcu połączonego do pinów TOSC.
    Tak czy inaczej, chce mieć możliwość precyzyjnego odliczania czasu - pojedyncze mikrosekundy - czyli tak jak czytałem w datasheecie - zrobić RTC na uC, jednakże nie mogę dojść ładu z tymi timerami - który najlepiej wybrać? Bo tak wpadłem na ten drugi, ponieważ było napisane że jest taktowany z oddzielnego źródła.....
    Co polecacie zrobić ??
  • REKLAMA
  • #4 4418953
    cyberdar
    Poziom 31  
    Posty: 1465
    Pomógł: 161
    Ocena: 73
    Witam

    Jeśli potrzebujesz krótkich czasów to wystarczy timer 8-mio bitowy do dłuższych czasów 16-to bitowy. Taktowanie masz z tego co sobie ustawisz jako źródło zegara w fusebitach. Może to być kwarc podpięty pod uC, zewnętrzny generator podpięty pod uC, wbudowany generator RC. Im mniejsze czasy tym lepiej używać wiekszych częstotliwości kwarcu i ewentualnie przerzucić się na timer 16-to bitowy. Jeśli jednak znasz czas jaki chcesz uzyskać na timerze z dobraniem - policzeniem odpowiedniego kwarcu nie ma przecież najmniejszego problemu.

    --
    pozdrawiam
  • #5 4419283
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    cyberdar napisał:
    Jeśli potrzebujesz krótkich czasów to wystarczy timer 8-mio bitowy do dłuższych czasów 16-to bitowy.

    No zgadza się - małe wartości można przechowywać na 8-bitach.
    cyberdar napisał:
    Taktowanie masz z tego co sobie ustawisz jako źródło zegara w fusebitach. Może to być kwarc podpięty pod uC, zewnętrzny generator podpięty pod uC, wbudowany generator RC. Im mniejsze czasy tym lepiej używać wiekszych częstotliwości kwarcu i ewentualnie przerzucić się na timer 16-to bitowy.

    OK, fakt odliczenie ilości cykli (przy danym kwarcu) wypadających na 1µs nie jest problemem, ale przecież funkcja overflow'a - SIGNAL bedzie coś miała swoje ciało np.
    
    #include<avr/io.h>
    #include<avr/interrupt.h>
    // F_CPU = 8MHz
    unsigned char cykl=0; 
    SIGNAL (SIG_OVERFLOW0)   // 8-bitowy timer 0
    {
         if(cykl++==7){PORTC=~PORTC;}; // po przepełnieniu do 7 zmienia stan portu C
         cykl=0;  // zeruje wartość zmiennej cykl i od nowa nalicza od 0 do 7
    }
    
    int main ()
    {
          DDRC=0xFF;   // port C jako wyjście + zewnętrzny pull-up
          PORTC=0x00; // początkowy stan niski
          for (;;){}
          return(0);
    }
    

    to przecież wystąpią dodatkowe opóźnienia z racji wykonania ciała funkcji czyli nasza 1µs nieco się rozrośnie a tego nie chcemy - można tego jakoś uniknąć ??
    Hmm... w sumie wpadłem na coś takiego, że jeśli wiadomo byłoby ile cykli zegarowych zajmuje uC-wi wykonanie if'a późniejsza zmiana stanu portu itd. to można by ustawić odpowiednio mniejszą wartość zmiennej cykl...?
REKLAMA