;**********************************************************************
;                             Prijimac                                *
;**********************************************************************
;Prijimac/dekoder/ridici jednotka pro kytarove kombo.                 *  
;Prijima seriovy signal z ovladaciho pedalu, dekoduje jej a provede   *
;pozadovanou akci (sepne kanal, zapne/vypne funkce MUTE, VOLUME.      *   
;                                                                     *
;Seriova komunikace je rizena obvodem USART, rychlost prenosu je      *
;9600 Baud.                                                           *                         
;                                                                     *
;Vysilac v pedalu vysila po stlaceni spinace vzdy jeden datovy byte   *
;a jeden kontrolni byte, obsahujici jeho checksum (dvojkovy doplnek)  *
;Prijimac z prijateho byte vypocte checksum a porovna jej s prijatym. *
;Pokud se obe kontrolni cisla shoduji, data jsou povazovana za platna *
;a provede se pozadovana operace. V opacnem pripade jsou data povazo- *
;vana za neplatna a neprovede se zadna operace (zustane zachovan      *
;puvodni stav).                                                       *
;**********************************************************************

;Prirazeni rele jednotlivym kanalum a funkcim:                        *
;poznamka: * = rele sepnuto                                           *
;          x = rele rozepnuto                                         *
;          N = nema vliv (samostatne rele)                            *
;                                                                     *
;  RELE/JUMPER	      CLEAN   SHARP   BROWN    VOLUME                 *
;1 - CLEAN/JUMP1	*	X	X  	N                     *
;2 - SHARP/JMP1		*	X	*	N                     *
;3 - SHARP/JMP2		X	*	X	N                     *
;4 - SHARP/JMP3		X	*	X	N                     *
;5 - BROWN/JMP1		*	*	X	N                     *
;6 - BROWN/JMP2		X	X	*	N                     *
;7 - BROWN/JMP3		X	X	*       N                     *
;8 - VOLUME		N	N	N      */X       

;VOLUME 1 = nižší hlasitost. Relé na přijímači i na desce mixu        *
;           rozepnuta, LED VOLUME zhasnuta.                           * 
;VOLUME 2 = vyšší hlasitost. Relé na přijímači i na desce mixu        *
;           sepnuta, LED VOLUME svítí.                                *

;Tato tabulka se liší od předchozí verze (pedál bez sériového přenosu *
;viz původní dokumentace). Bylo změněno přiřazení relé jumperům       *
;(přehlednější).                                                      *

;**********************************************************************
;                                                                     *
;    Filename:	    Prijimac_v5.asm                                   *
;    Date:          23. 2. 2009                                       *
;    File Version:  5.0                                               *
;                                                                     *
;    Author:        Vlastimil Vlcek                                   *
;    Company:       Policna 79                                        *
;                   Valasske Mezirici                                 * 
;                                                                     *
;**********************************************************************

;Tato verze úspěšně odladěna s hotovým pedálem (vysílačem)            *
;dne 23. 2. 2009. 

	list      p=16f628            ; list directive to define processor
	__CONFIG	0X2150	;osc=INT (PINY=I/O),WDT=OFF,PWRTE=ON,
				;MCLRE=OFF (DIGITAL I/O), BOREN=ON,
				;LVP=OFF, CODE PROTECTION=OFF
	ERRORLEVEL -302
;DEFINICE SFR:
;********************
INDF                         EQU     H'0000'
TMR0                         EQU     H'0001'
PCL                          EQU     H'0002'
STATUS                       EQU     H'0003'
FSR                          EQU     H'0004'
PORTA                        EQU     H'0005'
PORTB                        EQU     H'0006'
PCLATH                       EQU     H'000A'
INTCON                       EQU     H'000B'
PIR1                         EQU     H'000C'
TMR1L                        EQU     H'000E'
TMR1H                        EQU     H'000F'
T1CON                        EQU     H'0010'
TMR2                         EQU     H'0011'
T2CON                        EQU     H'0012'
CCPR1L                       EQU     H'0015'
CCPR1H                       EQU     H'0016'
CCP1CON                      EQU     H'0017'
RCSTA                        EQU     H'0018'
TXREG                        EQU     H'0019'
RCREG                        EQU     H'001A'
CMCON                        EQU     H'001F'

OPTION_REG                   EQU     H'0081'
TRISA                        EQU     H'0085'
TRISB                        EQU     H'0086'
PIE1                         EQU     H'008C'
PCON                         EQU     H'008E'
PR2                          EQU     H'0092'
TXSTA                        EQU     H'0098'
SPBRG                        EQU     H'0099'
EEDATA                       EQU     H'009A'
EEADR                        EQU     H'009B'
EECON1                       EQU     H'009C'
EECON2                       EQU     H'009D'
VRCON                        EQU     H'009F'

;DEFINICE UZIVATELSKYCH REGISTRU:
RAM		EQU	0x20	;pocatek uzivatelske oblasti pameti RAM
TMP1		EQU	RAM	;pomocny registr
FLAGS		EQU	RAM+1	;priznaky spinacu s prepinaci funkci:
				;vyznam jednotlivych bitu:
				;0 = BYPAS
				;1 = VOLUME
				;2 = MUTE
citac1		equ	RAM+2
citac2		equ	RAM+3
RX_DATA		EQU	RAM+4	;reg. pro ulozeni prijatych dat
RX_CHECK	EQU	RAM+5   ;reg. pro ulozeni prijateho checksum
RX_DEKOD	EQU	RAM+6   ;
CHECK		EQU	RAM+7   ;reg. pro ulozeni vypocteneho checksum
TEMP		EQU	RAM+8   ;pomocny registr

;DEFINICE SYSTEMOVYCH BITU:
#define RP0     status,5
#define RP1	status,6
#define T0IF    intcon,2        ;Indikator preteceni TMR0
#define C       status,0
#define Z       status,2
#define	BRGH	TXSTA,2		;high-speed/low speed prenos
#define	SYNC	TXSTA,4		;synchronni/asynchronní rezim
#define	SPEN	RCSTA,7		;Serial Port Enable
#define	TXEN	TXSTA,5		;Transmit Enable 
#define	CREN	RCSTA,4		;Continous Receive Enable/Disable
#define	RCIE	PIE1,5
#define	TXIE	PIE1,4
#DEFINE	RCIF	PIR1,5
#DEFINE		TMR1CS		T1CON,1		;Volba rezimu Timer/Counter
#DEFINE		TMR1ON		T1CON,0		;Aktivace TIMER1 (Enable)		
#DEFINE		T1CKPS0		T1CON,4		;Preddelicka - LSB
#DEFINE		T1CKPS1         T1CON,5         ;Preddelicka - MSB
						;00 = 1:1
						;01 = 1:2
						;10 = 1:4
						;11 = 1:8
#DEFINE		TMR1IF		PIR1,0		;Flag preteceni TIMER1

;DEFINICE UZIVATELSKYCH BITU:
#DEFINE		LED_CLEAN	PORTA,0		;indikacni LED diody
#DEFINE		LED_SHARP       PORTA,1
#DEFINE		LED_BROWN       PORTA,2
#DEFINE		LED_VOLUME      PORTA,3		;pokud bude pouzita
#DEFINE		LED_MUTE        PORTA,4         ;pokud bude pouzita

#DEFINE		TX		PORTB,2		;USART - vystup
#DEFINE		RX		PORTB,1         ;USART - vstup

;Rele, spinajici signalove cesty v jednotlivych kanalech zesilovace,
;jsou prideleny jednotlivym portum takto:
#define	REL8	PORTB,0		;CLEAN/JUMP1
#define	REL7	PORTB,3         ;SHARP/JUMP1
#define	REL6	PORTB,4         ;SHARP/JUMP2
#define	REL5	PORTB,5         ;SHARP/JUMP3
#define	REL4	PORTB,6         ;BROWN/JUMP1
#define	REL3	PORTB,7         ;BROWN/JUMP2
#define	REL2	PORTA,6         ;BROWN/JUMP3
#define	REL1	PORTA,7         ;VOLUME (na desce MIX)

        
	ORG	0
     	GOTO	START

;************************************************************************
;                                PODPROGRAMY                            *
;************************************************************************
bank0	macro   		;Nastaveni banky 0
	bcf	RP0		;(pro 16F628 nutne 2 bity!)
	bcf	RP1
	endm
bank1	macro                   ;Nastaveni banky 1
	bsf	RP0     	
	bcf	RP1
	endm


;Init: Inicializace mikroradice:
Init    movlw	b'00000111'	;Vypnuti analogovych komparatoru.
	movwf	CMCON
	bank1                   
        movlw   b'00000110'	;Nastaveni portu:	
        movwf   trisb          
        movlw   b'00000000'	
        movwf   trisa          ;                
	BSF	OPTION_REG,7	;odpojeni pull-up rezistoru na PORTu B.
	
	;Nastaveni parametru USART pro prijem:
	BSF	BRGH		;High-speed prenos
	MOVLW	.25		;Baud Rate = 9600
	MOVWF	SPBRG
	BCF	SYNC		;asynchronni rezim	
	BANK0
	BSF	SPEN		;Serial Port Enable
	BSF	CREN		;Continous Receive Enable

	;Počáteční nastavení relé: nastavení pro kanál CLEAN dle tabulky:
	CALL	CLEAN
	CALL	VOL_1		;Počáteční nastavení: VOLUME 1
	
	;Pocatecni nastaveni indikacnich LED diod a rele:
	BCF	LED_CLEAN	;nastaveni LED diod a rele:
	BSF	LED_SHARP       ;CLEAN, BYPAS = ON
	BSF	LED_BROWN       ;SHARP, BROWN, VOLUME, MUTE, RELE = OFF
	BSF	LED_VOLUME
	BSF	LED_MUTE
	return
;---------------------------------------------------------------
;Zpozdovaci smycka 10ms:
t_100ms	movlw	.198
	movwf	citac1
	movlw	.167
	movwf	citac2
	decfsz	citac2,1
	goto	$-1
	decfsz	citac1,1
	goto	$-5
	return


;******************************************************************
;                          HLAVNI PROGRAM                         *
;******************************************************************           
START	CALL	INIT

ST_1	BTFSS	RCIF            ;test priznaku prijeti dat
	GOTO	ST_1
	MOVF	RCREG,0		;ulozeni dat 
	MOVWF	RX_DATA         
	MOVWF	TEMP		;pomocny registr pro vypocet checksum
	
ST_2	BTFSS	RCIF            
	GOTO	ST_2
	MOVF	RCREG,0		
	MOVWF	RX_CHECK         
	
	COMF	TEMP,0		;vypocteny checksum z prijatych dat
	SUBWF	RX_CHECK,0	;srovnani s prijatym checksumem	
	BTFSS	Z		;souhlasi checksum?
	GOTO	ST_1		;checksum nesouhlasi - neplatna data!!!
	
	MOVF	RX_DATA,0       ;checksum souhlasi - data jsou platna.
	MOVWF	RX_DEKOD
	CALL	DEKOD		

	GOTO	ST_1


dekod	BCF	C		;nulovani CARRY <<<?????
	RRF	RX_DEKOD,1	;dekodovani prijateho slova
	BTFSC	C		;1 = CLEAN	
	CALL	CLEAN           ;2 = SHARP
				;4 = BROWN
	RRF	RX_DEKOD,1      ;8 = VOLUME 1
	BTFSC	C	        ;16 = VOLUME 2
	CALL	SHARP           ;32 = MUTE ON
                                ;64 = MUTE OFF	
	RRF	RX_DEKOD,1
	BTFSC	C	
	CALL	BROWN

	RRF	RX_DEKOD,1
	BTFSC	C	
	CALL	VOL_1

	RRF	RX_DEKOD,1
	BTFSC	C	
	CALL	VOL_2
	RETURN
;-------------------------------------------------------------------
;PODPROGRAMY HLAVNIHO PROGRAMU:
CLEAN	BSF	REL1		;prepnuti rele
	BSF	REL2
	BCF	REL3
	BCF	REL4
	BSF	REL5
	BCF	REL6
	BCF	REL7
	BCF	LED_CLEAN	;LED diody
	BSF	LED_SHARP
	BSF	LED_BROWN
	RETURN

SHARP	BCF	REL1
	BCF	REL2
	BSF	REL3
	BSF	REL4
	BSF	REL5
	BCF	REL6
	BCF	REL7
	BSF	LED_CLEAN
	BCF	LED_SHARP
	BSF	LED_BROWN
	RETURN

BROWN	BCF	REL1
	BSF	REL2
	BCF	REL3
	BCF	REL4
	BCF	REL5
	BSF	REL6
	BSF	REL7
	BSF	LED_CLEAN
	BSF	LED_SHARP
	BCF	LED_BROWN
	RETURN

VOL_2   BSF	REL8   		;sepnuto rele VOLUME
	BCF	LED_VOLUME      ;rozsvicena LED VOLUME
	RETURN


VOL_1	BCF	REL8		;rozepnuto rele VOLUME
	BSF	LED_VOLUME	;zhasnuta LED VOLUME
	RETURN


	END                     ; directive 'end of program'

