;Lamináló gép vezérlő programja
;Készítette: én
;2010.01.27.


	list	P=18F2520
#include	"P18F2520.INC"
		config FCMEN  = OFF
		config IESO   = OFF
		config BOREN  = OFF
		config WDTPS  = 32768
		config MCLRE  = ON 
 		config STVREN = ON
		config LVP    = OFF
		config XINST  = OFF
		config CP0    = OFF
		config CP1    = OFF
		config CPB    = OFF
		config WRT0   = OFF
		config WRT1   = OFF
		config WRTB   = OFF
		config WRTC   = OFF
		config EBTR0  = OFF
		config EBTR1  = OFF
        config EBTRB  = OFF 
		config	OSC = INTIO67
		config	WDT = OFF

;***************** DEFINÍCIÓK *******************************
#define	FUTES		LATB,5
#define	MOTOR		LATB,4
#define	lcd_EN		LATC,7
#define	lcd_RS		LATC,5
#define lcd_b4		LATC,0
#define lcd_b5		LATC,1
#define lcd_b6		LATC,2
#define lcd_b7		LATC,3
#define	UZEMMOD		KONFIG,0	;a KONFIG regiszter legkisebb helyiértékű bitje a laminálás/vasalás üzemmód beállítására szolgál Ha 1 akkor nyákok készítünk, ha 0 akkor laminálunk
#define	FELMELEGEDES		KONFIG,1	;ha a hengerek elérték már a bekapcsolás után az üzemi hőmérsékletet, akkor ez a bit 1-re vált

#define	MOTOR_HUZAS	d'1'	;mennyi időre kapcsoljon be a motor? (értéke 0,1 másodperc-szerese)
#define	MOTOR_VARAS	d'20'	;mennyi időt álljon a motor? (értéke 0,1 másodperc-szerese)
#define	VASALAS_HOMERSEKLET		fok_160		;nyák-készítés hőmérséklete
#define	LAMINALAS_HOMERSEKLET	fok_120		;laminálás hőmérséklete

;*************************************************************************

; A következő értékekből 400 le van vonva, hogy a mért érték egy bájton elférjen!
#define	fok_100	d'57'
#define	fok_105	d'61'
#define	fok_110	d'66'
#define	fok_115	d'70'
#define	fok_120	d'76'
#define	fok_125	d'79'
#define	fok_130	d'83'
#define	fok_135	d'88'
#define	fok_140	d'92'
#define	fok_145	d'97'
#define	fok_150	d'101'
#define	fok_155	d'105'
#define	fok_160	d'110'
#define	fok_165	d'114'
#define	fok_170	d'119'
#define	fok_175	d'123'
#define	fok_180	d'127'
#define	fok_185	d'132'
#define	fok_190	d'136'
#define	fok_195	d'140'
#define	fok_200	d'145'

;*************************************************************************

cblock
	W_TEMP
	STATUS_TEMP
	delay0
	delay1
	delay2
	delay3
	IDOZITES
	HOMERSEKLET_H
	HOMERSEKLET_L
	KONFIG
endc	

;***********************************************************
org	0
goto START

org	0x008
bra 0x018
org 0x018	;megszakítási cím
;*****************************************************************
;*********************** MEGSZAKÍTÁS *****************************
;*****************************************************************
	movwf	W_TEMP			;W regiszter eltárolása
	swapf	STATUS,W		
	movwf 	STATUS_TEMP		;STATUS regiszter eltárolása

	btfss	INTCON,T0IF		;TMR0 megszakítás ellenőrzése
		goto	megszakitas_kilepes

	movlw	MOTOR_HUZAS
	subwf	IDOZITES, W
	btfss	STATUS, Z	;ha az IDOZITES regiszter egyenlő a MOTOR_HUZAS értékével, akkor ugrik
		bra	cimke1
	btfsc	PORTB, 4	;a motor be van kapcsolva? (ha nem, akkor ugrik)
		bcf	MOTOR		;ha be van kapcsolva, akkor kapcsold ki!
		bra	cimke1		
