	list		p=18f4525	
	#include	<p18f4525.inc>

; *********************************************************
; A legeslegujabb autoNYAK, 18f4525-hoz 2007.04.18
; kulso 18.32MHz, timer3-as utemado, 32 byte-ot elkuld, meg fogad is par bitet
; 1 wire DS18B20-as homerokkel
; a 2. AD interruptban (kezelo), a tobbi sima AD olvasas
; ; *********************************************************

;RA0 - analog akkufesz 
;RA1 - analog megvilagitas
;RA2 - analog rezisztiv kezeloszervek 220,510,1K2,2K2,4K7,8K2,12K,22K
;RA3 - 1-wire ds1820-asok portja
;RA4 - speed signal in		timer0 counter mode
;RA5 - ATX on/off

;RE0 - tv on/off
;RE1 - amp on/off
;RE2 - tv source computer/rear cam

;RC0 - rpm signal in           timer1 counter mode
;RC1 - speeddisp data
;RC2 - speeddisp enable
;RC3 - PP AUTO - datain
;RC4 - PP STROBE - strobe
;RC5 - PP pe - acknowledgement
;RC6 - speeddisp clock
;RC7 - speeddisp latch

;RD0-7 - PP data bits 0-7

;RB0 - zoldled - irq *ures*
;RB1 - input 1
;RB2 - input 2
;RB3 - input 3
;RB4 - input 4
;RB5 - prog M
;RB6 - prog Clock
;RB7 - prog Data + LED

#define Speeddisprele	PORTC,2
#define Speeddisp_latch	PORTC,7
#define Speeddisp_data	PORTC,1
#define Speeddisp_clk	PORTC,6

#define Data_pin	PORTA,3   ;1-wire communication port
#define Data_pin_dd	TRISA,3   ;1-wire comm data direction bit
#define Datain		PORTC,3
#define Strobe		PORTC,4
#define Acknowledge	PORTC,5
#define zoldled		PORTB,0

#define ATXrele		PORTA,5
#define TVrele		PORTE,0
#define AMPrele		PORTE,1
#define videorele	PORTE,2

#define irqin		PORTB,0
#define input1		PORTB,1
#define input2		PORTB,2
#define input3		PORTB,3
#define input4		PORTB,4


;***** VALTOZOK
cblock 0x00

idegw
idegb
idegs
TEMP1
TEMP2
TEMP3
villan
irqcounter
ciklusszamolo
irqsercikszamolo
ERTEK
IDEGL
IDEGH
hanyadik
siftreglo
siftreghi
CIKLO1
speedlo
speedhi
rpmlo
rpmhi
pulselo
pulsehi
pulse2lo
pulse2hi
idegszam
szepite
szam1
szam2
szam3
szam4
magaaszam
szamciklus
INDEX
I_BYTE
O_BYTE
LOOP1
TEMP
delawar
adnil
adnih
haslo
hashi
gomb

ertek00lo
ertek00hi
ertek01lo
ertek01hi
ertek02lo
ertek02hi
ertek03lo
ertek03hi
ertek04lo
ertek04hi
ertek05lo
ertek05hi
ertek06lo
ertek06hi
ertek07lo
ertek07hi
ertek08lo
ertek08hi
ertekspeedlo
ertekspeedhi
ertekrpmlo
ertekrpmhi
ertekpulselo
ertekpulsehi
ertekpulse2lo
ertekpulse2hi
serialinput
ertek13hi
ertek14lo
ertek14hi
endc
                            
timediv=24	;persze hexaban van!
     
;****** MAKROK

ack_hi MACRO
	bsf Acknowledge
	ENDM
ack_lo MACRO
	bcf Acknowledge
	ENDM

rombyte MACRO bertek
     mov  O_BYTE,bertek
     call   OUT_BYTE
	ENDM

;**********************************************************************
ORG 0x0000
	goto Start
org 0x0008
	goto interup	;high priority interrupt, compatibility int.
