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

ustawienie rejestrow w timerze 1

qudi 04 Kwi 2010 14:58 1776 15
  • #1 7919481
    qudi
    Poziom 15  
    Witam !!! Jak ustawić w timerze1 fakt ze będzie on taktowany zewnętrznym kwarcem ?
  • #3 7919560
    qudi
    Poziom 15  
    może zacznę jeszcze raz... otóż chce dołączyć kwarc 14,745 MHz do timera1, ale nie w jakimś zboczu opadającym/ rosnącym bo nie za bardzo to kumam... chce mieć po prostu taktowanie 14,745 MHz ale na timerze 1 czy jest to możliwe... i jak mam podłączyć kwarc ? (obiema koncówkami ?)
  • #4 7919742
    archanoid
    Poziom 26  
    Witam. Rezonator kwarcowy podłączasz pod końcówki XTAL1 XTAL2 natomiast sygnał jakim będzie taktowany timer 1 wybierasz za pomocą odpowiednich bitów w odpowiednim rejestrze.
  • #5 7920188
    Konto nie istnieje
    Poziom 1  
  • #6 7921011
    qudi
    Poziom 15  
    nie o to mi chodzi, chce ustawić taktowanie zegara uC na 14,745 MHz. Potem chce po prostu skorzystać najzwyklej w świecie z timera1 (16-bitowego), mój problem polega na tym, że teraz mikroprocesor będzie taktowany zegarem zewnętrznym, tak ? Więc nie wiem do końca jak z konfigurować timer 1 ? Trzeba to ustawić gdzieś w jakimś rejestrze ? powoli gubię się w tym, zaznaczam, że jestem początkujący tzw. świeżak jeśli chodzi o AVR

    Pozdrawiam
  • #7 7921033
    mirekk36
    Poziom 42  
    qudi napisał:
    nie o to mi chodzi, chce ustawić taktowanie zegara uC na 14,745 MHz. Potem chce po prostu skorzystać najzwyklej w świecie z timera1 (16-bitowego),....


    O to ci chodzi o to właśnie, tylko jak sam mówisz miesza ci sie wszystko jak w kalejdoskopie. Zatem naucz się czytać notę PDF. Mówiąc żebyś się nauczył czytać PDF nie chcę cię zbyć.

    Każdy moduł jest ładnie w nocie opisany, każdemu poświęcony jest osobny rozdział w głównym spisie treści. Odszukaj więc w tym głównym spisie treści rozdział n/t Timera1, a następnie kliknij w ostatni podrozdział mówiący ładnie i po kolei o rejestrach konfiguracyjnych tegoż Timera1. Każdy rozdział o rejestrach timera zaczyna się od pierwszego najważniejszego rejestru konfiguracyjnego o nazwie TCCRx . Tu będziesz miał właśnie TCCR1 a w nim ładnie i po kolei opisane bity.

    Więc już wiesz gdzie szukać, a z PDF'a dowiesz się jak je ustawić żeby zrobić to co planujesz.
  • #8 7921034
    BoskiDialer
    Poziom 34  
    Jeśli podłączysz zewnętrzny kwarc, musisz zmienić fusebity, dzięki czemu uC będzie chodził z tego kwarcu - to będzie główne źródło taktowania. Dalej po prostu wybierasz prescaler /1: timer1 zawsze pracuje w oparciu o to samo źródło co rdzeń (z wyjątkiem gdy zlicza impulsy z wejścia IC1) więc nie występuje problem wyboru źródła. Wybranie prescalera /1 to nic innego jak wpisanie wartości (1<<CS10) do TCCR1B (brak wskazania konkretnego uC, więc oparłem się o dokumentację do m8).
    Źródło można zmienić w przypadku timera z możliwością pracy asynchronicznej, jednak timer1 do takich nie należy - zawsze jest taktowany synchronicznie tym co rdzeń, co najwyżej po podzieleniu przez prescaler.
  • #9 7921093
    qudi
    Poziom 15  
    a więc dam sobie przypuśćmy preskaler/1. Myślałem, że muszę ustawiać bity CS1...tak by ustawiać jakieś zewnętrzne zegary z jakimiś zboczami. Najgorsze jest to że robię wszystko tak jak mówisz i mi to nie działa. Na próbę odpalam sobie diody i one tak albo dziwnie nie równo migają lub w ogóle nie tak jak ustawiam, przypuśćmy daje żeby ICR1=28798 z preskalerem 256 powinno dać 1 hz, a dioda zamiast migać 1 na sec to mruga jak szalona i nierówno. Fuse bity ustawiłem tak
    CE C9 lub CE 99. Może jest to spowodowane tym, że u mnie nowa wartość zadana jest odczytywana w ICR1 bo ty coś piszesz o tym ale nie bardzo kumam gdzie leży błąd, pomocy.


    Odnośnie kolegi który myśli że nie umiem czytać, otóż umiem !
  • #10 7921407
    mirekk36
    Poziom 42  
    qudi napisał:
    Odnośnie kolegi który myśli że nie umiem czytać, otóż umiem !

    Wykrzykniki odłóż na półkę i zachowaj dla siebie. Albo chcesz się czegoś dowiedzieć na forum albo jeśli sam lepiej wiesz to po co pytasz?


    qudi napisał:
    a więc dam sobie przypuśćmy preskaler/1. Myślałem, że muszę ustawiać bity CS1...tak by ustawiać jakieś zewnętrzne zegary z jakimiś zboczami.


    Z tego co tu wypisujesz o tych zboczach przy ustawianiu bitów CSxx Timera1 to widać, że jednak nie potrafisz czytać not PDF , więc nie ma co się stroszyć jak jeżozwierz. Nie każdy od razu wszystko załapał na początku.

    Myli ci się wszystko przez to, że ty cały czas nie możesz zaskoczyć, że te dwie ostatnie opcje z ustawianiem zbocz za pomocą bitów CSxx odnoszą się nie do żadnego kwarca czy oscylatora, którym taktujesz Timer1 tylko do wejścia T1 procesora. Ono nie służy do podłączania żadnego kwarca bezpośrednio ani generatora. Tzn generator TTL można podłączać ale nie po to żeby sobie pomigać diodami LED. Wejście T1 wykorzystuje się do całkiem innych celów i to zostaw sobie na dalszą część nauki o prockach.

    A teraz zrozum, że ciebie interesuje tylko ustawianie preskalera/dzielnika od 1 do 1024. To za jego pomocą dzielisz taktowanie procka, które pochodzi albo z kwarca podłączonego do nóżek XTAL1 oraz XTAL2 lub z wewn oscylatora czy z zewn generatora podłączanego tylko do XTAL1. I to tę częstotliwość dzielisz preskalerem.

    A kto cię tam wie czy ty dobrze w ogóle fusebity poustawiałeś, bo z tych opisów twoich to ciężko się domyśleć. Może więc cały czas masz procka taktowanego 1MHz z wewn. oscylatora bo źle te fusy przestawiłeś.

    Pokaż ty lepiej w końcu jakiś schemacik tego co płodzisz do testów to szybciej da radę ci coś konkretnego podpowiedzieć.
  • #11 7921529
    BoskiDialer
    Poziom 34  
    Nie rozumiem który bajt jest wpisany do hfuse a który do lfuse, najprawdopodobniej C9 do hfuse, jednak kwarc według noty to "Crystal Oscillator", nie "Ceramic resonator" więc reszta jest źle. Dla zewnętrznego kwarcu (reszta fusebitów domyślnie) dajesz hfuse=0xC9 lfuse=0x1F (zewnętrzny kwarc, BOD na 4V, cały czas zakładam m8, chyba się nie pomyliłem z wartościami).

    Timer po wybraniu źródła pracuje praktycznie sam dla siebie, można co najwyżej odczytać jego wartość z TCNT1 przez program. Aby timer zaczął generować sygnał na jakimś wyjściu (OC1A lub OC1B) należy w timerze ustawić trochę więcej niż samo źródło: zmienić tryb pracy (bity WGM1x), ustawić wartość maksymalną timera (odpowiedni rejestr, znajduje się w kolumnie TOP w tabelce z WGM1x), ustalić tryb pracy wyjścia OC1A lub OC1B (bity COM1Ax/COM1Bx, przy czym znaczenie tych bitów jest inne w różnych trybach), wpisać odpowiednie wartości do OCR1A/OCR1B, ustawić w DDR, aby odpowiedni pin był wyjściem i można załączyć timer. Wszystkie informacje o każdym bicie są rozpisane w dokumentacji.
  • #12 7921768
    qudi
    Poziom 15  
    Witam !!!
    
    ISR(TIMER1_COMPA_vect)        	// przerwanie dla porownania
    {
    
    PORTC ^= 0x01;			  		// zapalic/zgasic diode
    ICR1=28798;
    }
    
    
    int main(void) {
    
    DDRC |= 0x01;
    
    // INICJALIZACJA LICZNIKA 1
    
    TCNT1 = 0x0000;					  		// wartosc poczatkowa
    	
    TCCR1A = 0x0000;				  		// OC1A/OC1B odlaczone
    										// zwykly tryb pracy
    //TCCR1A |= (1 << COM1A0); 
    
    TCCR1B |= ((1 << WGM12)|(1 << WGM13));  // Ustawia timer w tryb CTC
    
    TCCR1B |= (1 << CS12);
    
    TIMSK |= ((1<<TOIE1)|(1<<OCIE1A));   	// wlaczenie przerwan od przepelnienia
    
    						  			 	// i porownania licznika T1
    								
    sei();							        // zezwolenie na przerwania
    
    while(1){}
    
    return(0);
    }
    


    z moich obliczeń wynika, że dioda powinna mrugać raz na sec(ICR1=28798), programuje na atmega32(przepraszam że nie napisałem wcześniej) fusy mam takie
    low CE
    high C9

    LUB

    low CE
    high 99
    To mruganie diody traktuje sobie jedynie jako sprawdzenie czy dobrze działa to wszystko na kwarcu. Po prostu taka zabawa, jednak potem będę potrzebował jego bardziej. I taki problem mnie rozwala już na początku, ciągle siedzę nad notą
    ale z pewnością wiele rzeczy do mnie nie dociera, proszę o pomoc
  • #13 7922313
    mirekk36
    Poziom 42  
    int main(void) 
    { 
    
        DDRC |= (1<<PC0);  // kierunek pinu PC0 - WYJŚCIE
    
        // INICJALIZACJA Timer1 w trybie CTC 
        TCCR1B |= (1 << WGM12);  // Ustawia timer w tryb CTC - mode 4
        TCCR1B |= (1 << CS12);     // preskaler=256
        OCR1A = 31250;
        TIMSK |= (1<<OCIE1A);      // wlaczenie przerwan CompareMatch
    
        sei();                             // zezwolenie na przerwania 
    
        while(1);
    } 
    
    
    // procedura obsługi przerwania 
    ISR(TIMER1_COMPA_vect)           // przerwanie dla porownania 
    { 
        PORTC ^= (1<<PC0);                 // zapalic/zgasic diode 
    }


    Skorzystaj z mode 4 dla trybu CTC. wtedy wartość w OCR1A ustawiasz tylko raz przy inicjalizacji. Zatem jeśli masz taktowanie 8MHz to ustawiasz preskaler na 256 potem dokonujesz podziału przez 31250 za pomocą OCR1A i masz przerwanie co 1 sekundę. A ty u siebie nie wiedzieć po co jeszcze ustawiałeś w TIMSK także przerwanie od przepełnienia nie wpisując nawet ciała procdury. Więc następowało resetowanie procka. Albo korzystasz z jednego albo z drugiego.
  • #14 7922385
    qudi
    Poziom 15  
    Pisałem że mam zewnętrzny kwarc, na wewnętrznym zegarze wszystko mi działa jak należy... być może naprawdę problem leży w fusach, już sam nie wiem, po zastosowaniu się do twoich rad dzieje się również to samo... dioda miga nierówno raz co sekundę raz wolno raz szybko... o co chodzi... ? i gdzie leży błąd

    Dodano po 23 [minuty]:

    Myślę, że chodzi pewnie o te fuse bity, ale nie potrafię się z tym uporać...

    Dodano po 38 [minuty]:

    na razie dałem takie fusy
    low 7F
    high 48

    i wydaje się działać... ale jak ktoś ma jeszcze jakieś sugestie to chętnie posłucham... wszystkim chciałem podziękować za pomoc

    Dodano po 1 [godziny] 14 [minuty]:

    
    ISR(TIMER1_COMPA_vect)        	// przerwanie dla porownania
    {
    PORTC ^= 0x01;			  		// zapalic/zgasic diode
    OCR1A=1440;
    //OCR1A=14745000/(512*(0.0185*ADC + 0.9814));
    }
    
    int main(void) {
    
    DDRC |= 0x01;
    
    // INICJALIZACJA PRZETWORNIKA 
    
    ADMUX = (1<<REFS0);
    ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE);
    
    // INICJALIZACJA LICZNIKA 1
    
    TCNT1 = 0x0000;					  		// wartosc poczatkowa
    	
    TCCR1A = 0x0000;				  		// OC1A/OC1B odlaczone
    TCCR1B |= (1 << WGM12);
    
    TCCR1B |= (1 << CS12);
    
    TIMSK |=(1<<OCIE1A);						  			 	// i porownania licznika T1
    								
    sei();							        // zezwolenie na przerwania
    
    while(1){}
    
    return(0);
    }
    


    Mam teraz problem trochę inny, chodzi o to że jeśli chce sterować wartością OCR1A,
    
    OCR1A=14745000/(512*(0.0185*ADC + 0.9814)); 
    

    to niestety to nie działa jak należy, dioda miga jak szalona bez wzgledu na wartość ADC. Jeśli natomiast ustawię OCR1A twardo tj. OCR1A=1440, TO dioda miga jak należy... w czym tkwi problem z tym przetwornikiem... ???
  • #15 7923299
    Konto nie istnieje
    Poziom 1  
  • #16 7923301
    qudi
    Poziom 15  
    czy problem tkwi w ustawieniu przetwornika...

    Dodano po 1 [minuty]:

    czemu bezsens takich obliczeń ??? nie rozumiem ??? mógłbyś bardziej objaśnić jak ustawić poprawnie ten przetwornik ?

    Dodano po 2 [minuty]:

    jak robiłem na wewnętrznym zegarze takie coś to działało... kurde, dlatego zasugerowany tym że jest okey robię tak dalej, jak go poprawnie ustawić ???

    Dodano po 7 [minuty]:

    aha jeszcze jedno zawsze przy starcie zauważyłem ze na przetworniku jest górna wartość tzn. ADC=1023 (tak mi się zdaje na 95 %) co ciekawsze nawet jeśli położenie potencjometra nie powinno na taką wartość pozwolić. Potem ADC jest nieczule na jakiekolwiek zmiany.

    Dodano po 16 [minuty]:

    mam również program, który w przerwaniu korzysta z ADC i nie mam żadnych problemów(program działa na wew zegarze) więc może ten problem znowu jest spowodowany takim a nie innym ustawieniem fuse bitów ??? prosze o pomoc jeśli ktoś cokolwiek wie na ten temat...
REKLAMA