cimke1
	movlw	MOTOR_VARAS
	subwf	IDOZITES, W
	btfss	STATUS, Z	;ha az IDOZITES regiszter egyenlő a MOTOR_VARAS értékével, akkor ugrik
		bra	megszakitas_kilepes
	bsf		MOTOR		;kapcsold be a motort!
	movlw	d'255'
	movwf	IDOZITES	;IDOZITES regiszter nullázása (az időzítés előrről kezdődjön!)

megszakitas_kilepes
	incf	IDOZITES
	movlw	b'11111001'
	movwf	TMR0H
	movlw	b'11100101'	;63973
	movwf	TMR0L		;4Mhz-es órajellel, 256-os osztás és 16 bites mód esetén 0,1 másodperc kell a TMR0 túlcsordulásához

	swapf	STATUS_TEMP,W	
	movwf 	STATUS			;az elementett STATUS regiszter visszaállítása
	swapf	W_TEMP,F
	swapf	W_TEMP,W		;az elementett W regiszter visszaállítása
	bcf		INTCON, T0IF	;TMR0 megszakítást jelzőbitjét töröljük
	bsf		INTCON, GIE		;általános megszakítás engedélyezése
RETFIE
;*****************************************************************
;*********************** FŐ PROGRAM ******************************
;*****************************************************************
START
	call	PIC_inicializalas
	call	LCD_inicializalas
	clrf	IDOZITES
	bsf		UZEMMOD		;bekapcsolás után alapból milyen üzemmódban működjön a lamináló? (1-nyák készítés, 0-laminálás)
	bcf		FELMELEGEDES
	bcf		FUTES
	movlw	b'11111001'
	movwf	TMR0H
	movlw	b'11100101'	;63973
	movwf	TMR0L		;4Mhz-es órajellel, 256-os osztás és 16 bites mód esetén 0,1 másodperc kell a TMR0 túlcsordulásához

;AD_konverzio
;	bsf		ADCON0, GO_DONE		;A/D konverzió indítása
;	btfsc	ADCON0, GO_DONE		;befejeződött az A/D konverzió?
;	goto	$-2					;ha nem, akkor kérdezd meg újra!
;	movff	ADRESH, HOMERSEKLET_H
;	movff	ADRESL, HOMERSEKLET_L
;
;	movlw	b'00000001'		;a decimális 400 felső bájtja
;	subwf	HOMERSEKLET_H, f
;	movlw	b'10010000'		;a decimális 400 alsó bájtja
;	subwfb	HOMERSEKLET_L, f
;
;Szabalyozas
;	btfss	UZEMMOD		;ha nyák-készítés üzemmódban vagyunk, akkor ugrik!
;	bra		cimke3
;	bra		cimke4
;cimke3
;	movf	LAMINALAS_HOMERSEKLET		
;	bra		cimke5
;cimke4
;	movf	VASALAS_HOMERSEKLET	
;cimke5
;	cpfslt	HOMERSEKLET_L	;ha a mért hőmérséklet kisebb a beállítottnál, akkor ugrik!
;	bra		futes_kikapcs
;	bra		futes_bekapcs
;futes_kikapcs
;	bcf		FUTES
;	bsf		FELMELEGEDES	;ha a bekapcsolás után elérték a hengerek az üzemi hőmérsékletet, akkor ezt a bitet 1-re állítjuk!
;	bra		cimke2
;futes_bekapcs
;	bsf		FUTES
;cimke2
	
	
	movlw	'A'
	call	LCD_kiiratas




goto $
;*****************************************************************
;********************** SZUBRUTINOK ******************************
;*****************************************************************

PIC_inicializalas
;Órajel beállítása:
	movlw	b'01100000'
	movwf	OSCCON			;4MHz-es belső órajel beállítása
;Portok konfigurációja:
	movlw	b'00001111'
	movwf	TRISA			;RA0, RA1, RA2, RA3 bemenet, többi kimenet lesz
	movlw	b'00001111'
	movwf	TRISB			;RB0, RB1, RB2, RB3 bemenet, többi kimenet lesz
	movlw	b'00000000'
	movwf	TRISC			;PORTC kimenet lesz
	bcf		INTCON2, RBPU	;PORTB-re felhúzóellenállások bekapcsolása