org 0x0018
	retfie		;low priority interrupt

ORG 0x002A

;--------------------------------------------------------------- Progi jon!
	; Start application beyond vector area
tablazat
	andlw 0f
	movwf idegszam

nemnyulla
	mov szepite,0
	clc
	rlcf idegszam
	movf idegszam,W 
	nop
	addwf PCL

dt B'11101110'	;0
dt B'01100000'	;1
dt B'11011100'	;2
dt B'11111000'	;3
dt B'01110010'	;4
dt B'10111010'	;5
dt B'10111110'	;6
dt B'11100000'  ;7
dt B'11111110'	;8
dt B'11111010'  ;9
dt B'11110110'	;a
dt B'01111100'	;b
dt B'00111000'	;c
dt B'00111110'	;d
dt B'11111000'	;e
dt B'11110000'	;f
dt B'00000000'	;abszolut semmi


;----------------------------------------------------------- IRQ-k jonnek-----
interup:
	bcf INTCON,GIE		;disable interupts
	movwf idegw		;save w
	movbb idegs,STATUS      ;save status
	movbb idegb,BSR
	btfsc PIR1,ADIF		;AD esemeny van-e
	 jmp konverziokhoz
	btfss PIR2,TMR3IF	;timer3 lefutot esemeny van-e
	 jmp vegeterirq
	bcf PIR2,TMR3IF		;clear timer3 interupt flag
	decfsz villan           ;decrease timecounter
	jmp vegeterirq
	mov villan,timediv	;reload timecounter if overran

	movbb speedlo,TMR0L
	movbb speedhi,TMR0H
	movbb rpmlo,TMR1L
	movbb rpmhi,TMR1H
	clrf TMR0H
	clrf TMR0L
	clrf TMR1H
	clrf TMR1L

	movf speedlo,W
	carry0
	addwf pulselo,f	;sum pulses32
	skipc	
	jmp nemnovelhit
	movlw 1
	carry0
	addwf pulsehi,f
	skipnc
	call hiwordnovel
nemnovelhit
	movf speedhi,W
	carry0
	addwf pulsehi,f
	skipnc
	call hiwordnovel

	btfss input1	;a tolatas bemenete
	jmp nemtolat
	bsf videorele
	jmp tovaser
nemtolat
	bcf videorele
tovaser
	incf irqcounter	
	btfsc irqcounter,0
	jmp leddki
	bsf zoldled		;LED flash
	jmp vegeterirq
leddki
	bcf zoldled
vegeterirq

	movbb BSR,idegb		;restore bank select register
	movbb STATUS,idegs	;restore status
	movf idegw,w            ;restore w
	bsf INTCON,GIE          ;enable interrupts
	retfie                  ;ret from interrupt

hiwordnovel
	movlw 1
	carry0
	addwf pulse2lo,f
	skipnc
	incf pulse2hi,f	
	ret

konverziokhoz
	bcf PIR1,ADIF	;ha igen, torlom a bitet
	movbb adnil,ADRESL
	movbb adnih,ADRESH
	clc
	rrcf adnih
	rrcf adnil
	clc
	rrcf adnih
	rrcf adnil
	clc
	rrcf adnih
	rrcf adnil

	movlw D'126'
	cpfseq adnil
	jmp nemjog1
	jmp jogomb
nemjog1
	movlw D'124'
	cpfseq adnil
	jmp nemjog2
	jmp jogomb
nemjog2
	movlw D'121'
	cpfseq adnil
	jmp nemjog3
	jmp jogomb
nemjog3
	movlw D'116'
	cpfseq adnil
	jmp nemjog4
	jmp jogomb
nemjog4
	movlw D'105'
	cpfseq adnil
	jmp nemjog5
	jmp jogomb
nemjog5
	movlw D'93'
	cpfseq adnil
	jmp nemjog6
	jmp jogomb
nemjog6
	movlw D'82'
	cpfseq adnil
	jmp nemjog7
	jmp jogomb
