
;**********************************************************************
;                                                                     *
;    Filename:PIC12HV615.asm                                       *
;    Date:    26.11.2010                                              *
;    File Version: 1.00                                               *
;                                                                     *
;    Author:    I.Levrinc                                             *
;    Company:   LEVEL                                                *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required:                                                  *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************


 list      p=12HV615            ; list directive to define processor
 #include <p12HV615.inc>        ; processor specific variable definitions
	
 __CONFIG   _CP_OFF & _MCLRE_OFF & _WDT_OFF &  _PWRTE_ON & _INTRC_OSC_NOCLKOUT 


;***** COMPILATOR VARIABLES
F675		EQU	1	;pre F629 daj 0

;***** VARIABLE DEFINITIONS
w_temp		EQU     	0x7E        ; variable used for context saving 
status_temp	EQU     	0x7F        ; variable used for context saving		
SGPIO		EQU	0x7D
AGPIO		EQU	0x7C
WAITH		EQU	0x7B
WAITL		EQU	0x7A
COUNTWAIT		EQU	0x79
WGPIO		EQU	0x78	;pracovny GPIO
SHR		EQU	0x77
PAR		EQU	0x76
BITC		EQU	0x75
TAKTC		EQU	0x74
SYNCHR		EQU	0x73	;pocitadlo pre synchronizaciu
STM		EQU	0x72	;stav register
;STM register
DSWUP		EQU	7
DGRUP		EQU	6

;GPregister vstupy/vystupy
;VSS			;pin8
;FREE		EQU	0	;pin7
LED		EQU	1	;pin6
REVGEAR		EQU	2	;pin5
MCLR		EQU	3	;pin4
SEROUT		EQU	4	;pin3
SWITCH		EQU	5	;pin2
;VCC			.pin1

; prepinanie bank
b0		EQU	0
b1		EQU	H'80'


; INTCON
 #define _GIE_C		bcf	INTCON,GIE
 #define _GIE_S		bsf	INTCON,GIE

 #define _PEIE_C		bcf	INTCON,PEIE
 #define _PEIE_S		bsf	INTCON,PEIE

 #define _INTE_C		bcf	INTCON,INTE
 #define _INTE_S		bsf	INTCON,INTE

 #define _INTF_C		bcf	INTCON,INTF
 #define _INTF_TSC		btfsc	INTCON,INTF		
 #define _INTF_TSS		btfss	INTCON,INTF
;T1CON
 #define _TMR1ON_S		bsf	T1CON,TMR1ON
 #define _TMR1ON_C		bcf	T1CON,TMR1ON

; 
 #DEFINE _TMR1IF_C		bcf	PIR1,TMR1IF
 #DEFINE _TMR1IF_TSC	btfsc	PIR1,TMR1IF
 #DEFINE _TMR1IF_TSS	btfss	PIR1,TMR1IF

 
 
;GPIO
 #define _SOUT_S		bsf	GPIO,SEROUT
 #define _SOUT_C		bcf	GPIO,SEROUT
 #define _SOUT_TSS		btfss	GPIO,SEROUT
 #define _SOUT_TSC		btfsc	GPIO,SEROUT

 #define _LED_S		bsf	GPIO,LED
 #define _LED_C		bcf	GPIO,LED
 #define _LED_TSS		btfss	GPIO,LED
 #define _LED_TSC		btfsc	GPIO,LED

 #define _AGR_S		bsf	AGPIO,REVGEAR
 #define _AGR_C		bcf	AGPIO,REVGEAR
 #define _AGR_TSS		btfss	AGPIO,REVGEAR
 #define _AGR_TSC		btfsc	AGPIO,REVGEAR
 
 #define _SGR_S		bsf	SGPIO,REVGEAR
 #define _SGR_C		bcf	SGPIO,REVGEAR
 #define _SGR_TSS		btfss	SGPIO,REVGEAR
 #define _SGR_TSC		btfsc	SGPIO,REVGEAR

 #define _ATL_S		bsf	AGPIO,SWITCH
 #define _ATL_C		bcf	AGPIO,SWITCH
 #define _ATL_TSS		btfss	AGPIO,SWITCH
 #define _ATL_TSC		btfsc	AGPIO,SWITCH

 #define _STL_S		bsf	SGPIO,SWITCH
 #define _STL_C		bcf	SGPIO,SWITCH
 #define _STL_TSS		btfss	SGPIO,SWITCH
 #define _STL_TSC		btfsc	SGPIO,SWITCH


;STATUS

 #define _Z_TSC		btfsc	STATUS,Z
 #define _Z_TSS		btfss	STATUS,Z
 
 #define _C_TSC		btfsc	STATUS,C
 #define _C_TSS		btfss	STATUS,C

 #define _C_C		bcf	STATUS,C
 #define _C_S		bsf	STATUS,C

 #define _RP0_C		bcf	STATUS,RP0
 #define _RP0_S		bsf	STATUS,RP0

 #define _RP1_C		bcf	STATUS,RP1
 #define _RP1_S		bsf	STATUS,RP1

 #define _IRP_C		bcf	STATUS,IRP
 #define _IRP_S		bsf	STATUS,IRP
 
