;***********************************************************************************
;			
;                      ROBOT
;			Autor: Jakub Hůlka
;			Trida: ET4A
;			Rok:   08/09	
;
;	Program je určen pro mikropočítač PIC16F88 a vyvojovou desku: 
;	
;
;
;***********************************************************************************

	list       F=inhx8m, P=16F877A, R=hex, N=95
; výstupní format *.hex je Intel Hex, neurčené hodnoty jsou hex

	__config   2007,0x3b32    ; nastavení konfiguračního slova č.1.
; b13 	Ochrana kódu v paměti programu proti vyčtení neaktivní	1	
; b12	CCP1 na vývod RB0 (nepoužito)				1	3

; b11	Ladění v aplikaci ICD je zakázáno			1
; b10	Ochrana proti zápisu do paměti programu vypnuta		1
; b9	Ochrana proti zápisu do paměti programu vypnuta		1	
; b8	Ochrana paměti dat typu EEPROM proti vyčtení neaktivní	1	F

; b7	Programování(LVP)zakázáno, RB3 je normální vývod	0
; b6	Povolen reset při výpadku napájecího napětí (BOR)	1
; b5	Reset na vývodu MCLR je zakázán, RA5 je digitální vstup	0
; b4	Takt.oscilátor INTOSC=4MHz, RA6 je norm. vývod	 x00	1	5

; b3	Povolen časovač pro zpoždění resetu při zapnutí		0
; b2	Zakázán časovač Watchdog				0
; b1	Takt.oscilátor INTOSC=4MHz, RA6 je norm. vývod   1x0	0
; b0	Takt.oscilátor INTOSC=4MHz, RA6 je norm. vývod   10x 	0	0



	errorlevel -302	; vypnuti Message [302]: Register in operand not in bank 0

; definice specialnich funkcnich registru
indf    equ     0x00    ; bank0
tmr0    equ     0x01
pcl     equ     0x02
status  equ     0x03
fsr     equ     0x04
porta   equ     0x05
portb   equ     0x06
portc	equ	0x07
portd	equ	0x08
porte	equ	0x09
pclath	equ     0x0A
intcon  equ     0x0B
pir1	equ	0x0C
pir2	equ	0x0D
tmr1l   equ     0x0E
tmr1h   equ     0x0F
t1con	equ     0x10
tmr2	equ     0x11
t2con	equ	0x12
sspbuf	equ	0x13
sspcon	equ	0x14
ccpr1l	equ     0x15
ccpr1h	equ     0x16
ccp1con	equ	0x17
rcsta	equ     0x18
txreg	equ     0x19
rcreg	equ	0x1A
ccpr2l	equ	0x1B
ccpr2h	equ	0x1C
ccp2con	equ	0x1D
adresh	equ     0x1E
adcon0	equ	0x1F

optireg	equ     0x81	; bank1
trisa   equ     0x85
trisb   equ     0x86
trisc	equ	0x87
trisd	equ	0x88
trise	equ	0x89
pie1	equ	0x8C
pie2	equ	0x8D
pcon  	equ     0x8E
sspcon2	equ	0x91
pr2	equ	0x92
txsta	equ     0x98
spbrg	equ     0x99
adresl	equ     0x9E
adcon1	equ	0x9F


eedata  equ     0x10C	; bank2
eeadr   equ     0x10D
eedath  equ     0x10E
eeadrh  equ     0x10F

eecon1  equ     0x18C	; bank3
eecon2  equ     0x18D
    
; definice vlastnich globálních promenných  pro všechny banky 

p1	equ	0x70	; pocitadlo period pri stisku tlacitka
TMP0	equ 	0x71
TMP1	equ 	0x72
TMP2	equ 	0x73
prekaz	equ	0x74
nah	equ	0x75
datZpc	equ	0x76
motory equ	0x77
; pomocne definice
w       equ     0	; uložení výsledku do střadače
f       equ     1	; uložení výsledku do registru

; definice dulezitych bitu speciálních funkčních registru
#define carry   status,0; příznak přenosu
#define dcarry  status,1; poloviční příznak přenosu
#define zero    status,2; příznak nuly
#define LmotorR	portb,2
#define LmotorT	portb,1
#define	PmotorR	portb,4
#define PmotorT	portb,3
#define IrB_D_P	portc,1
#define IrB_D_Z	portb,0
		
; makra
	
bank0   macro                   ; prepnuti do banky 0 v pameti dat
	bcf     status,5        ; BANK0
	bcf	status,6
	endm