nemjog7
	movlw D'63'
	cpfseq adnil
	jmp nemjogomb
jogomb
	movbb gomb,adnil
nemjogomb
	mov ADCON0,B'00001001'	;megadjuk a 2. csatornat es engedelyezzuk
	bsf ADCON0,GO			;es inditjuk ujra
	jmp vegeterirq

;--------------------------------------------------------------- Progi jon!

Start
	lfsr FSR0,ertek00lo	;elso ertek cime 
	mov ciklusszamolo,20	;32 hex
toroldcsak
	clrf POSTINC0
	decfsz ciklusszamolo	
	jmp toroldcsak

	clrf irqcounter
	mov villan, timediv
	clrf	PORTA
	clrf	PORTB
        clrf    PORTC	;minden port torlese
	clrf	PORTD
	clrf	PORTE

	mov OSCCON, B'11110000'	
	mov TRISA, B'00011111'	;PortA 5 kimenet 
	mov TRISB, B'01111110'	;PortB 0,7 kimenet
	mov TRISC, B'00011001'	;PortC kimenet, a 0,3,4 bemenetek
	mov TRISD, B'00000000'  ;PortD teljesen kimenet
	mov TRISE, B'00000000'	;PortE 0,1,2 kimenet

	mov ADCON0,B'00001001'	;Az AD be, 2.csatorna
	mov ADCON1,B'00001100'	;Az elso 3 analog, a tobbi digitalis
	mov ADCON2,B'10111110'	;left just,20 TAD, osc/64.

	mov T0CON,B'10111000'	;enab,16bit,pin,hi-lo,no prescaler
	mov T1CON,B'10000111'	;16bit,x,presc1:1,osc off,nosync,pin,enab
	clrf TMR1H
	clrf TMR1L
	clrf TMR0H
	clrf TMR0L
	clrf TMR3H
	clrf TMR3L
	mov T3CON,B'00000101'	;enable tmr3,internal clk,8bit mode,prescaler 1:1
	bsf PIE2,TMR3IE		;enable tmr3 interrupt
	bsf INTCON, PEIE        ;enable peripheral interrupts like tmr3
        bsf PIE1,ADIE   	;enable AD interrupt
	bsf INTCON,GIE		;enable general interrupt

indulas
	movbb ertek02lo,gomb
	mov ertek02hi,0
	call ADolvaso
	call rutin1820_konverzio_indito
	mov ERTEK,0aa
	call SENDCHAR
	mov ERTEK,055
	call SENDCHAR

	movbb ertekspeedlo,speedlo
	movbb ertekspeedhi,speedhi
	movbb ertekrpmlo,rpmlo
	movbb ertekrpmhi,rpmhi
	movbb ertekpulselo,pulselo
	movbb ertekpulsehi,pulsehi
	movbb ertekpulse2lo,pulse2lo
	movbb ertekpulse2hi,pulse2hi

	clrf pulselo		;torlo
	clrf pulsehi
	clrf pulse2lo
	clrf pulse2hi
	clrf szam1
	clrf szam2
	clrf szam3
	clrf szam4

elkuldesek
	lfsr FSR0,ertek00lo	;elso ertek cime 
	mov ciklusszamolo,21;	;dec 33
kulddcsak
	movbb ERTEK, POSTINC0
	call SENDCHAR
	decfsz ciklusszamolo	
	jmp kulddcsak

	clrf gomb

	incf ertek01hi
	decfsz ertek01hi
	jmp vilagos
        bcf TRISC,1
        bcf TRISC,6
        bcf TRISC,7
        bsf Speeddisprele
	call speeddisp 	;kijelzi amit kaptam
	jmp tovafut
vilagos
        bcf Speeddisprele
        bsf TRISC,1
        bsf TRISC,6
        bsf TRISC,7
 tovafut
	call rutin1820_homerseklet_beolvaso
	jmp indulas

;------------------------------------------------------------------------------

