;---------------------------------------------------------------------
;                     Feszültségmérő modul
;---------------------------------------------------------------------

;---------------------------------------------------------------------
;Beállítások:
;---------------------------------------------------------------------


        processor       18F452
        radix           dec
        
        #include 		P18F452.INC

        __CONFIG        _CONFIG1H, _OSCS_ON_1H & _HS_OSC_1H     ; Oscillator Switch enable
        
			bcf	SWDTEN,0

;---------------------------------------------------------------------
;Memória helyfoglalások:
;---------------------------------------------------------------------

        CBLOCK
Eredmeny
Timer1
Timer2
Timer3
egeszV
tizedV
ertek
ertek_termosztát
ASCI_egeszV
ASCI_tizedV
futés

        ENDC

;-------------------------------------------------------------------------------
; PORTE kivezetések
;
RS              equ     0                       ; 0= utasítás, 1= adat reg. választás
RdWr            equ     1                       ; R/W=0 LCD írás, R/W=1 LCD memória olvasás
E               equ     2                       ; 0= LCD tiltás, 1= engedélyezés
;-------------------------------------------------------------------------------


;===================[ P R O G R A M K E Z D E T ]========================

Reset_Vector  org 0x000			
	GOTO	START
HI_INT_VECTOR  org 0x008			;Magas prioritású megszakítás címe
	GOTO	IT_H_SERVICE			;Ugrás a magas megszakítást kiszolgáló rutinra
LOW_INT_VECTOR	  org 0x018			;Alacsoy prioritású megszakítás címe
	GOTO	IT_L_SERVICE			;Ugrás az alacsony megszakítást kiszolgáló rutinra


;==========================[ F Ő P R O G R A M ]=========================
MAIN_CODE	org 0x038				;Főprogram kezdőcíme

START



;---------------------------------------------------------------------
;Be-kimenetek beállítása:
;---------------------------------------------------------------------

           movlw   B'11000001'                 ; RC oszcillátor, A/D engedélyezés
            movwf   ADCON0                      ; 0. csatorna (RA0) kiválasztás
			clrf    LATD
            clrf    LATE
            movlw   B'11000111'                 ; TMR0 elöosztó= 1:256, 8 bites üzemmód
            movwf   T0CON
            movlw   b'00001110'
            movwf   ADCON1                      ; RA0 analóg bemenet !!!
            setf    TRISA                       ; PORTA bemenet
            clrf    TRISD                       ; PORTD kimenet
            clrf    TRISE                       ; PORTE kimenet
;            movlw	b'11110000'
;		 	movwf   TRISB
;---------------------------------------------------------------------
;LCD beállítása:
;---------------------------------------------------------------------
			clrf	PORTD
            bcf     LATE,RS                     ; LCD parancs következik
            movlw   56                          ; 38h, 8 bit interface set
            rcall   Write
            rcall   Kesl                        ; Busy flag olvasását "helyettesíti"
            movlw   56
            rcall   Write
            movlw   6                           ; 06h, Entry mode set: increment
            rcall   Write
            movlw   12                          ; 0dh, Display on, cursor/blink off
            rcall   Write
            movlw   16                          ; 10h, Display/cursor shift: cursor
            rcall   Write
            movlw   1                           ; 01h, Display clear
            rcall   Write
            rcall   Kesl2                       ; Busy flag olvasását "helyettesíti"


;---------------------------------------------------------------------
;        -----------------------Főprogram-------------------
;---------------------------------------------------------------------

;---------------------------------------------------------------------
;A/D konverzió:
;---------------------------------------------------------------------

Start

			bsf ADCON0,GO

Wait
            btfss   PIR1,ADIF                   ; várakozás a teljes konverzióra
            goto   Wait

;---------------------------------------------------------------------
;Adat kiírhatóvá tétele:  (néhol 9 tized után elofordul kettospont)
;---------------------------------------------------------------------



			movff	ADRESH,ertek
			movff	ADRESH,ertek_termosztát
			clrf	egeszV
			clrf	tizedV


Adatkonvertálás_egeszV
			movlw	d'51'						;255-->5V, 51-->1V
			cpfslt	ertek
			goto	Adatkonvertálás_egeszVal
			goto	Adatkonvertálás_tizedV

