/**************************************************************
   Schemat podłączeń programowanego układu

                      +----v----+
                MCLR [| 1     40|] 
                     [| 2     39|] 
                     [| 3     38|] 
                     [| 4     37|] 
                     [| 5     36|] 
                     [| 6     35|] 
                     [| 7     34|] 
                     [| 8     33|] RB0 <- S1
                     [| 9     32|] VDD
                     [|10     31|] VSS
                 VDD [|11     30|] 
                 VSS [|12     29|] 
     (20 MHz) / OSC1 [|13     28|] 
              \ OSC2 [|14     27|] 
(32,768 kHz) / T1OSO [|15     26|] 
             \ T1OSI [|16     25|] 
                     [|17     24|]
                     [|18     23|] 
                     [|19     22|] 
                     [|20     21|] RD2 -> D1
                      +---------+
                      PIC16F877A
***************************************************************/
#include <htc.h>

//oscylator 20 MHz (FOSC_HS)
//watchdog włączony (WDTE_ON)
//wyłączone LVP (Low-Voltage ICSP Programming) (LVP_OFF)
__CONFIG(FOSC_HS & WDTE_ON & LVP_OFF);


void main()
{
	TRISDbits.TRISD2 = 0;		//linia RD2 z diodą D1 wyjściowa
	PORTDbits.RD2 = 0;			//urządzenie wyłączone (dioda zgaszona)
	TRISBbits.TRISB0 = 1;		//linia RB0 z przyciskiem S1 wejściowa
	OPTION_REGbits.nRBPU = 0;	//włączenie wewnętrznego pull-up dla linii portu B
	//preskaler dla modułu watchdog = 128 (domyślny) - reset po 2,3 s
	OPTION_REGbits.PS2 = 1;
	OPTION_REGbits.PS1 = 1;
	OPTION_REGbits.PS0 = 1;

	//konfiguracja przerwania modułu Timer1
	PIE1bits.TMR1IE = 1;		//włącz przerwanie Timer1
	T1CONbits.T1OSCEN = 1;		//włącz oscylator dla Timer1
	T1CONbits.T1SYNC = 1;		//wyłącz synchronizację zewn. oscylatora
	T1CONbits.TMR1CS = 1;		//zewnętrzne źródło taktujące
	T1CONbits.TMR1ON = 0;		//moduł Timer1 na razie nieaktywny

	INTCONbits.PEIE = 1;		//włączenie przerwań urządzeń peryferyjnych
	INTCONbits.GIE = 1;			//globalne włączenie przerwań

	for(;;)						//pętla nieskończona
	{
		//czy wciśnięto przycisk
		if(PORTBbits.RB0 == 0)
		{
			TMR1H = 0x00;			//TMR1 = 0 
			TMR1L = 0x00;			//(podłączony oscylator zegarkowy)
			T1CONbits.TMR1ON = 1;	//włącz moduł Timer1
			PORTDbits.RD2 = 1;		//włącz urządzenie (zaświeć diodę)
									//czas wysyłania impulsu = 2s
			//zaczekaj na wyłączenie urządzenia (zgaszenie diody)
			while(PORTDbits.RD2 == 1);
		}
		CLRWDT();					//zerowanie licznika modułu watchdog
	}
}

static void interrupt
knowania_przerwania(void)
{
	if(PIR1bits.TMR1IF == 1)	//przerwanie modułu Timer1 (wywoływane co 1 s)
	{
		T1CONbits.TMR1ON = 0;	//moduł Timer1 na razie nieaktywny
		PORTDbits.RD2 = 0;		//wyłącz urządzenie (zgaś diodę)

		PIR1bits.TMR1IF = 0;	//wyczyść flagę przerwania
	}
}
