ustawienie timera w PIC18F1320

Dec 27, 2005 6 Replies

Witam. Mam problem z ustawieniem timera0 w tym mikrokontrolerze. Chcialem by generowal on przerwania co ok. 400us a obserwowane na oscyloskopie ok. 10ms. Mikrokontroler pracuje z oscylatorem wewnetrznym "INT RC-CLKOUT on RA6, Port on RA7". Tak jest ten tryb sygnalizowany w MPLAB. Przy ustawieniu drugiego trybu wewnetrznego generuje on podobnie. Pisze program na niego w jezyku C dla studenckiej wersji kompilatora C18. Ustawienia rejestrow konfiguracyjnych oscylatora: OSCCONbits.IRCF0=0; OSCCONbits.IRCF1=1; OSCCONbits.IRCF2=1; Ustawienia rejestrow Timer0: T0CONbits.T0PS0=0; T0CONbits.T0PS1=0; T0CONbits.T0PS2=0; T0CONbits.PSA=1; T0CONbits.T016BIT=0; T0CONbits.T0SE=0; T0CONbits.T0CS=0; T0CONbits.TMR0ON=1; I rejestr przerwan: INTCONbits.T0IF = 0; INTCONbits.T0IE = 1; INTCONbits.GIE = 1;



Na poczatku przerwania od T0 TMR0L -= 0x85; // reload INTCONbits.T0IF = 0;



I na koniec przerwania uruchamiam je na nowo: INTCONbits.GIE = 1;



Mimo moich staran niestety przerwania timera sa regularnie co 10ms. Prosze o pomoc.



Jacek M.


Bardzo prosze o pomoc bo gapie sie w ta dokumentacje mikrokontrolera i nie moge znalezc gdzie popelniam blad.

Jacek M.

Zauwazylem ciekawa rzecz. Uzywam do uruchamiania swoich programow debbugera ICD2. W trakcie zatrzymywania programu a nastepnie ponownego jego uruchamiania zmienia mi sie czestotliwosc przebiegu na pinie wystawianego przez to przerwanie. W trakcie zaistnienia przerwania wystawiam na pin 1 a przy nastepnym przerwaniu 0. Co prawda mam do dyspozycji prosty oscyloskop i nie moge do konca byc go pewnym ale teraz juz nie wiem z jakiego powodu tak jest. Czasem nawet TIMER0 pracuje z zadana czestotliwoscia. Czy spotkal sie ktos z takim zjawiskiem?

Jacek M.

U¿ytkownik "Jacek M." snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:dor1sc$lfv$ snipped-for-privacy@news.onet.pl...

Witam

ustawienia dla 400us powinny byc nastepujace :

konfiguracyjnych oscylatora: OSCCONbits.IRCF0=0; OSCCONbits.IRCF1=1; OSCCONbits.IRCF2=1; Ustawienia rejestrow Timer0: T0CONbits.T0PS0=0; T0CONbits.T0PS1=0; T0CONbits.T0PS2=0; T0CONbits.PSA=0; (!!!) T0CONbits.T08BIT=1; (!!!) T0CONbits.T0SE=0; T0CONbits.T0CS=0; T0CONbits.TMR0ON=1; I rejestr przerwan: INTCONbits.T0IF = 0; INTCONbits.T0IE = 1; INTCONbits.GIE = 1;

Na KONCU !!! przerwania od T0 TMR0L -= 0xC8; // reload INTCONbits.T0IF = 0;

I na koniec przerwania uruchamiam je na nowo: INTCONbits.GIE = 1;

powinno teraz chodzic.. pewne watpliwosci w sformuowaniu przez Pana problemu pojawily mi sie przy okazji bitu T0CONbits.T016BIT, Faktycznie bit ten nazywa sie T0CONbits.T08BIT. MAm jednak nadzieje iz przez pomylke wpisal Pan taka wlasnie jego nazwe, gdyz jego konfiguracja wskazywala na to iz uzywa Pan trybu 16 bit (a faktycznie przy 4 MHz dl wygenerowania 400 us wystarczy

8bitowy tryb z prescalerem 1:2). Jesli dalej chcialby Pan dociekac dlaczego uklad zachowal sie tak a nie inaczej prosilbym o dostarczenie mi pliku lst generowanego przez mcc18 w trakcie kompilacji (byc moze bedzie Pan musial wlaczyc w MP-LAb opcje wymuszajaca jego generowanie).

Pozdrawiam i zycze sukcesow

Dzieki za pomoc. Okazalo sie, ze problemem bylo to, ze wpisywalem nastawe w trakcie przerwania jedynie do mlodszego bajtu timera0. Co prawda wpisywana wartosc zmiennej uint wynosila 533 ale i tak uaktualnianiu ulegal tylko mlodszy bajt licznika timera. Teraz mam inny problem. Chce by timer0 odmierzal 133us przy zegarze wewnetrznym ustawionym na 4MHz. Oznacza to, ze timer powinien byc 16-to bitowy i w trakcie przerwania program powinienem wpisywac odpowiednie dopelnienia do 0xFF do TMR0L i TMR0H. Oto program obslugi tego przerwania:

#define PERIOD 533 const uchar PERIOD_L = 0xff - (PERIOD%0xFF), PERIOD_H = 0xff - (PERIOD/0xFF);

TMR0H = PERIOD_H; // reload H TMR0L += PERIOD_L; // reload L Wedlug mnie timer powinien odmierzac 133us a niestety wedlug mojego oscyloskopu odmierza ok. 300us. Poniewaz oscyloskop jest pozyczony (C1-73) nie jestem pewien tych pomiarow. Zawartosc rejestrow SFR odczytana z ICD2: TOCON = 0x88 OSCCON = 0x6C Prosze Was o ocene poprawnosci obranej przeze mnie metody i wpisywanych wartosci.

Jacek M.

Czy nikt tutaj nie programowal tego mikrokontrolera?

Jacek M.

Poradzilem sobie. Problemy z doborem parametrow pracy dla TIMER0 zostaly usuniete. Jacek M.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required