bank1   macro                   ; prepnuti do banky 1 v pameti dat
	bsf     status,5        ; BANK1
	bcf	status,6
	endm

bank3   macro                   ; prepnuti do banky 0 v pameti dat
	bcf     status,5        ; BANK0
	bsf	status,6
	endm

bank4   macro                   ; prepnuti do banky 1 v pameti dat
	bsf     status,5        ; BANK1
	bsf	status,6
	endm

; zacatek programove pameti -----------------------------------------------
	org     0
	call	init		;POCATECNI KONFIGURACE PROCESORU
	
	
start	btfss	pir1,5
	goto	$-1
	movfw	rcreg
	movwf	p1
	bank1	
	btfss	txsta,1
	goto	$-1
	bank0
	incf	p1,f
	movfw	p1	
	movwf	txreg				
	goto 	start

;------------------MANUALNI RIZENI----------------------------------	
	
	movlw	d'65'
	xorwf	rcreg,w
	btfsc	zero
	call	rovne		;Manualni chod jed rovne

	movlw	d'67'
	xorwf	rcreg,w
	btfsc	zero
	call	leva		;Manualni chod jed levou

	movlw	d'68'
	xorwf	rcreg,w
	btfsc	zero
	call	prava		;Manualni chod jed pravou

	movlw	d'66'
	xorwf	rcreg,w
	btfsc	zero
	call	stop		;Manualni chod stuj


	goto	start

vysli	bank1	
	btfss	txsta,1
	goto	$-1
	bank0
	incf 	p1
	movfw	p1		;Budu vysilat informaci 
	movwf	txreg		; o prekazkach
	return
rovne	bsf	LmotorT
	bsf	PmotorT
	call	zp1s
	bcf	LmotorT
	bcf	PmotorT
	return

stop	bcf	LmotorT
	bcf	PmotorT
	return
leva	bsf	LmotorT
	call	zp1s
	bcf	LmotorT
	return
prava	bsf	PmotorT
	call	zp1s
	bcf	PmotorT
	return

zp1s 	movlw 	0xA  ;21 DEC
        movwf 	TMP2
treti   movlw 	0x16  ;89 DEC
        movwf 	TMP1
druhy   movlw 	0xAC  ;177 DEC
        movwf 	TMP0
prvni   decfsz 	TMP0,f
        goto 	prvni
        decfsz 	TMP1,f
        goto 	prvni
        decfsz 	TMP2,f
        goto	prvni
	nop
	return	

zp68	MOVLW 0x05  ;5 DEC
        MOVWF TMP1
        MOVLW 0x03  ;3 DEC
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-5
	RETURN



zp65	MOVLW 0x02  ;2 DEC
        MOVWF TMP1
        MOVLW 0x09  ;9 DEC
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-5
	RETURN

zp3000	MOVLW 0x01  ;1 DEC
        MOVWF TMP2
        MOVLW 0x06  ;6 DEC
        MOVWF TMP1
        MOVLW 0x0A5  ;165 DEC
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-5
        DECFSZ TMP2,F
        GOTO $-9
	RETURN
	
;*************INICIALIZACE PROCESORU***************************
; ********konfiguruje vstupy a výstupy, nastaví USART**********
init	bank0

	clrf	porta		; nulování zachytných registrů všem bran
	clrf	portb		; brány PortB
	clrf	portc
	clrf	portd
	clrf	porte
	bank1
	movlw	b'00001110'	;RA0 - analog input(baterie)
	movwf	adcon1		;zbytek digital I/O
	movlw	b'11011101'	; konfigurace vývodů brány PortA
	movwf	trisa
	movlw	b'11100000'	; konfigurace vývodů brány PortB
	movwf	trisb
	movlw	b'10011001'
	movwf	trisc
	movlw	b'00001100'
	movwf	trisd
	movlw	b'11111000'
	movwf	trise
	movlw   b'01000111'     ; nastaveni registru OPTION_REG, pull-up aktivní
	movwf   optireg		; předdělička k Timer0 v poměru 1:256
	movlw	b'10100110'	; nastavení USART: asynchronní, 8 bitů,
	movwf	txsta		; pro volbu rychlosti je horní tabulka BRD, 
	movlw	d'129'		; 9600 Bd s chybou 0,16%
	movwf	spbrg		; odpovídá hodnotě 129 v horní tabulce

	bank0
	movlw   b'10010000' 	
	movwf	rcsta		
	movlw	b'00100101'
	movwf	sspcon
	
	return
;**************************************************************

; povinná direktiva pro ukončení programu
	end

