/**************************************************************
        Schemat podłączeń programowanego układu
                       +----v----+
                 MCLR [| 1     28|] VDD
                      [| 2     27|] VSS
                      [| 3     26|] 
                      [| 4     25|] 
                      [| 5     24|] 
                      [| 6     23|] 
                      [| 7     22|] 
                  VSS [| 8     21|] 
       (8 MHz) / OSCI [| 9     20|] VCAP/VDDCORE
               \ OSCO [|10     19|] DISVREG
                      [|11     18|] RB9 -> D2
                      [|12     17|] RB8 -> D1
                  VDD [|13     16|] INT0 <- S1
                      [|14     15|] 
                       +---------+
                     PIC24FJ64GB002
***************************************************************/
#include <p24Fxxxx.h>

//ustawienia bitów konfiguracyjnych
//1. 
//FWDTEN_OFF - Watchdog wyłączony
//JTAGEN_OFF - JTAG wyłączony
_CONFIG1(FWDTEN_OFF & JTAGEN_OFF)
//2.
//FNOSC_PRIPLL - układ taktowany zewnętrznym oscylatorem z pętlą PLL
//POSCMOD_XT - częstotliwość taktowania oscylatora 8 MHz
//PLLDIV_DIV2 - konieczność podzielenia przez 2 dla modułu USB PLL
_CONFIG2(FNOSC_PRIPLL & POSCMOD_XT & PLLDIV_DIV2)

int licznik;		//zmienna globalna potrzebna do zaświecenia diody D1

//funkcja tworząca opóźnienie o wielokrotność mikrosekund
//dla taktowania 32 MHz
void Czekaj_us(unsigned long int ile)
{
	//jednokrotne wykonanie pętli zajmuje 16 cykli (1 us)
	while(ile>0) 
	{
		ile--;
		asm("nop");		
		asm("nop");		
		asm("nop");		
		asm("nop");		
		asm("nop");	
		asm("nop");
	}
}

int main()
{
	//konfiguracja linii portu B
	TRISBbits.TRISB7 = 1;		//linia RB7 wejściowa
	TRISBbits.TRISB8 = 0;		//linia RB8 wyjściowa dioda D1
	TRISBbits.TRISB9 = 0;		//linia RB9 wyjściowa dioda D2

	//konfiguracja przerwania INT0
	INTCON2bits.INT0EP = 1;		//reakcja na zbocze opadające
	IEC0bits.INT0IE = 1;		//włącz przerwanie INT0

	//konfiguracja przerwania modułu Timer2/3
	//1. ustawienie bitu T32
	T2CONbits.T32 = 1;
	//2. ustawienie preskalera
	T2CONbits.TCKPS1 = 0;		//preskaler 1:1
	T2CONbits.TCKPS0 = 0;
	//3. ustawienie TCS i TGATE (nie korzystamy)
	T2CONbits.TCS = 0;			//TCS = 0/1 taktowanie wewnętrzne/zewnętrzne
	T2CONbits.TGATE = 0;		//TGATE = 0/1 Gated Time Accumulation Mode wyłączony/włączony
	//4. załadowanie okresu (8 000 000 cykli = 1/2 sekundy przy taktowaniu 32 MHz)
	PR3 = 0x007A;
	PR2 = 0x1200;
	//5. włączenie przerwania modułu Timer2/3
	IEC0bits.T3IE = 1;
	IFS0bits.T3IF = 0;			//wyczyść flagę przerwania
	//6. włączenie modułu Timer2/3
	T2CONbits.TON = 1;

	for(;;)						//nieskończona pętla
	{
		if(licznik>0)
		{
			LATBbits.LATB8 = 1;
			licznik--;
		}
		else LATBbits.LATB8 = 0;
		
		Czekaj_us(100000);		//czekaj 100 ms
	}
}

void __attribute__((interrupt,no_auto_psv)) _INT0Interrupt(void)
{
	licznik = 10;
	IFS0bits.INT0IF = 0;		//wyczyść flagę przerwania
}

void __attribute__((interrupt,no_auto_psv)) _T3Interrupt(void)
{
	LATBbits.LATB9 ^= 1;		//przełącz stan diody D2
	IFS0bits.T3IF = 0;			//wyczyść flagę przerwania
}