;STM
 #define _DSWUP_TSC		btfsc	STM,DSWUP
 #define _DSWUP_TSS		btfss	STM,DSWUP
 #define _DSWUP_C		bcf	STM,DSWUP
 #define _DSWUP_S		bsf	STM,DSWUP

 #define _DGRUP_TSC		btfsc	STM,DGRUP
 #define _DGRUP_TSS		btfss	STM,DGRUP
 #define _DGRUP_C		bcf	STM,DGRUP
 #define _DGRUP_S		bsf	STM,DGRUP

; #define _SYN_TSC		btfsc	STM,SYN
; #define _SYN_TSS		btfss	STM,SYN
; #define _SYN_C		bcf	STM,SYN
; #define _SYN_S		bsf	STM,SYN

;CONSTANS
Prvy		EQU	0x85
Druhy		EQU	0x40
Treti		EQU	0
Stvrty		EQU	0
Piaty		EQU	0x08	

LCHAR		EQU	8	;pocet bitov v znaku

;**********************************************************************
		ORG     0x000             ; processor reset vector
		goto    main              ; go to beginning of program


		ORG     0x004             ; interrupt vector location
		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register
isrMONOST




		nop




		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf	STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		retfie                    ; return from interrupt

main
;******************************************************
; inicializacia
;******************************************************
	call	IniSysMONOST
	call	Wait10ms
Cycle
	goto	cycle




	movfw	GPIO		;nacitaj GPIO a filtruj tlacidlo
	movwf	WGPIO

	call	Wait10ms
	movfw	GPIO
	movwf	AGPIO
	subwf	WGPIO,F
	_Z_TSS
	goto	Cycle		;kmita este raz 
	movwf	AGPIO		; plati
;-----------------------------------
;SLEDOVANIE TLACILA A REVGEAR
;----------------------------------
	_ATL_TSS
	goto	JeTlacidlo
	_STL_TSC
	goto	CumNaSpiatocku	;TL nic, pozri na GR
KoniecTL
	_TMR1ON_C		;Stop citaca TMR1
CumnaDSWUP		;ak je DSWUP bude sa zhadzovat ak uplynulo TMR1
	_DSWUP_TSS
	goto	NieJeDSWUP
	_TMR1IF_TSS
	goto	CumNaSpiatocku
ZasuvajOdTL		; svieti LED, je Dlho TL
	_LED_C
	_DSWUP_C
	_DGRUP_TSS	;preskoc zasunutie ak je DGRUP	
	call	PovelVon	;>>>>>>>>>>>>
	goto	CumNaSpiatocku
;-----------------
NieJeDSWUP
	_TMR1IF_TSC
	goto	CumNaSpiatocku
VysuvajOdTL		; podmienene 
	_LED_S
	_DSWUP_S
	_DGRUP_TSS	;preskoc lebo by display siel dole
Synchronx
	call	PovelVon	;>>>>>>>>>>>>
	goto	CumNaSpiatocku
Synchron
	decfsz 	SYNCHR,F
	goto	CumNaSpiatocku		
	goto	Synchronx	;posle display dole


;------------------------------------------
JeTlacidlo	; START TMR1 potom decf SYNCHR
		; po SYNHR=0 posle diplay dole
		; pustenim tlacidla sa dalsi povel ignoruje
		;      bez DSWUP je TMR1IF=ignoruj
	_STL_TSS
	goto	Synchron	;pocitaj dlzku stlacenia 6,5s
ZaciatokTL		;Nahodit TMT1 
	movlw	40	;
	movwf	SYNCHR
	clrf	TMR1L
	clrf	TMR1H
	_TMR1IF_C
	_TMR1ON_S			;zapnuty TMR1
	goto	CumNaSpiatocku
;----------------------------------------
;SPIATOCKA
CumNaSpiatocku
	_AGR_TSS
	goto	ASpiatockaNieJe
	_SGR_TSS
	goto	NabehlaSpiatocka
	goto 	TrvaloSpiatocka
;----------------------------------------
ASpiatockaNieJe
	_SGR_TSC
	goto	TerazPadlaSpiatocka
	goto	NieJeDlhoSpiatocka
;----------------------------------------
NabehlaSpiatocka
VysuvajOdSpiatocky
	_DGRUP_S
	_DSWUP_TSS	;preskoc otvaranie, leb by zavreko
	call	PovelVon	;>>>>>>>>>>>>>>>>>
	goto	DokonciCyk
;---------------------------------------
TerazPadlaSpiatocka
ZasuvajOdSpiatocky
	_DGRUP_C
	_DSWUP_TSS	;preskoc zatvorenie ak je DSWUP
	call	PovelVon	;>>>>>>>>>>>>>>>
	goto	DokonciCyk