Adatkonvertálás_egeszVal
			incf	egeszV
			movlw	51							;255-->5V, 51-->1V
			subwf	ertek
			goto	Adatkonvertálás_egeszV	

			



Adatkonvertálás_tizedV

			movlw	d'5'
			cpfslt	ertek
			goto	Adatkonvertálás_tizedVal
			goto	ASCI_konvertalas

Adatkonvertálás_tizedVal
			incf	tizedV
			movlw	d'5'
			subwf	ertek
			goto	Adatkonvertálás_tizedV	




				
ASCI_konvertalas

			movf	egeszV,W
			addlw 	b'00110000'
			movwf 	ASCI_egeszV

			movf	tizedV,W
			addlw 	b'00110000'
			movwf 	ASCI_tizedV

;---------------------------------------------------------------------
;"termosztát":   
;---------------------------------------------------------------------

futés_be_kapcsolása
			movlw	d'102'
			cpfslt	ertek_termosztát
			goto	futés_ki_kapcsolasa
			call	futés_be


futés_ki_kapcsolasa

			movlw	d'153'
			cpfsgt	ertek_termosztát
			goto	Adatkiirasa
			call	futés_ki
									

;---------------------------------------------------------------------
;LCD-re kiíratás:   
;---------------------------------------------------------------------

Adatkiirasa
			bcf     LATE,RS		 				;címezésbe kapcsolok
            movlw   1                           ; 01h, Display clear
            rcall   Write
			rcall	Kesl21						;törlés után kell egy kis ido, h magához térjen a kijelzo ( több mint írás után)
			movlw   129							;LCD elso sor elso karaktere 128
			rcall   Write
			bsf     LATE,RS         			; adatot írok be
			movf	ASCI_egeszV,WREG
			rcall	Write
			movlw	','
			rcall	Write
			movf	ASCI_tizedV,WREG
			rcall	Write
			movlw	'V'
			rcall	Write
			movf	futés,w
			rcall	Write

Időzito
decfsz Timer1
goto	Időzito
decfsz	Timer2
goto	Időzito





			goto	Start
			









;-------------------------------------------------------------------------------
;---------------------------- SZUBRUTINOK --------------------------------------
;-------------------------------------------------------------------------------
;
;-------------------------------------------------------------------------------
; LCD írás lépései:
; -----------------
;   1/   RS, R/W beállítása
;   2/   E=1
;   3/   adat kiküldés
;   4/   késleltetés (100us)
;   5/   E=0
;
Write
            movwf   PORTD;LATD
            bsf     LATE,E
            rcall   Kesl100                     ; Busy flag olvasását "helyettesíti"
            bcf     PORTE,E
            return
;-------------------------------------------------------------------------------
Kesl100
            movlw   165                         ; 100us késleltetés
            movwf   Timer1
Kesl1
            decfsz  Timer1,1
            bra     Kesl1
            return
;-------------------------------------------------------------------------------
Kesl2
            clrf    Timer1                      ; 2ms késleltetés
            movlw   20
            movwf   Timer2
Kesl21
            rcall   Kesl100
            decfsz  Timer2,1
            bra     Kesl21
            return
;-------------------------------------------------------------------------------
Kesl
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            return                              ; 5x2ms késleltetés
;-------------------------------------------------------------------------------

futés_ki
			movlw	' '
			movwf	futés
			return
;-------------------------------------------------------------------------------

futés_be
			movlw	b'11111111'
			movwf	futés
			return
;-------------------------------------------------------------------------------






;====[ M E G S Z A K Í T Á S   K I S Z O L G Á L Ó   R U T I N O K ]====
;=============[ Magas prioritású megsz. kiszolgáló rutin ]==============


;A PWM kitöltés frissítéséhez a TMR2 túlcsordulása (új PWM ciklus)
;	és a INT0 bemenet okoz magas szintű megszakítást
IT_H_SERVICE


	RETFIE	FAST					;Visszatérés, STATUS, W, és BSR visszaállítása 	

;--------------------[ REGISZTEREK VISSZAALLITASA ]---------------------
IT_H_END

	RETFIE	FAST					;Visszatérés, STATUS, W, és BSR visszaállítása 

;============[ Alacsony prioritású megsz. kiszolgáló rutin ]============

IT_L_SERVICE


	RETFIE

;=======================================================================
        end