;A/D konfigurációja:
	movlw	b'00000001'
	movwf	ADCON0			;AN0 lesz használva, engedélyezve
	movlw	b'00111011'	
	movwf	ADCON1			;külső REF+ és REF- használata, AN0, AN1, AN2 és AN3 lesz analóg bemenet
	movlw	b'10011101'
	movwf	ADCON2			;eredmény jobbra igazítása, 6TAD, Fosc/16
;TMR0 konfigurációja:
	movlw	b'10010101'		; számláló engedélyezve, 16 bites mód, belső oszcillátorról, lefutó élre, 1:64-es előosztó
	movwf	T0CON
;Megszakítások konfigurációja
	clrf	INTCON
	bsf		INTCON, GIE		;globális megszakítás engedélyezés
	bsf		INTCON, T0IE	;timer0 túlcsordulás-megszakítás engedélyezése
RETURN

LCD_inicializalas
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms

	bcf		lcd_RS

	clrf	LATC
	movlw	b'00000010'		;négy bites mód
	movwf	LATC
	call	delay1ms
	bsf		lcd_EN
	call	delay1ms
	bcf		lcd_EN

	movlw	b'00000010'		;négy bites mód
	movwf	LATC
	call	delay1ms
	bsf		lcd_EN
	call	delay1ms
	bcf		lcd_EN
	movlw	b'00001000'		;két soros mód, 5*7 pixel
	movwf	LATC
	call	delay1ms
	bsf		lcd_EN
	call	delay1ms
	bcf		lcd_EN

	movlw	b'00000000'		;kijelző bekapcs
	movwf	LATC
	call	delay1ms
	bsf		lcd_EN
	call	delay1ms
	bcf		lcd_EN
	movlw	b'00001111'		;kijelző bekapcs
	movwf	LATC
	call	delay1ms
	bsf		lcd_EN
	call	delay1ms
	bcf		lcd_EN
	call	delay1ms
RETURN

LCD_kiiratas
	bsf		lcd_RS
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bcf		lcd_b7
	bcf		lcd_EN
	btfsc	WREG,4
	bsf		lcd_b4
	btfsc	WREG,5
	bsf		lcd_b5
	btfsc	WREG,6
	bsf		lcd_b6
	btfsc	WREG,7
	bsf		lcd_b7
	bsf		lcd_EN
	bcf		lcd_EN
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bcf		lcd_b7
	btfsc	WREG,0
	bsf		lcd_b4
	btfsc	WREG,1
	bsf		lcd_b5
	btfsc	WREG,2
	bsf		lcd_b6
	btfsc	WREG,3
	bsf		lcd_b7
	bsf		lcd_EN	
	bcf		lcd_EN
RETURN	

LCD_kurzor_mozgatas
	movwf	LATC
	bcf		lcd_EN
	bcf		lcd_RS
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bsf		lcd_b7
	btfsc	WREG,4
	bsf		lcd_b4
	btfsc	WREG,5
	bsf		lcd_b5
	btfsc	WREG,6
	bsf		lcd_b6
	call	delay1ms
	bsf		lcd_EN
	call	delay1ms
	bcf		lcd_EN
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bcf		lcd_b7
	btfsc	WREG,0
	bsf		lcd_b4
	btfsc	WREG,1
	bsf		lcd_b5
	btfsc	WREG,2
	bsf		lcd_b6
	btfsc	WREG,3
	bsf		lcd_b7
	call	delay1ms
	bsf		lcd_EN
	call	delay1ms	
	bcf		lcd_EN
RETURN



delay100us:
	movlw	d'25'
	decfsz	WREG
	goto	$-2
RETURN



delay100ms:
	movlw	d'100'		;100ms
	goto	d2
delay10ms:
	movlw	d'10'		;10ms
	goto	d2
delay1ms:
	movlw	d'1'		;1ms
d2:	movwf	delay1
d1:	movlw	d'248'	
	movwf	delay0	
d0:	decfsz	delay0,f
	goto	d0
	decfsz	delay1,f
	goto	d1
RETURN





goto$	
END