SENDCHAR
clkhirevar
	btfss Strobe	;strobe hi-re var
	goto clkhirevar
	movbb PORTD,ERTEK

	clc
	btfsc Datain
	stc
	rrcf szam1
	rrcf szam2
	rrcf szam3
	rrcf szam4
	clc

        ack_hi
clkloravar
	btfsc Strobe	;strobe lo-re var
	goto clkloravar
	ack_lo
	ret	

EEprom_in
	movwf EEADR
	clrf EEADRH
	bcf EECON1,EEPGD
	bcf EECON1,CFGS
	bsf EECON1,RD
	movf EEDATA,W
	ret

;-----------------------------

ADolvaso
       bcf PIE1,ADIE   	;disable AD interrupt
	mov ADCON0,B'00000001'	;az AD be, channel 0
	call adcsatbe
	movbb ertek00lo,ADRESL
	movbb ertek00hi,ADRESH

	mov ADCON0,B'00000101'	;az AD be, channel 1
	call adcsatbe
	movbb ertek01lo,ADRESL
	movbb ertek01hi,ADRESH

       bsf PIE1,ADIE   	;enable AD interrupt
	mov ADCON0,B'00001001'	;az AD be, channel 2	- persze a megszakitashoz
	bsf ADCON0,GO
	ret

adcsatbe
	bsf ADCON0,GO
advar
	btfsc ADCON0,DONE
	jmp advar
	ret

;-----------------------------

szunet
	movbb TEMP2,12h
cimke3
       mov TEMP1,0ffh
cimke4
       decfsz  TEMP1, F
       jmp    cimke4
       decfsz  TEMP2, F
       jmp    cimke3
       ret

warj
	mov TEMP1,0ff
	
lop2
       decfsz  TEMP1, F
       goto    lop2
       ret


speeddisp
	bcf Speeddisp_latch

	mov szepite,1

;	movlw 0		;az elso szamjegy ures, nem 0
;	call digitki

	movf szam1,w
	call tablazat
	movwf magaaszam
	call digitki

	movf szam2,w
	call tablazat
	movwf magaaszam
	call digitki
	
;	mov szepite,0
	movf szam3,w
	call tablazat
	movwf magaaszam
	call digitki
	  	
	movf szam4,w
	call tablazat
	movwf magaaszam
	call digitki
	  	
	bsf Speeddisp_latch
	ret

digitki
	mov szamciklus,8
   magacik
	bcf Speeddisp_data	
	clc
	rrcf magaaszam,f
	skipnc
	bsf Speeddisp_data
	nop
	bsf Speeddisp_clk
	nop
	bcf Speeddisp_clk
	decfsz szamciklus
	jmp magacik

	ret

;------------------------------------------------------------------------------


rutin1820_konverzio_indito
        bcf PIE1,ADIE   	;disable AD interrupt
     call   INIT		; init DS1820
     mov  O_BYTE,0cch	;skip rom ALL devices
     call   OUT_BYTE
     mov  O_BYTE,44h	;temp conv ALL devices
     call   OUT_BYTE
        bsf PIE1,ADIE   	;enable AD interrupt
	ret

rutin1820_homerseklet_beolvaso
;     call   WAIT 	     	; wait for conversion to complete
        bcf PIE1,ADIE   	;disable AD interrupt
     call   INIT
     mov  O_BYTE,055h	;rom match
     call   OUT_BYTE
	call pottyos
     mov  O_BYTE,0beh
     call   OUT_BYTE
     call   IN_BYTE
     movwf  ertek03lo
     call   IN_BYTE
     movwf  ertek03hi

     call   INIT
     mov  O_BYTE,055h	;rom match
     call   OUT_BYTE
	call reszelt
     mov  O_BYTE,0beh
     call   OUT_BYTE
     call   IN_BYTE
     movwf  ertek04lo
     call   IN_BYTE
     movwf  ertek04hi

     call   INIT
     mov  O_BYTE,055h	;rom match
     call   OUT_BYTE
	call rovid
     mov  O_BYTE,0beh
     call   OUT_BYTE
     call   IN_BYTE
     movwf  ertek05lo
     call   IN_BYTE
     movwf  ertek05hi

     call   INIT
     mov  O_BYTE,055h	;rom match
     call   OUT_BYTE
	call hosszu
     mov  O_BYTE,0beh
     call   OUT_BYTE
     call   IN_BYTE		; get from DS1820 and save
     movwf  ertek06lo
     call   IN_BYTE
     movwf  ertek06hi
        bsf PIE1,ADIE   	;enable AD interrupt
