;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;        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 "p24FJ64GB002.inc"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ustawienia bitów konfiguracyjnych
;1. 
;FWDTEN_OFF - Watchdog wyłączony
;JTAGEN_OFF - JTAG wyłączony
	config  __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
	config  __CONFIG2,	FNOSC_PRIPLL & POSCMOD_XT & PLLDIV_DIV2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; definicje stałych
	.equ	procesorek, 16000-6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; deklaracje symboli globalnych
	.global __reset				;etykieta pierwszej linii kodu
	.global __MathError			;wektor pułapki błędu matematycznego
	.global __INT0Interrupt		;wektor przerwania INT0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; początek kodu
__reset:
	mov		#__SP_init, W15		;inicjalizacja wskaźnika stosu (adres początku stosu)
	mov		#__SPLIM_init, W0	;inicjalizacja SPLIM (adres graniczny stosu)
	mov		W0, SPLIM			;W0 -> SPLIM
	nop                         ;konieczna instrukcja nop
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; konfiguracja linii portu B
	bclr	TRISB, #8			;linia RB8 wyjściowa (D1)
	bclr	TRISB, #9			;linia RB9 wyjściowa (D2 - wskaźnik błędu mat.)
	bclr	LATB, #9			;dioda D2 zgaszona

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; konfiguracja przerwania INT0
	bset	INTCON2, #INT0EP	;reakcja na zbocze opadające
	bset	IEC0, #INT0IE		;włącz przerwanie INT0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; dane pętli
	mov		#5, W5
	mov		#100, W6

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; nieskończona pętla
petla:

	;mruganie
	bset	LATB, #8			;RB8 = 1
	mov		#250, W1			;W1 <- 250
	rcall	Czekaj_ms			;czekaj 250 ms

	bclr	LATB, #8			;RB8 = 0
	mov		#250, W1			;W1 <- 250
	rcall	Czekaj_ms			;czekaj 250 ms

	;dzielenie
	repeat	#17					;powtórz 17+1 razy
	div.uw	W6, W5				;Dziel, bracie, dziel!
	dec		W5, W5				;zmniejsz W5

	bra		petla				;skok bezwarunkowy do etykiety pętla
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; podprogram tworzący opóźnienie o W1 milisekund
Czekaj_ms:
	mov		#procesorek, W2		;W2 <- FCPU-6
	repeat	W2					;powtórz W2 razy
	nop
	dec		W1, W1				;W1--
	bra		NZ, Czekaj_ms		;wróć do pętli, jeśli nie było 0
	return						;powrót z podprogramu
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; obsługa wektorów przerwań i pułapek
__MathError:					;wektor pułapki błędu matematycznego
	bset	LATB, #9			;zaświeć diodę D2
	bclr	INTCON1, #MATHERR	;wyczyść flagę pułapki błędu
	retfie						;powróć z obsługi pułapki
	;goto    __MathError    

__INT0Interrupt:				;wektor przerwania INT0
	bclr	LATB, #9			;wyzeruj linię z diodą D2
	bclr	IFS0, #INT0IF		;wyczyść flagę przerwania
	retfie						;powrót z przerwania
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; i to by było na tyle
.end							;koniec programu
