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

[PIC 18F452] Jak poprawnie skonfigurować przerwania timera0 w PIC 18F452?

_Robak_ 24 Kwi 2007 17:59 2157 4
REKLAMA
  • #1 3817430
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Witam
    Mam pewien problem z timerami, jesli dobrze rozumiem dokumentacje to przy kazdym przejsciu wartosci rejestru TMR z 0xFFFF na 0x0000 powinno wystapic przerwanie. Napialem prosty program wywolujacy przerwanie przy pomocy timera0 i niestety wartosc ta musi przjesc przez zero kilkaset razy zanim wystapi przerwanie. Korzystam ze sprzetowaego debuggera, wiec zakladam ze nie jest to blad symulatora. Jak by ktos wyjasnil jak to jest z tymi licznikami w PICkach to bylbym bardzo wdzieczny bo juz na prawde nie mam pojecia czemu tak sie zachwouje.

    Tu jest przykladowy kod


    
    
    #include <18F452.h>
    #include <math.h>
    
    
    #byte	timer0=0xFD5
    #byte	timer1=0xFCD
    #byte	timer3=0xFB1
    #byte	tm0=0xFD6
    #byte	tm1=0xFCE
    
    long a=0,b=0;
    
    #INT_TIMER0
    void timer0_isr()
    {
    	a=0;
    }
    
    
    
    void main()
    {
    	setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);	//start timer0
    	set_timer0(0x3CB1);    	 //wartosc timer0
    
    	enable_interrupts(INT_TIMER0);
    	enable_interrupts(GLOBAL);
    	
    	
    	
    	while(TRUE)
    	{
    		if (tm0==0xFFFF) 
    		{
    			a++;
    		}
    
    	}
    
    }
    
    
    


    zmienna "a" zczytuje ile razy licznik przeszedl przez zero zanim nastapilo przerwanie, co najdziwniejsze ta wartosc nie jest stala tylko sie zmienia i to w dosc losowy sposob...
    Korzystam z MPLAB 7.5, kompilator CCS ver. 3.249
  • REKLAMA
  • #2 3819201
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Global variables that are accessed by both an ISR and mainline
    functions should be declared volatile.

    Program jest zle napisany, szansa ze trafisz na (tm0==0xFFFF) jest pewnie przypadkowa :)
  • REKLAMA
  • #3 3819654
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Hmm zmienie na volatile i zobacze czy cos sie zmieni. Ale sprawdzalem krok po kroku i przy przejsciu licznika przez 0xFFFF przerwania nie bylo wiec to raczej niew tym problem:(
  • REKLAMA
  • Pomocny post
    #4 3819785
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Ja pisze w C18 Microchipa i nie korzystam z zadnych wbudowanych funkcji w stylu
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
    sprobuj wlaczyc timer wpisujac wartosci bezposrednio do rejestrow cos jak:
    TMR1IF = 1;
    TMR1IE = 1;
    T1CON = 0b01110000;
    TMR1L = 0xEF; // 20 ms
    TMR1H = 0xD8;
    TMR1ON = 1;

    Nie widze u Ciebie kasowania flagi TMR0IF w obsludze przerwania
  • #5 3819871
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Przy wywolywaniu procedury przerwania flaga ta jest kasowana automatycznie, Recznie tez juz wpisywalem i nic:( Ale jeszcze sprobuje tak jak napisales wszystko poustawiac... Moze cos z tym kompilatorem jest nie tak, tego uzywam bo C18 mam tylko na 60 dni..


    A jednak debugger;) nie dziala poprawnie w pracy krokowej, a zmienna a tez byla zle zadeklarowana;) Juz jest ok.. dzieki za pomoc:)
REKLAMA