ret



; Standard 1-Wire routines ------------------------------------------------

INIT:
     call   pin_input
     call   pin_output		;force low 
     movlw  D'50'              ; 500 us delay
     call DELAY_10USEC
     call pin_input           	;release pin
     movlw  D'10'              ; 100 us delay
     call DELAY_10USEC
     btfss Data_pin
	nop	
     movlw  D'50'       ; 500 usec delay
     call DELAY_10USEC
     ret

WAIT:        
     call   IN_BYTE
     movlw  0FFH
     subwf  I_BYTE, W
     btfss  STATUS, Z
     jmp   WAIT
     ret  

IN_BYTE:                   ; returns byte in W
     mov INDEX,8
     clrf I_BYTE

 bajtotbevesz:
     call pin_output         ; momentary low on DATA_PIN
     	nop
	nop
     call pin_input

	mov delawar,8	;wait
      delava1
	nop
	decfsz delawar
	jmp delava1

	clc
     btfsc Data_pin
	stc
     rrcf    I_BYTE, F
     movlw  6              ; now delay 60 usecs
     call   DELAY_10USEC
     decfsz INDEX, F
     jmp   bajtotbevesz

     movf I_BYTE,w         ; return the result in W
     ret

OUT_BYTE:
     mov INDEX,8
  bajtkitolo_1:
     rrcf    O_BYTE, F
     btfss  STATUS, C
     jmp   OUT_0
     jmp   OUT_1     
 kitolovissza:
     decfsz    INDEX, F
     jmp   bajtkitolo_1
     ret

OUT_0:
     call   pin_output         	; bring DATA_PIN low
     movlw  6 		       	; for 60 usecs
     call   DELAY_10USEC
     call   pin_input
     jmp   kitolovissza

OUT_1:
     call pin_output         	; momentary low
	nop
	nop
	nop
	nop
     call   pin_input
     movlw 6
     call DELAY_10USEC
     jmp   kitolovissza

;;;;;;

pin_input:
     bsf  Data_pin_dd       ; high impedance
     ret

pin_output:
     bcf  Data_pin_dd       ; low impedance zero
     bcf  Data_pin
     ret

DELAY_10USEC:  ; provides a delay equal to W * 10 usecs
     movwf LOOP1
   varcik1:
	mov delawar,10
      delavara
	nop
	decfsz delawar
	jmp delavara
     decfsz LOOP1, F
     jmp varcik1
     ret

rovid
	rombyte 010h
	rombyte 0a3h
	rombyte 04ch
	rombyte 0ffh
	rombyte 000h
	rombyte 008h
	rombyte 000h
	rombyte 0abh
	ret

hosszu
	rombyte 010h
	rombyte 034h
	rombyte 09bh
	rombyte 0ffh
	rombyte 000h
	rombyte 008h
	rombyte 000h
	rombyte 090h
	ret

pottyos
	rombyte 010h
	rombyte 091h
	rombyte 042h
	rombyte 0ffh
	rombyte 000h
	rombyte 008h
	rombyte 000h
	rombyte 08ah
	ret

reszelt
	rombyte 010h
	rombyte 036h
	rombyte 053h
	rombyte 0ffh
	rombyte 000h
	rombyte 008h
	rombyte 000h
	rombyte 0e2h
	ret

;------------------------------------------------------------------------------
	END 