;-----------------------------------------
; KONCOVY MODUL CYKLU
NieJeDlhoSpiatocka
TrvaloSpiatocka
JeDSWUPKratkoTLIgnoruj
NieJeDSWUPDlhoTLIgnoruj
PriSpiatockeIgnorujTL
TrvaloTL
DokonciCyk

	movlw	16	; cakacja cca 160ms
	movwf	COUNTWAIT	
WendCyc	call	Wait10ms
ms
	decfsz	COUNTWAIT,F
	goto	WendCyc


	movfw	AGPIO		; prepis A do S
	movwf	SGPIO
	goto	Cycle
;
;**********************************************************************
IniSysMONOST	;
;**********************************************************************
;ANSEL(9F)	vynuluj inak analog		

; GPIO(05H)  	0   	in
;		1	out	LED
;		2	in	REVGEAR
;		3	-	MCLR*
;		4	out	SEROUT
;		5	in	SWITCH
; TRISIO (85H)
; WPU (95H) all up	
	movlw	0X2D		;serout=1, LED=0
	movwf	GPIO		
;TMR1 nastavenie	pocita dlzku tlacidla (2 sekundy)
	movlw	B'00110100'	;1:8, INTERNAL, STOP
	movwf	T1CON
;GPIO
	banksel	b1	
	movlw	0X2D		; out gpio1=LED, gpio4=SEROUT
	movwf	TRISIO
	if F675==1
	clrf	ANSEL		;nebude analog pre 12F675 
	call	0x03FF
	movwf	OSCCAL
	endif	
;pociatocny stav
;STM register
	banksel	b0
	clrf	STM		;pociatocny stav po 15=power up

	movfw	GPIO		;pociatok 
	movwf	AGPIO
	movwf	SGPIO


	return
;***************************************************************
Wait10ms
;****************************************************************
	movlw	0x08
	movwf	WAITH
	movlw	0xC7
	movwf	WAITL
DecW
	nop
	nop
	decfsz	WAITL,F
	goto	DecW	
	decfsz	WAITH,F
	goto	DecW
	return

;***************************************************************
W416us
;****************************************************************
;w=Konst*5+3
	movlw	80
	movwf	TAKTC
W416
	nop
	nop
	decfsz	TAKTC,F
	goto	W416	
	return


;*******************************************************************
PovelVon
;*******************************************************************
; posle konstanty Prvy, Druhy, Treti, Stvrty, Piaty 
	movlw	Prvy
	movwf	SHR
	call	BytSer

	movlw	Druhy
	movwf	SHR
	call	BytSer

	movlw	Treti
	movwf	SHR
	call	BytSer

	movlw	Stvrty
	movwf	SHR
	call	BytSer

	movlw	Piaty
	movwf	SHR
	call	BytSer

	return
;***********************************
BytSer
;**********************************
	movlw	LCHAR
	movwf	BITC
	clrf	PAR
	call	Startbit
	call	TXdata
	call	Parity
	call	Stopbit

	return


;***********************
Startbit		;7+3+W	
;***********************
;	nop
;	nop
;	nop
	nop
	nop
	nop
	nop
	nop
	nop
	_SOUT_C	
	call	W416us
	nop
	nop
	nop
	return
;***********************
Stopbit		;7+3+W	
;***********************
;	nop
;	nop
;	nop
	nop
	nop
	nop
	nop
	nop
	nop
	_SOUT_S
	call	W416us
	nop
	nop
	nop
	return
;***********************
;Databit		;7+3+W	
;***********************
;	nop
;	nop
;	_C_TSS	
;	_SOUT_C
;	_C_TSC
;	_SOUT_S
;	call	W416us
;	nop
;	nop
;	nop
;	return

;***********************
Parity		;7+3+W	
;***********************
;	nop
;	nop
;	nop
	nop
	nop
	rrf	PAR,F	;pocet jedniciek v SHR TEST
	_C_TSS
	_SOUT_C
	_C_TSC
	_SOUT_S	;ak je hi 0.bit setni P-bit
	call	W416us
	nop
	nop
	nop
	return
;*******************************
TXdata		;7+3+W	
;*******************************
TXdataCyk		
;	nop
;	nop
	nop
	rlf	SHR,F
	_C_TSC
	incf	PAR,F
	_C_TSS
	_SOUT_C
	_C_TSC
	_SOUT_S
	call	W416us
	decfsz	BITC,F
	goto	TXdataCyk
	return



	ORG	0x03FE
	retlw	0x07
	

	END			; directive 'end of program'
	
;list      p=12f629
;#include <p12f629.inc>
;__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &  _PWRTE_ON & _INTRC_OSC_NOCLKOUT 
; 
;cblock 0x20    
;delay1
;delay2
;tone1
;tone2
;endc
;;*****************<<
;;Start
;;*****************<<
;ORG     0x000             
;goto    SetUp              
;ORG    0x004
;nop                             
;nop                             
;nop
;SetUp   
;pin7 equ 0
;bsf         STATUS,rp0 
;movlw     b'00110111'
;movwf    TRISIO
;bcf         status,rp0 
;goto Main
;Main
;bsf        GPIO,pin7 
;end