ustawienie timera w PIC18F1320

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.

Reply to
Jacek M.
Loading thread data ...

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

Jacek M.

Reply to
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.

Reply to
Jacek M.
Reply to
Mariusz.K.(R2D2

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.

Reply to
Jacek M.

Czy nikt tutaj nie programowal tego mikrokontrolera?

Jacek M.

Reply to
Jacek M.

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

Reply to
Jacek M.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.