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

[pic16f684][C]timer1, dlaczego przerwanie nie działa?

sieciech 12 Cze 2008 15:28 2418 14
REKLAMA
  • #1 5239145
    sieciech
    Poziom 12  
    Posty: 107
    Ocena: 1
    Hej

    proboje uruchomić timer1 w moim picu ale coś nie bardzo mi idzie. Robie dokladnie jak w dokumentacji tj (odblokowuje przerwania globalne, czyszcze flagi etc etc ) a i tak cos nie działa(konkretnie - nie pojawia się przerwanie majace nastapic po przepelnieniu). oto fragment kodu:
    
    void initTMR1(void)
    {
    	PEIE = 1;
    	GIE = 1; 
    	TMR1IE = 1;
    	T1CON = 0x35; 
            TMR1L = 0x00;
    	TMR1H = 0x00;	
    
    	while(!(TMR1IF))
    	{
    		asm ("nop");	
    	}
    
    }
    
    void interrupt
    irq (void)
    {
     if (TMR1IF)
        {
          TMR1IF = 0;
          CONFIG_PIN_LED = 1;
    	}}

    funkcje initTMR1 wywołuje w pętli głównej programu głównego

    z góry dzieki za pomoc
    S
  • REKLAMA
  • REKLAMA
  • #3 5239298
    sieciech
    Poziom 12  
    Posty: 107
    Ocena: 1
    na podstawie tego że led w momencie przerwania się nie zapala, a w pętli głównej widać tylko mruganie o bardzo dużej częstotliwości

    oto pętla główna,
    
    while(1)
    {
    	SPI_write_buffer(0xA0,TxPayload,16);
    	CONFIG_PIN_CE = 1;
    	//CONFIG_PIN_LED = 1;
    	status = SPI_read_reg(0x07);
    	if (status&0x20)
    	{
    		CONFIG_PIN_LED = 1;
    		for (i = 0; i < 100; i++)
    		{initTMR1();}
    	
    		SPI_write_reg(0x27,0x70);
    		SPI_send_byte(0xE1);
    		CONFIG_PIN_LED = 0;
    	}
    
    }


    niestety nie mam ani debuggera i tylko jedną diodę więc działam w bardzo po omacku :/
  • #4 5239341
    milik
    Poziom 23  
    Posty: 637
    Pomógł: 71
    Ocena: 58
    Wydaje mi się że jeśli nawet przerwanie zostanie wywołane to dioda zostanie natychmiast zgaszona przez główną pętle. Tak że więc możesz nawet nie zauważyć wejścia do przerwania. Zorganizuj sobie drugiego LEDa i próbuj dalej.
  • #5 5239481
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    No LED w momencie przerwania sie nie zapala bo... jest juz zapalona! Program napisany jest niestety zle... Jesli juz chcesz by LED migala to zamiast
    CONFIG_PIN_LED = 1;

    napisz
    CONFIG_PIN_LED = !CONFIG_PIN_LED;


    Nie masz debuggera - jakiego kompilatora uzywasz?

    BF
  • REKLAMA
  • #6 5241304
    sieciech
    Poziom 12  
    Posty: 107
    Ocena: 1
    uzywam mplaba. a o debugger - chodzilo o mi o taki hardware'owy. A wracając do tematu delayów - to czy ktos z was móglby mi wyjaśnić jaką jest zależność między tym co się wpisze do rejestru TMRx a uzyskanym czasowym delayem (zakladjac ze zegar 8 Mhz, a preskaler dowolny) ? prawde mówiąc do tego zmierzam, żeby dioda co 1 ms mi migała...
  • #7 5241311
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    jesli preskaler jest dowolny, to opoznienie bedzie - rowniez - dowolne. nadszedl czas na RTFM. w datasheecie na pewno wszystko jest slicznie opisane.

    czlowiek widzi ok 30fps. 1s/30 = 33.(3)ms. ty chcesz migac 30x szybciej... trust me - nikt nie zauwazy, ze miga, bedzie po prostu ciemniej swiecic.

    @\/3!!
  • REKLAMA
  • #8 5241403
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    :arrow: Miganie co 1 ms :D
    :arrow: Datasheet - wszystko opisane - jesli nie rozumiesz jakiegos zdania - zapytaj - pomoge.
    :arrow: MPLAB nie jest kompilatorem a tylko IDE.
    :arrow: MPLAB ma dobry debugger i rownie dobry stopwatch, ktory idealnie nadaje sie do sprawdzenia takich zaleznosci czasowych, o ktorych piszesz.

    BF
  • #9 5241418
    sieciech
    Poziom 12  
    Posty: 107
    Ocena: 1
    1ms to dla moich oczu nic nadzwyczajnego :P a tak powaznie 1 ms to troche pomylone :)

    co do datasheeta - rozumiem wszystko, jedynie czego nie kumam to jak ma się wartość, od/do której chcę żeby timer odliczał/zliczał do uzyskanego opóźnienia, zakładając że albo korzystam z zegara 8 MHz zewnętrznego albo wewnętrzego ok 32 kHz.

    kompilator to C (ten z Hi-tech)
  • #10 5241490
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    sieciech napisał:
    co do datasheeta - rozumiem wszystko, jedynie czego nie kumam to jak ma się wartość, od/do której chcę żeby timer odliczał/zliczał do uzyskanego opóźnienia, zakładając że albo korzystam z zegara 8 MHz zewnętrznego albo wewnętrzego ok 32 kHz.

    nie kumam tego pytania... moze jakis przyklad, bo naprawde nie rozumiem, w czym problem.

    Bigfoot napisał:
    :arrow: MPLAB ma dobry debugger i rownie dobry stopwatch, ktory idealnie nadaje sie do sprawdzenia takich zaleznosci czasowych, o ktorych piszesz.

    symulator != debugger

    @\/3!!
  • #11 5241512
    sieciech
    Poziom 12  
    Posty: 107
    Ocena: 1
    Chodzi mi o to jak sobie wyliczyć opóźnienie jakie można uzyskać, karząc timerowy odliczać od 0 do 0xFFFF czyli do wygenerowania przerwania, krótko mówiąc, ile czasu zajmuje timerowi przeliczenie od 0 do 0xFFFF. No bo chyba idea delay'a polega na iluś razowym wywołaniu takiego przerwania, chyba że się mylę
  • #13 5241765
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    :arrow: sieciech, znajac czestotliwosc taktowania uC wiesz tez ile dokladnie trwa jeden cykl maszynowy. Tak? Wiesz wiec tez ile cykli maszynowych potrzeba na Twoje opoznienie (niech bedzie to n). Musisz tak sobie zaladowac TMR1 aby przepelnienie zachodzilo dokladnie co n cykli maszynowych. Nie zliczasz wiec od 0x0000 do 0xFFFF tylko od powiedzmy 0x120A do 0xFFFF, poniewaz 0xFFFF minus 0x120A to wlasnie Twoje n. Oczywiscie musisz uwzglednic preskaler. Idee w kazdym badz razie zrozumiales?

    :arrow: Freddie Chopin dlaczego wprowadzasz jakies dziwne uwagi? MPLAB SIM jest debuggerem tyle, ze nie sprzetowym a softwarowym.

    BF
  • #14 5241840
    sieciech
    Poziom 12  
    Posty: 107
    Ocena: 1
    proszę mnie poprawić, jesli gdzieś błąd robię, ale mając 8 MHz i preskaler 1:8, dodatkowo w ustawieniach wyboru źródła taktowania timera wybieram Fosc/4, otrzymuję 8Mhz/8/4 = 250 KHz tak ? jeden cykl = 1/250khz = 4us i aby mieć teraz delay 1 mili sekundowy to do rejestru muszę wpisać 250 = 0xFA ?
  • #15 5241899
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Nie 0xFA tylko (0xFFFF minus 0x00FA) czyli 0xFF05. TMR1 jest dwubajtowy.

    BF

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z uruchomieniem przerwania Timer1 w mikrokontrolerze PIC16F684. Autor zgłasza, że pomimo poprawnej konfiguracji przerwań (włączone PEIE, GIE, TMR1IE, ustawiony T1CON, czyszczone flagi) przerwanie nie wywołuje oczekiwanej reakcji (zapalenia diody LED). Wskazuje, że w pętli głównej dioda miga z dużą częstotliwością, co może powodować, że efekt przerwania jest niezauważalny. Użytkownicy sugerują, że dioda może być stale zapalona lub gaszona w pętli głównej, co maskuje działanie przerwania, oraz proponują użycie przełączania stanu diody zamiast stałego ustawiania. Poruszono także temat wyliczania opóźnień generowanych przez Timer1, uwzględniając częstotliwość taktowania (8 MHz), preskaler oraz źródło taktowania (Fosc/4). Wyjaśniono, że czas przepełnienia timera to liczba cykli od wartości początkowej do 0xFFFF, a dla uzyskania konkretnego opóźnienia należy odpowiednio załadować rejestry TMR1H i TMR1L. Podkreślono, że MPLAB to IDE z wbudowanym symulatorem/debuggerem, a do precyzyjnego pomiaru opóźnień można użyć jego funkcji stopwatch. Dyskusja zawiera praktyczne wskazówki dotyczące konfiguracji przerwań, obsługi diody LED oraz obliczania wartości rejestru timera dla uzyskania określonych czasów opóźnień.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA