;;; ************************************************************
;;; Hlasic teplot
;;;JKP 011207  PIC16F628A
;;; ************************************************************

       LIST P=16F628A, R=DEC    ; Use the PIC16F628 and decimal system

	#include "P16F628A.INC"  ; Include header file
	
       __config  _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON

RAM	EQU	H'20'		; definice 1. registru pameti pro 16F628A
W_BKP	EQU	RAM		; zaloha registru W
S_BKP	EQU	RAM+1		; zaloha registru STATUS
PCL_BKP	EQU	RAM+2		; zaloha registru PCLATH
TMP0	EQU	RAM+3		; registr pro cekaci smycku
TMP1	EQU	RAM+4		; registr pro cekaci smycku
TMP2	EQU	RAM+5		; registr pro cekaci smycku
TMP3	EQU	RAM+6		; registr pro ulozeni stavu portu B
TMP4	EQU	RAM+7		; registr pro ulozeni obsahu W
TMP5	EQU	RAM+8		; registr pro smycku 3x
TMP6	EQU	RAM+9		; registr pro smycku 10x
TMP7	EQU	RAM+10		; registr pro smycku 30x
TMP8	EQU	RAM+11		; registr pro smycku 90x
;-----------------------------------------------------------
STAVY	EQU	RAM+12		; SLEDUJE CHOVANI A URCUJE FUNKCE
POCET1	EQU	RAM+13 		; REGISTR POCITAJICI POCET PIPNUTI PRISLUSNEHO OUT
POCET2	EQU	RAM+14 		; REGISTR POCITAJICI POCET PIPNUTI PRISLUSNEHO OUT 
POCET3	EQU	RAM+15 		; REGISTR POCITAJICI POCET PIPNUTI PRISLUSNEHO OUT
KOLIK	EQU	RAM+16 		; REGISTR UCHOVAVAJICI HODNOTU POCTU PIPNUTI DLE JUMPERU (NASTAVUJE SE PO STARTU PROGRAMU)
;-----------------------------------------------------------

#DEFINE IN1	PORTB,3		; definice bitu pro obsluhu vstupu1
#DEFINE IN2	PORTB,1		; definice bitu pro obsluhu vstupu2
#DEFINE IN3	PORTB,0		; definice bitu pro obsluhu vstupu3
#DEFINE J1	PORTB,5		; definice bitu pro obsluhu jumperu1
#DEFINE J2	PORTB,4		; definice bitu pro obsluhu jumperu2
#DEFINE BUZZ	PORTA,2		; definice bitu pro obsluhu bzucaku
#DEFINE RELE1	PORTA,6		; definice bitu pro obsluhu rele1
#DEFINE RELE2	PORTA,7		; definice bitu pro obsluhu rele2
#DEFINE RELE3	PORTA,0		; definice bitu pro obsluhu rele3
;
; -----------
; INITIALIZE
; -----------
;
       ORG    0x000           ; Program starts at 0x000

       
	CLRF   PORTA           ; Initialize port A
       CLRF   PORTB           ; Initialize port B


       BSF    STATUS,RP0      ; RAM bank 1

       MOVLW B'00000000'	;  piny portu A jako výstup
	MOVWF TRISA		; nastaveni portu A 
	MOVLW B'00111011'	; piny portu B jako vstup
	MOVWF TRISB		; nastaveni portu B 
       BCF    STATUS,RP0      ; RAM bank 0
;
; ------------------------
; FUNCTION OF PORT A PINS
; ------------------------
;
       MOVLW    7
       MOVWF    CMCON         ; Comparators off, all pins digital I/O
;
; ----------
; MAIN 
; ----------
;

START
;   GOTO JUMPERY 	;PRESKOCENI DEMA PRI LADENI
	MOVLW	D'3'
	MOVWF	TMP5
demo	NOP
	BSF	RELE1
	BSF	RELE2
	BSF	RELE3
	BSF	BUZZ
	CALL	CEK1S	
	BCF	RELE1
	BCF	RELE2
	BCF	RELE3
	BCF	BUZZ
	CALL	CEK05S
	DECFSZ	TMP5,F	
	GOTO	demo
;------------------------------------	
;NASTAVENI DLE JUMPERU
JUMPERY
	BTFSC	J1	;
	GOTO	$+6	;J1=1
	MOVLW	D'4'	;J2=0 // J1=0
	BTFSC	J2	;
	MOVLW	D'11'	;J2=1 // J1=0
	MOVWF	KOLIK
	GOTO	PREDNASTAVENI
;------------------------	
	MOVLW	D'31'	;J2=0 // J1=1
	BTFSC	J2	;
	MOVLW	D'91'	;J2=1 // J1=1
	MOVWF	KOLIK
;	GOTO	PREDNASTAVENI
;------------------------------------	
PREDNASTAVENI
	MOVWF	POCET1 	;TOTO POUZE PRO PRIPAD, ZE HNED PO ZAPNUTI BUDE LOG.0 NA VSTUPU (NESTIHNE ANI JEDNOU PROJET HL. SMYCKA) 
	MOVWF	POCET2 	;TOTO POUZE PRO PRIPAD, ZE HNED PO ZAPNUTI BUDE LOG.0 NA VSTUPU (NESTIHNE ANI JEDNOU PROJET HL. SMYCKA) 
	MOVWF	POCET3 	;TOTO POUZE PRO PRIPAD, ZE HNED PO ZAPNUTI BUDE LOG.0 NA VSTUPU (NESTIHNE ANI JEDNOU PROJET HL. SMYCKA) 
	CLRF	STAVY  	;VYCHOZI NASTAVENI STAVU
;------------------------------------	
HL_SMYCKA
	BTFSS	IN1
	CALL	OSETRI_VST1
	BTFSS	IN1
	GOTO 	$+5
	BCF	RELE1
	BCF	STAVY,1
	MOVF	KOLIK,W
	MOVWF	POCET1

	BTFSS	IN2
	CALL	OSETRI_VST2
	BTFSS	IN2
	GOTO 	$+5
	BCF	RELE2
	BCF	STAVY,2
	MOVF	KOLIK,W
	MOVWF	POCET2

	BTFSS	IN3
	CALL	OSETRI_VST3
	BTFSS	IN3
	GOTO 	$+5
	BCF	RELE3
	BCF	STAVY,3
	MOVF	KOLIK,W
	MOVWF	POCET3

	BTFSS	STAVY,0
	GOTO	HL_SMYCKA

	BTFSS	STAVY,7 ; PREPINA MULTIVYBRATOR 0,5S OFF/ 1S ON
	GOTO	MULTI_ON
	CALL	CEK05S ;OFF  REALITA JE 380,957ms!!
	BCF	STAVY,7
	GOTO	HL_SMYCKA

MULTI_ON	
	CALL	CEK1S ;ON  ; OPRAVDU 1s 
	BSF	STAVY,7
	GOTO	HL_SMYCKA

;------------------------------------
;STAVY:
  ;1=0 IN1 blikat ; 1=IN1 DRZI UROVEN
  ;2=0 IN2 blikat ; 1=IN2 DRZI UROVEN
  ;3=0 IN3 blikat ; 1=IN3 DRZI UROVEN
OSETRI_VST1
	BTFSS	STAVY,1	;BLIKEJ (OUT1)
	GOTO 	BLIKAT_IN1
	RETURN	

OSETRI_VST2
	BTFSS 	STAVY,2	;BLIKEJ (OUT2)
	GOTO 	BLIKAT_IN2
	RETURN	

OSETRI_VST3
	BTFSS 	STAVY,3	;BLIKEJ (OUT3)
	GOTO 	BLIKAT_IN3
	RETURN		
;------------------------------------
BLIKAT_IN1
	BSF	STAVY,0	;POMOCNY bit KDYZ NENI NASTAVEN NEMUSI SE CYKLOVAT 1s/0,5s 
	BTFSC	STAVY,7 ;JE PAUZA ZVUKU NEBO MLCENI
	GOTO	BLIKAT_IN1B
	BSF	RELE1
	DECFSZ	POCET1,F
	GOTO	BLIKAT_IN1A
	BSF	STAVY,1	;PRESTAN BLIKAT (OUT1)
	BCF	BUZZ
	BCF	STAVY,0
	RETURN	

BLIKAT_IN1A
	BSF	BUZZ
	RETURN

BLIKAT_IN1B ;PAUZA PRI BLIKANI
	BCF	RELE1
	BCF	BUZZ
	RETURN

;------------------------------------
BLIKAT_IN2
	BSF	STAVY,0	;POMOCNY bit KDYZ NENI NASTAVEN NEMUSI SE CYKLOVAT 1s/0,5s 
	BTFSC	STAVY,7 ;JE PAUZA ZVUKU NEBO MLCENI
	GOTO	BLIKAT_IN2B
	BSF	RELE2
	DECFSZ	POCET2,F
	GOTO	BLIKAT_IN2A
	BSF	STAVY,2	;PRESTAN BLIKAT (OUT2)
	BCF	BUZZ
	BCF	STAVY,0
	RETURN	

BLIKAT_IN2A
	BSF	BUZZ
	RETURN

BLIKAT_IN2B ;PAUZA PRI BLIKANI
	BCF	RELE2
	BCF	BUZZ
	RETURN

;------------------------------------
BLIKAT_IN3
	BSF	STAVY,0	;POMOCNY bit KDYZ NENI NASTAVEN NEMUSI SE CYKLOVAT 1s/0,5s 
	BTFSC	STAVY,7 ;JE PAUZA ZVUKU NEBO MLCENI
	GOTO	BLIKAT_IN3B
	BSF	RELE3
	DECFSZ	POCET3,F
	GOTO	BLIKAT_IN3A
	BSF	STAVY,3	;PRESTAN BLIKAT (OUT3)
	BCF	BUZZ
	BCF	STAVY,0
	RETURN	

BLIKAT_IN3A
	BSF	BUZZ
	RETURN

BLIKAT_IN3B ;PAUZA PRI BLIKANI
	BCF	RELE3
	BCF	BUZZ
	RETURN
; -------------------------------------------------------------------------------------------
; -------------------------------------------------------------------------------------------
;REALITA JE 380,957ms!!
CEK05S	MOVLW H'8'
        MOVWF TMP2
        MOVLW H'59'
        MOVWF TMP1
        MOVLW H'B1'
        MOVWF TMP0

        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-5
        DECFSZ TMP2,F
        GOTO $-9
	RETURN
; -------------------------------------------------------------------------------------------
; cekaci smycka 1 s
; -------------------------------------------------------------------------------------------
CEK1S   MOVLW H'15'
        MOVWF TMP2
        MOVLW H'59'
        MOVWF TMP1
        MOVLW H'B1'
        MOVWF TMP0

        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-5
        DECFSZ TMP2,F
        GOTO $-9
	RETURN
; -------------------------------------------------------------------------------------------
	END