
	LIST 	P=PIC16F630		;a forítóval tudatjuk a pic típusát
	#include <P16F630.inc>	;beállításokat tartalmazó inc fájl, az mplab könyvtárában megtalálható
							;nagyon sok típusra. Érdemes megnézegetni a tartalmát.
	
	__CONFIG 0x3194			;konfigurációs beállítások (adatlap 54. oldal) ///56 old?
	
;	ORG 0					;itt indul a program ///Szerintem ennek nem itt van a helye!
	
	CBLOCK 0x20				;a definíciók kezdetét kötelező megadni
;		A EQU 020h			; az "EQU 020h" nem kell. Ha simán egymás alá írod akkor a 20-as kezdőcímtől kezdve egymás után teszi a memóriába.
;		B EQU 021h			; mivel a "B" a bináris számra utal, ezért nem használható másra
;		D EQU 022h			; Az EQU-t még ne akard használni...
		szam_1
		szam_2
		szam_3
	endc					; a defíniciós blokkot le kell zárni!
	ORG 0					; ez itt nem jó helyen van. Ha reset van akkor a változók kimaradnak a programból és nem fog működni ///De, jó heleyen volt! Kedves Pali79! A CBLOCK a fordítónak szól, nem a program része! (Ahogy pl a __CONFIG is!)
;CONFIG intrc OSC			; szintén nem jó helyen van, ennek legelől a helye
;GOTO BEÁLLÍTÁSOK			; mivel amúgy is a beállítások a következő sor, felesleges a GOTO, de inkább az ékezetek miatt vettem ki
;**********************		; /// Amúgy tetszik csabagalcsaba részéről, hogy ezekkel a vonalakkal legalább megpróbálta tagoltá, és így átláthatóvá tenni a progit.
;BEÁLLÍTÁSOK				; ne használj ékeztes betűket!
BEALLITASOK:
		CLRF	PCLATH		;/// A Kónya László könyvben is javasolják (és még rettentően sok mindent!)
		BANKSEL	PORTA		;/// Szintén csak a biztonság kedvéért.
		CLRF	PORTA		; használd a TAB billenytyűt az egyes utasítások, cimkék, operandusok oszlopba helyezéséhez
		CLRF 	PORTC
		BANKSEL TRISA
		CLRF 	TRISA
;		BANKSEL TRISC	/// Felesleges! A TRISA és TRISC ugyanazon a lapon vannak!
		CLRF 	TRISC
		BANKSEL PORTC
		GOTO 	PROGRAM		;mint fent is, itt is felesleges, de nem okoz hibát
;***************
PROGRAM:
		MOVLW 	B'100000'
		MOVWF 	PORTA
;CALL IDŐ
		CALL 	IDO
		MOVLW 	B'010000'
		MOVWF 	PORTA
		CALL 	IDO
		CLRF 	PORTA
		MOVLW 	B'100000'
		MOVWF 	PORTC
		CALL 	IDO
;		CLRF 	PORTC	;/// Felesleges! 2 utsaítással lejjebb felülírod!
		MOVLW 	B'010000'
		MOVWF 	PORTC
		CALL 	IDO
		CLRF 	PORTC
		GOTO 	PROGRAM
;***************
;IDŐ
IDO:
		MOVLW 	D'99'
		MOVWF 	szam_2
		MOVLW 	D'35'
		MOVWF 	szam_3
;X MOVLW D'20'			;a cimkét mindig külön sorba írjuk és legyen picit hosszabb!
IDO_1:
		MOVLW 	D'20'
		MOVWF 	szam_1
;I DECFSZ A,F			;szintén...
IDO_I:
		DECFSZ 	szam_1,F
		GOTO 	IDO_I
;II DECFSZ B,F
		DECFSZ szam_2,F
		GOTO 	IDO_1
;III DECFSZ D,F
		DECFSZ szam_3,F
		GOTO 	IDO_1
		RETURN
;**************
		END

;az end után lennie kell még üres sornak is
;/// /// /// /// /// /// /// /// /// /// /// /// /// /// 
;Amúgy a számolást akkor sem értem. Működik persze, csak nem értem minek így elbonyolítani? Van három ciklus egmásba ágyazva. A belső (szam_1) mindig csak 20-ig számiol. Miért? Miért nem 255-ig, ahogy lehetne? A többi OK, hogy a második (szam2) először 99-ig, majd utána minden további ciklusban 255-ig. Továbbá a legkülső 35-ig. Így lesz 10+(2+szam_1*3-1+3)*szam_2-1+((2+20*3-1+3)*256+2)*(szam_3 -1) = 563469 hosszú a ciklus. Ez 4 Mhz-cel számolva durván fél másodperces késleltetést jelent! Szerintem sokkal egyszerűbb az alábbi IDO szubrutin: (Ez 0,59s-os az előbbi 0,56s-mal szemben.)

IDO:	MOVLW 	D'3'
		MOVWF 	szam_3
		clrf 	szam_2
		clrf 	szam_1
IdoK:	DECFSZ	szam_1
		GOTO	IdoK
		DECFSZ	szam_2
		GOTO	IdoK
		DECFSZ	szam_3
		GOTO	IdoK
		RETURN

;Ha finomhangolni akarod, lehet a második ciklusnak először kezdőértéket adni, (ahogy te a 99-et), majd utána futtatni 255-ig. Esetleg a legbelsőhöz ugyanígy. De csak az első kör nem teljes, a többi igen! (Az alábbi ciklus lefutási ideje, azaz a CALL IDO utasítás hossza 499999 us, azaz fél másodperc - 1 milliomodmásodperc.)

IDO:	MOVLW 	D'3'
		MOVWF 	szam_3
		MOVLW 	D'138'
		MOVWF 	szam_2
		MOVLW 	D'84'
		MOVWF 	szam_1
IdoK:	DECFSZ	szam_1
		GOTO	IdoK
		DECFSZ	szam_2
		GOTO	IdoK
		DECFSZ	szam_3
		GOTO	IdoK
		RETURN


