Controllo luci

SOMMARIO

Si propone di realizzare un controllo remoto per piccoli elettrodomestici (luci, ventilatori da soffitto, ecc.) con un assorbimento massimo di circa 5A (cioè circa 1kWatt). La soluzione si caratterizza per i minimi ingombri e per costi e consumi irrisori.
I riferimenti sono alcuni componenti del progetto Controllo accessi da remoto e il post Alimentazione e controllo senza trasformatore di tensione.

PRINCIPALI MATERIALI UTILIZZATI

PIC16F684-I/P Microchip - MCU 8 Bit, Flash, 20 MHz, 3.5 KB, 256 EEPROM
MOC3020 Fotoaccoppiatore, Uscita Triac, DIP, Non Zero Crossing, 400 V
PE014F24 Relè di Alimentazione, 24 VDC, 5A, PE Series, Bistabile
H3V4F 3V 433Mhz mini ricevitore wireless Supereterodina ASK Remote

Con riferimento alla Fig.2 del il post Alimentazione e controllo senza trasformatore di tensione, lo schema del Ricevitore è mostrato in Fig.1.

Fig.1

che dà luogo al layout di Fig.2 e la realizzazione di Fig.3.

Fig.2 Fig.3

Il modulo H3V4F va inserito nell'area gialla di Fig.2, inserendo solo i pin colorati in nero e non quelli in grigio. Il cavetto di antenna va saldato direttamente sul modulo nella piazzola denominata ANT. Opzionalmente può essere collegato un Led di controllo, come mostrato in Fig.1. Come Telecomando si adotta lo schema di Fig.9 e la conseguente realizzazione di Figg.10, 11 e 12  del progetto Controllo accessi da remoto.

PROGRAMMAZIONE E TEST

Assumendo che il dispositivo possa essere pilotato dal telecomando o dal modulo RFID, realizzati nel progetto Controllo accessi da remoto, si è scelto di assegnare lo stesso identificativo di serratura h'445566778899AABBCCDDEE' (può facilmente essere modificato), ma soprattutto la stessa password generativa di quella usata nel progetto già citato. Con questi requisiti, il ricevitore costruito può sostituire a tutti gli effetti quello sviluppato in tale progetto.
Naturalmente il codice va opportunamente modificato, con le routine sviluppate nel post Alimentazione e controllo senza trasformatore di tensione.
Una versione funzionante è qui di seguito mostrata.

;**********************************************************************
;    Algoritmo RC5-64-32-528                                          *
;**********************************************************************
;                                                                     *
;    Filename:	    P16F684_Lock64_ac.asm                             *
;    Date:                                                            *
;    File Version: Versione 1.0                                       *
;                                                                     *
;    Author:  InTeAS WebMaster                                        *
;    Company: https://www.inteas.it                                   *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files Required: P16F684.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     
list p=16f684 ; list directive to define processor
#include <P16F684.inc> ; processor specific variable definitions	
__CONFIG _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _FCMEN_OFF & _IESO_OFF
;
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file. 
; See respective data sheet for additional information on configuration word.
;
;**************
; Mappa EEPROM
;**************
;
; 61 chiavi programmabili
; 00-03 Contatore della chiave 00
; 04-07 Contatore della chiave 04
; 08-0B Contatore della chiave 08
; 0C-0F Contatore della chiave 0C
; .....
; E0-E3 Contatore della chiave E0
; E4-E7 Contatore della chiave E4
; E8-EB Contatore della chiave E8
; EC-EF Contatore della chiave EC
; F0-F3 Contatore della chaive F0
;
; F4-FE non usati
; FF Flag di prima inizializzazione
;******************************
; DEFINIZIONE VARIABILI LOCALI
;******************************
;
; Interval 0x20 - 0x7F , Bank 0
; Interval 0xA0 - 0xBF , Bank 1
;
;**********************
; Bank0
;**********************
;
; 20-27 S_2i 
; 28-2F S_2i+1
; 30-37 A, KrA
; 38-3F B, KrB
;
CMDRCV        EQU  0x3F
UNORCV        EQU  0x40 
WTCNT1        EQU  0x7F
WTCNT2        EQU  0x7E
VALFL         EQU  0x79
PCOUNT1       EQU  0x78
;
;**********************
; Bank1
;**********************
;
COUNT1        EQU  0xBF
COUNT2        EQU  0xBE
SEQCNT        EQU  0xBD
BYTCNT        EQU  0xBC
TBLNMB        EQU  0xBB
TBLADR        EQU  0xBA
BYTEVL        EQU  0xB9
ITERAZ        EQU  0xB8
OLDCARRY      EQU  0xB7
NEWCARRY      EQU  0xB6
COMPLRF       EQU  0xB5
MASK          EQU  0xB4
ADDR2         EQU  0xB3
ADDR1         EQU  0xB2
ADDR0         EQU  0xB1
NBYTES        EQU  0xB0
UNONB         EQU  0xAF
ERRFLG        EQU  0xAE
CONFR         EQU  0xAD
;
;**********************************************************************
	ORG 0x000 ; processor reset vector
	goto Init ; go to beginning of program
;
	ORG 0x004 ; interrupt vector location
	goto Init
;
Init:
;
; OPTION Register, on reset all bits = 1
	; bit 7 (NOT_RAPU) Weak Pull-Ups Disabled	
	; bit 6 (INTEDG) Interrupt Edge Select
	; bit 5 (T0CS) Timer0 Source Selection: 1= T0CKI Transition (default), 0= Internal Instruction (CLKOUT) 
	; bit 4 (T0SE) Timer0 Source Edge Selection: 1 = H-to-L (default), 0= L-to-H  
	; bit 3 (PSA) Prescaler Assignment: 1= to WDT (default), 0= to Timer0	
	; bits 2:0 (PS2,PS1,PS0) Prescaler Rate Selection: 1:128 default
;
	bsf STATUS,RP0 ; Bank 1		
	movwf OPTION_REG
;
; I/O Summary
;
; PORTA,5 INPUT  (pin  2) : NC
; PORTA,4 INPUT  (pin  3) : NC 
; PORTA,3 INPUT  (pin  4) : NC
; PORTA,2 INPUT  (pin 11) : NC
; PORTA,1 INPUT  (pin 12) : NC
; PORTA,0 OUTPUT (pin 13) : Probe Led (attivo su 1)
;
; PORTC,5 OUTPUT (pin  5) : Power Supply Control (attivo su 0)
; PORTC,4 INPUT  (pin  6) : NC
; PORTC,3 INPUT  (pin  7) : AC signal
; PORTC,2 INPUT  (pin  8) : Lettura ricevitore
; PORTC,1 INPUT  (pin  9) : NC
; PORTC,0 OUTPUT (pin 10) : Abilitazione Ricevitore (attivo su 1)
;
; *******************************
; Set of the PORTA I/O (bit 5:0)
; *******************************
;
	bcf STATUS,RP0 ; Bank 0
	movlw h'07' ; Set RA<2:0> to digital I/O
	movwf CMCON0
	bsf STATUS,RP0 ; Bank 1
	clrf ANSEL ; Digital I/O only: no analogical function
; 1=input 0=output	
	movlw b'11111110'
	movwf TRISA	; write in TRISA register	
; 
; *******************************
; Set of the PORTC I/O (bit 5:0)
; *******************************
;
	movlw b'11011110'
	movwf TRISC ; write in TRISC register	
	bcf STATUS,RP0 ; Bank 0
	bcf PORTC,0    ; Disabilita il Ricevitore
	bsf PORTC,5    ; Power Supply Control inattivo
	bcf PORTA,0    ; Spegne il Probe Led
;	
; Spegne il Relè di default
;	
	clrf VALFL ; VALFL=0 Negative Polarity (Status Off)
	call ACTCNT
	bsf STATUS,RP0 ; Bank 1 condizione normale di funzionamento
;
; Verifica che non sia la prima accensione	
;
	movlw h'FF'
	movwf EEADR
	call EEWRITE
	movwf BYTEVL
	incf BYTEVL,w
	btfss STATUS,Z ; se Z=0 salta (prima accensione) 
	goto Main ; Z=1 
; 
; Prima asccensione
;
	movlw h'FF'	
	call EEWRITE
	bcf STATUS,RP0 ; Bank 0
	clrf 0x30
	clrf 0x31
	clrf 0x32
	clrf 0x33
	incf 0x33
	bsf STATUS,RP0 ; Bank 1	
	call COUNTERS_RESET
	movlw h'FF'
	movwf EEADR
	movlw h'00'	
	call EEWRITE
;
Main:
	bcf STATUS,RP0 ; Bank 0
	bsf PORTC,0    ; Abilita il ricevitore
	bsf STATUS,RP0 ; Bank 1
;
	call LDELAY_STD     ;Attende che si stabilizzi
;
; Loop di osservazione ricevitore
;
	movlw h'30'
	movwf FSR
	movlw h'08'
	movwf BYTCNT ; contatore di bit di byte
;
; Comincia la memorizzazione
;
	bcf STATUS,RP0 ; Bank 0
	btfsc PORTC,2 ; salta  se ho trovato uno zero 
	goto InitUno ; ho trovato un uno al primo colpo
;
InitZero:
	bsf STATUS,RP0 ; Bank 1		
	clrf COUNT1; azzero contatore di zeri iniziale
;
InitZeroSeq:
	bcf STATUS,RP0 ; Bank 0
	btfsc PORTC,2 ; salta  se=0
	goto InitUno ; è arrivato un uno
	bsf STATUS,RP0 ; Bank 1
	incf COUNT1
	btfss STATUS,Z ; salta se Z=1: è il 256simo zero consecutivo
    goto InitZeroSeq
; è il 256simo zero consecutivo: non c'è trasmissione in corso 
	goto Exit ; sequenza abortita
;
; Ricerca dello start bit
;
InitUno:
	bsf STATUS,RP0 ; Bank 1
	clrf COUNT2 ;  azzero contatore di uno
;
InitUnoSeq:
	bcf STATUS,RP0 ; Bank 0
	btfss PORTC,2 ; salta  se=1
	goto InitZero ; è arrivato uno zero: non è lo start bit, ricomincio
	bsf STATUS,RP0 ; Bank 1
	incf COUNT2
	btfss COUNT2,7 ; salta se max uno consecutivi
    goto InitUnoSeq
;
; è il max uno consecutivi: agganciata trasmissione in corso
; 
	clrf UNONB ; azzero il Contatore di Bit ad uno
;
; Memorizzazione Trasmissione
;
UnoLoop:
	bsf STATUS,RP0 ; Bank 1
	clrf COUNT2 ;  azzero contatore di uno: serve per trovare il fine trasmissione
;
UnoSeq:
	bcf STATUS,RP0 ; Bank 0
	btfss PORTC,2 ; salta  se=1
	goto ZeroLoop ; è arrivato uno zero
	bsf STATUS,RP0 ; Bank 1
	incf COUNT2
	btfss COUNT2,7 ; salta se max uno consecutivi ; fine trasmissione
    goto UnoSeq
;
; è il max uno consecutivi: fine trasmissione
;
	goto FineLoop
;
ZeroLoop:
	bsf STATUS,RP0 ; Bank 1
;
InZeroSeq:
	clrf COUNT1 ; azzero contatore di zeri
;
ZeroSeq:
	bcf STATUS,RP0 ; Bank 0
	btfsc PORTC,2 ; salta  se=0
	goto CalcoloBit ; è arrivato un uno, calcola il bit
	bsf STATUS,RP0 ; Bank 1
	incf COUNT1
	btfss STATUS,Z ; salta se Z=1: è il 256simo zero consecutivo
    goto ZeroSeq
;
; è il 256simo zero consecutivo: sequenza abortita
;
	bsf STATUS,RP0 ; Bank 1	 
	goto Exit
;
CalcoloBit:
	bsf STATUS,RP0 ; Bank 1
;
; INT = 3D; INT unità di misura dell'intervallo di bit 
; 1xINT => Bit=0; 2xINT => Bit=1
;
	movlw h'3D'
	subwf COUNT1,w ; se COUNT1 > B7 C=1, se COUNT1 <= B7 C=0
;
; Il conteggio dei Bit a Uno non si applica al 17simo byte di controllo
; (che è nella posizione UNORCV, 0x40)
;
	btfsc FSR,6 ; se FSR nel range 30-3F esegue il conteggio Bit a Uno
	goto FineUnoCount ; se FSR = 40 salta il conteggio	
;
; Conteggio Bit a UNO
;
	btfsc STATUS,0 ; salta se C=0 (conta gli Uno)
	incf UNONB ; se C=1 incrementa il Contatore di Bit a Uno 
;
FineUnoCount:
	rlf INDF,1 ; salvo il bit nel byte corrente
	decfsz BYTCNT,1
	goto UnoLoop ; vai al conteggio degli uno
;
; Completato un byte
;
	incf FSR ; incremento il contatore di byte
	movlw h'08'
	movwf BYTCNT ; ricarico il contatore di bit di byte
	goto UnoLoop ; vai al conteggio degli uno
;
FineLoop:
	bcf STATUS,RP0 ; Bank 0
	bsf PORTC,2    ; Disabilita il ricevitore
	movf UNORCV,w ; mette in w il numero di uno ricevuto
	bsf STATUS,RP0 ; Bank 1
;
; Misura la qualità della trasmissione
;
	subwf UNONB,w ; confronta UNONB con UNORCV
	btfss STATUS,Z ; se Z=1 salta e continua 
	goto Exit ; UNONB <> UNORCV; Z=0 codice non validato
;
	movlw h'08'
	movwf NBYTES ; numero bytes	
	call DECIFRATURA8	
	bsf STATUS,RP0 ; Bank 1
	call LOCKID_RECOV	
	movlw h'0B'
	movwf SEQCNT
	movlw h'34'
	call SEQVALID	
	movf CONFR,w 
	btfsc STATUS,Z ; se Z=0 salta e continua 
	goto Exit ; CONFR = 0 Z=1 codice non validato
;
; Verifica che sia un comando di programmazione (byte in 3F  = h'FF') 	
;
	movlw h'01'
	bcf STATUS,RP0 ; Bank 0
	addwf CMDRCV,w
	bsf STATUS,RP0 ; Bank 1
	btfss STATUS,Z ; se Z=1 salta e continua 
	goto UserCard ;e' una chiave utente
;
; Comando di programmazione: azzera tutti i contatori
; e da' il consenso		
;
	call COUNTERS_RESET	
	goto Consenso
;
UserCard:
;
; Controlla l'avanzamento del contatore	
;
; recupera il contatore memorizzato della chiave corrente puntata in 3F
	call COUNTER_RECOV 
; copia il contatore della chiave corrente in 50-53 per il confronto 
	call COUNTER_COPY
;
	movlw h'04'
	movwf NBYTES ; numero bytes
;
	movlw h'43'
	call SOTTR
	movf NEWCARRY,w 
	btfsc STATUS,Z ; se Z=0 salta e continua 
	goto Exit ; NEWCARRY = 0 Z=1 contatore corrente minore 
			  ; di quello memorizzato: non valido
;
; Contatore corrente = contatore memorizzato: non valido 
;
	movlw h'04'
	movwf SEQCNT
	movlw h'50'
	call ZEROTEST	
	movf CONFR,w 
	btfss STATUS,Z ; se Z=1 salta e continua 
	goto Exit ; CONFR = 1 Z=0  contatore gia' usato
;
Consenso:
;
; Consenso ricevuto
;
	bcf STATUS,RP0 ; Bank 0		
	bsf PORTA,0 ; Accende il Probe Led
; Abilita il Consenso	
	movlw h'01'
	movwf VALFL ; VALFL=1 Positive Polarity (Status On)	
	call ACTCNT 
	bsf STATUS,RP0 ; Bank 1
;
	movlw h'04'
	call LDELAY
;
	bcf STATUS,RP0 ; Bank 0
	bcf PORTA,0 ; Spegne il  Probe Led
; Disabilita il consenso		
	clrf VALFL ; VALFL=0 Negative Polarity (Status Off)
	call ACTCNT
	bsf STATUS,RP0 ; Bank 1
;
FineAzione:
;
; Salva il contatore della chiave corrente nella EEPROM
;
	call COUNTER_SAVE
;
Exit:
	bcf STATUS,RP0 ; Bank 0
	bcf PORTC,0    ; Disabilita il ricevitore
	bsf STATUS,RP0 ; Bank 1
;
; Ritorno all'inizio
;
	goto Main 
;
;*********************************************
; PASSWORD GENERATRICE DI ESEMPIO
;*********************************************
;
; 1CA97A224432B78088A91048A5C739C54BAB2C8400372600B8A37C0F825A5386F65F62368CDBF3A694
; 92DB949DE0D7D069C35640632C7811A6C03C7651A1D070414A8E117B18F5FF9C971568F491AF16D7C7
; 52584B8130DC5B37C37A540E9EC2945289FA2E424411FDFEA903918119483687A82D7C40A0C8B2D3AC
; C3DF6E7A1541885C9090E2FE1652CF87FF35A9CD87456D13944398DD26192672AF8D588D9AD0343117
; 3C581C114F3BA5B849211A7AC13009833B9AA277EC95A54C943303F20E77972C8F631E0E5565B05D85
; 3D7BCD2AF969D3C38E10906FCE03BD6A3E4EA2176A9A887582F1CC81901D907C8ACC36CEC8124EE2BB
; 8146C83F2FB2E0C2E621AF57E4EAE8DE641BA14027631FDB1C4E20C5E9FFC8DA14A73229122122B7D5
; F519E2DA9D9DC8CCF394AFC8FFF34ADA97DC4E70958E11DBB1424AAA55B0738ABDC478E46212A00FC7
; 617599265EF717B621CCBD2125F780945DDEA454AF2EA2D74A34262770C21A8A862EC61E0022D09D00
; ADFA815F33BB32866E6713DB85639E8EBB8B3E129D3FA312F7B90876F495DFC9CC0BB7ED630FCDFD12
; 8D67FFA78059D7AAC3965A0A0C49D25C2C09D136779049E4C14555745CF53352B3C69ECF63898B6A75
; 991CAEC19270ECBF7E1095D2E1E745F7DFA42B53CE987B6B0881CE0A802C3018EDA109A8FACFCBEA5B
; 9FDC8C18DB0E131E27DF124B2B2C5E101E5D162D968193F815A2A09B5D692D8C450D81D8
;
;*********************************************
;
;************************
;TABLE 1
;************************
	ORG		0x0FF
TABLE1:
	addwf PCL
;s[2] = 'DAD0C6754A89DB4C'
	retlw h'DA'
	retlw h'D0'
	retlw h'C6'
	retlw h'75'
	retlw h'4A'
	retlw h'89'
	retlw h'DB'
	retlw h'4C'
;s[3] = 'BF234DDC889B7786'
	retlw h'BF'
	retlw h'23'
	retlw h'4D'
	retlw h'DC'
	retlw h'88'
	retlw h'9B'
	retlw h'77'
	retlw h'86'
;s[4] = 'B71A1DA4AA42D6B4'
	retlw h'B7'
	retlw h'1A'
	retlw h'1D'
	retlw h'A4'
	retlw h'AA'
	retlw h'42'
	retlw h'D6'
	retlw h'B4'
;s[5] = 'DF0B16BA7A2A7E85'
	retlw h'DF'
	retlw h'0B'
	retlw h'16'
	retlw h'BA'
	retlw h'7A'
	retlw h'2A'
	retlw h'7E'
	retlw h'85'
;s[6] = '7EE0AC20F2373D33'
	retlw h'7E'
	retlw h'E0'
	retlw h'AC'
	retlw h'20'
	retlw h'F2'
	retlw h'37'
	retlw h'3D'
	retlw h'33'
;s[7] = '2BE71B26488E0195'
	retlw h'2B'
	retlw h'E7'
	retlw h'1B'
	retlw h'26'
	retlw h'48'
	retlw h'8E'
	retlw h'01'
	retlw h'95'
;s[8] = '34065D0075EF1A1A'
	retlw h'34'
	retlw h'06'
	retlw h'5D'
	retlw h'00'
	retlw h'75'
	retlw h'EF'
	retlw h'1A'
	retlw h'1A'
;s[9] = '9771D6B39B0DBF6B'
	retlw h'97'
	retlw h'71'
	retlw h'D6'
	retlw h'B3'
	retlw h'9B'
	retlw h'0D'
	retlw h'BF'
	retlw h'6B'
;s[10] = '3A41B44288F99546'
	retlw h'3A'
	retlw h'41'
	retlw h'B4'
	retlw h'42'
	retlw h'88'
	retlw h'F9'
	retlw h'95'
	retlw h'46'
;s[11] = 'B01442143AF84396'
	retlw h'B0'
	retlw h'14'
	retlw h'42'
	retlw h'14'
	retlw h'3A'
	retlw h'F8'
	retlw h'43'
	retlw h'96'
;s[12] = '9D61E9B94DD9F6AF'
	retlw h'9D'
	retlw h'61'
	retlw h'E9'
	retlw h'B9'
	retlw h'4D'
	retlw h'D9'
	retlw h'F6'
	retlw h'AF'
;s[13] = 'C2652CFD3DCE2FD2'
	retlw h'C2'
	retlw h'65'
	retlw h'2C'
	retlw h'FD'
	retlw h'3D'
	retlw h'CE'
	retlw h'2F'
	retlw h'D2'
;s[14] = 'C714C9C1CEA41830'
	retlw h'C7'
	retlw h'14'
	retlw h'C9'
	retlw h'C1'
	retlw h'CE'
	retlw h'A4'
	retlw h'18'
	retlw h'30'
;s[15] = 'C686999FEE730C53'
	retlw h'C6'
	retlw h'86'
	retlw h'99'
	retlw h'9F'
	retlw h'EE'
	retlw h'73'
	retlw h'0C'
	retlw h'53'
;s[16] = '1AF09EDEA3EF1DF7'
	retlw h'1A'
	retlw h'F0'
	retlw h'9E'
	retlw h'DE'
	retlw h'A3'
	retlw h'EF'
	retlw h'1D'
	retlw h'F7'
;s[17] = 'C9538AF72A387415'
	retlw h'C9'
	retlw h'53'
	retlw h'8A'
	retlw h'F7'
	retlw h'2A'
	retlw h'38'
	retlw h'74'
	retlw h'15'
;s[18] = 'D2D942C4BA82A0BC'
	retlw h'D2'
	retlw h'D9'
	retlw h'42'
	retlw h'C4'
	retlw h'BA'
	retlw h'82'
	retlw h'A0'
	retlw h'BC'
;s[19] = '9B7A9B98C73D486B'
	retlw h'9B'
	retlw h'7A'
	retlw h'9B'
	retlw h'98'
	retlw h'C7'
	retlw h'3D'
	retlw h'48'
	retlw h'6B'
;s[20] = '07DC150E9B6D874B'
	retlw h'07'
	retlw h'DC'
	retlw h'15'
	retlw h'0E'
	retlw h'9B'
	retlw h'6D'
	retlw h'87'
	retlw h'4B'
;s[21] = '64F5A0CB3F105E4C'
	retlw h'64'
	retlw h'F5'
	retlw h'A0'
	retlw h'CB'
	retlw h'3F'
	retlw h'10'
	retlw h'5E'
	retlw h'4C'
;s[22] = '49D58C7504D691C7'
	retlw h'49'
	retlw h'D5'
	retlw h'8C'
	retlw h'75'
	retlw h'04'
	retlw h'D6'
	retlw h'91'
	retlw h'C7'
;s[23] = '83416F9E11060720'
	retlw h'83'
	retlw h'41'
	retlw h'6F'
	retlw h'9E'
	retlw h'11'
	retlw h'06'
	retlw h'07'
	retlw h'20'
;s[24] = '486BD4265E984FC9'
	retlw h'48'
	retlw h'6B'
	retlw h'D4'
	retlw h'26'
	retlw h'5E'
	retlw h'98'
	retlw h'4F'
	retlw h'C9'
;s[25] = 'EC93478FB7723A82'
	retlw h'EC'
	retlw h'93'
	retlw h'47'
	retlw h'8F'
	retlw h'B7'
	retlw h'72'
	retlw h'3A'
	retlw h'82'
;s[26] = '65C4D61723065581'
	retlw h'65'
	retlw h'C4'
	retlw h'D6'
	retlw h'17'
	retlw h'23'
	retlw h'06'
	retlw h'55'
	retlw h'81'
;s[27] = 'E361221076C5A87C'
	retlw h'E3'
	retlw h'61'
	retlw h'22'
	retlw h'10'
	retlw h'76'
	retlw h'C5'
	retlw h'A8'
	retlw h'7C'
;s[28] = 'DBA9833D724F27C9'
	retlw h'DB'
	retlw h'A9'
	retlw h'83'
	retlw h'3D'
	retlw h'72'
	retlw h'4F'
	retlw h'27'
	retlw h'C9'
;s[29] = '5596A65AE9EEFE1A'
	retlw h'55'
	retlw h'96'
	retlw h'A6'
	retlw h'5A'
	retlw h'E9'
	retlw h'EE'
	retlw h'FE'
	retlw h'1A'
;s[30] = '704AEC3011904717'
	retlw h'70'
	retlw h'4A'
	retlw h'EC'
	retlw h'30'
	retlw h'11'
	retlw h'90'
	retlw h'47'
	retlw h'17'
;s[31] = '5C7ACECFA4B36D27'
	retlw h'5C'
	retlw h'7A'
	retlw h'CE'
	retlw h'CF'
	retlw h'A4'
	retlw h'B3'
	retlw h'6D'
	retlw h'27'
;s[32] = 'B75059854AF527E3'
	retlw h'B7'
	retlw h'50'
	retlw h'59'
	retlw h'85'
	retlw h'4A'
	retlw h'F5'
	retlw h'27'
	retlw h'E3'
;s[33] = '872B26243F2D530F'
	retlw h'87'
	retlw h'2B'
	retlw h'26'
	retlw h'24'
	retlw h'3F'
	retlw h'2D'
	retlw h'53'
	retlw h'0F'
;
;************************************************************
; ROUTINES COMUNI 
;************************************************************
	ORG		0x200
	nop
	nop
;
;************************
;TABLE 2
;************************
;
	ORG		0x2FF
TABLE2:
	addwf PCL;s[34] = '831CC87D65F1473A'
	retlw h'83'
	retlw h'1C'
	retlw h'C8'
	retlw h'7D'
	retlw h'65'
	retlw h'F1'
	retlw h'47'
	retlw h'3A'
;s[35] = '3359FF516A534F83'
	retlw h'33'
	retlw h'59'
	retlw h'FF'
	retlw h'51'
	retlw h'6A'
	retlw h'53'
	retlw h'4F'
	retlw h'83'
;s[36] = 'C2FEC52B1A49DF0B'
	retlw h'C2'
	retlw h'FE'
	retlw h'C5'
	retlw h'2B'
	retlw h'1A'
	retlw h'49'
	retlw h'DF'
	retlw h'0B'
;s[37] = 'A34CDB8977799710'
	retlw h'A3'
	retlw h'4C'
	retlw h'DB'
	retlw h'89'
	retlw h'77'
	retlw h'79'
	retlw h'97'
	retlw h'10'
;s[38] = '607D835653B498FB'
	retlw h'60'
	retlw h'7D'
	retlw h'83'
	retlw h'56'
	retlw h'53'
	retlw h'B4'
	retlw h'98'
	retlw h'FB'
;s[39] = '64557D6DEE68B8E3'
	retlw h'64'
	retlw h'55'
	retlw h'7D'
	retlw h'6D'
	retlw h'EE'
	retlw h'68'
	retlw h'B8'
	retlw h'E3'
;s[40] = 'B6AA6AE220EEF5EE'
	retlw h'B6'
	retlw h'AA'
	retlw h'6A'
	retlw h'E2'
	retlw h'20'
	retlw h'EE'
	retlw h'F5'
	retlw h'EE'
;s[41] = '53207F2D5579AA9D'
	retlw h'53'
	retlw h'20'
	retlw h'7F'
	retlw h'2D'
	retlw h'55'
	retlw h'79'
	retlw h'AA'
	retlw h'9D'
;s[42] = 'BDEAAB28AE597A66'
	retlw h'BD'
	retlw h'EA'
	retlw h'AB'
	retlw h'28'
	retlw h'AE'
	retlw h'59'
	retlw h'7A'
	retlw h'66'
;s[43] = '0D2F035351EFB50C'
	retlw h'0D'
	retlw h'2F'
	retlw h'03'
	retlw h'53'
	retlw h'51'
	retlw h'EF'
	retlw h'B5'
	retlw h'0C'
;s[44] = 'C54FB7AD19DB5832'
	retlw h'C5'
	retlw h'4F'
	retlw h'B7'
	retlw h'AD'
	retlw h'19'
	retlw h'DB'
	retlw h'58'
	retlw h'32'
;s[45] = 'F72D8E48F4BFCC64'
	retlw h'F7'
	retlw h'2D'
	retlw h'8E'
	retlw h'48'
	retlw h'F4'
	retlw h'BF'
	retlw h'CC'
	retlw h'64'
;s[46] = 'AB3E99FFF5CD1185'
	retlw h'AB'
	retlw h'3E'
	retlw h'99'
	retlw h'FF'
	retlw h'F5'
	retlw h'CD'
	retlw h'11'
	retlw h'85'
;s[47] = '299BBDF630DFEC2A'
	retlw h'29'
	retlw h'9B'
	retlw h'BD'
	retlw h'F6'
	retlw h'30'
	retlw h'DF'
	retlw h'EC'
	retlw h'2A'
;s[48] = 'EFB3E9479BA57493'
	retlw h'EF'
	retlw h'B3'
	retlw h'E9'
	retlw h'47'
	retlw h'9B'
	retlw h'A5'
	retlw h'74'
	retlw h'93'
;s[49] = '30A00D9B7A9E3E33'
	retlw h'30'
	retlw h'A0'
	retlw h'0D'
	retlw h'9B'
	retlw h'7A'
	retlw h'9E'
	retlw h'3E'
	retlw h'33'
;s[50] = '8CB1FD062928979F'
	retlw h'8C'
	retlw h'B1'
	retlw h'FD'
	retlw h'06'
	retlw h'29'
	retlw h'28'
	retlw h'97'
	retlw h'9F'
;s[51] = '871E9FC0AD2ABFBB'
	retlw h'87'
	retlw h'1E'
	retlw h'9F'
	retlw h'C0'
	retlw h'AD'
	retlw h'2A'
	retlw h'BF'
	retlw h'BB'
;s[52] = 'C3E5C992DDD5E0D5'
	retlw h'C3'
	retlw h'E5'
	retlw h'C9'
	retlw h'92'
	retlw h'DD'
	retlw h'D5'
	retlw h'E0'
	retlw h'D5'
;s[53] = 'ECCCF82235DA4103'
	retlw h'EC'
	retlw h'CC'
	retlw h'F8'
	retlw h'22'
	retlw h'35'
	retlw h'DA'
	retlw h'41'
	retlw h'03'
;s[54] = '2F26883D23817BD3'
	retlw h'2F'
	retlw h'26'
	retlw h'88'
	retlw h'3D'
	retlw h'23'
	retlw h'81'
	retlw h'7B'
	retlw h'D3'
;s[55] = '47166BD90F01D8B9'
	retlw h'47'
	retlw h'16'
	retlw h'6B'
	retlw h'D9'
	retlw h'0F'
	retlw h'01'
	retlw h'D8'
	retlw h'B9'
;s[56] = 'BAB9F1B89E4573CE'
	retlw h'BA'
	retlw h'B9'
	retlw h'F1'
	retlw h'B8'
	retlw h'9E'
	retlw h'45'
	retlw h'73'
	retlw h'CE'
;s[57] = 'DA6D99F440E03581'
	retlw h'DA'
	retlw h'6D'
	retlw h'99'
	retlw h'F4'
	retlw h'40'
	retlw h'E0'
	retlw h'35'
	retlw h'81'
;s[58] = '2594A813A786AA14'
	retlw h'25'
	retlw h'94'
	retlw h'A8'
	retlw h'13'
	retlw h'A7'
	retlw h'86'
	retlw h'AA'
	retlw h'14'
;s[59] = '29AC9948B086A498'
	retlw h'29'
	retlw h'AC'
	retlw h'99'
	retlw h'48'
	retlw h'B0'
	retlw h'86'
	retlw h'A4'
	retlw h'98'
;s[60] = '7EC4D8BAC0BFA46A'
	retlw h'7E'
	retlw h'C4'
	retlw h'D8'
	retlw h'BA'
	retlw h'C0'
	retlw h'BF'
	retlw h'A4'
	retlw h'6A'
;s[61] = '21637EE089A13E62'
	retlw h'21'
	retlw h'63'
	retlw h'7E'
	retlw h'E0'
	retlw h'89'
	retlw h'A1'
	retlw h'3E'
	retlw h'62'
;s[62] = '04B070B1A9F7CB67'
	retlw h'04'
	retlw h'B0'
	retlw h'70'
	retlw h'B1'
	retlw h'A9'
	retlw h'F7'
	retlw h'CB'
	retlw h'67'
;s[63] = '52492DE3CEA59C25'
	retlw h'52'
	retlw h'49'
	retlw h'2D'
	retlw h'E3'
	retlw h'CE'
	retlw h'A5'
	retlw h'9C'
	retlw h'25'
;s[64] = 'A8C971E85214AE35'
	retlw h'A8'
	retlw h'C9'
	retlw h'71'
	retlw h'E8'
	retlw h'52'
	retlw h'14'
	retlw h'AE'
	retlw h'35'
;s[65] = 'D0B5FDA1EFAECB70'
	retlw h'D0'
	retlw h'B5'
	retlw h'FD'
	retlw h'A1'
	retlw h'EF'
	retlw h'AE'
	retlw h'CB'
	retlw h'70'
;
;************************
;FINE TABLE
;************************ 
;
;************************************************************
; ROUTINES COMUNI E DI DECIFRATURA (400-7FF)
;************************************************************
	ORG		0x400
;************************************************************
; DECIFRATURA a 8 bytes
;************************************************************
;
DECIFRATURA8:
	movlw h'03'
	movwf TBLNMB
	movlw h'FF'
	movwf TBLADR
	movlw h'20'
	movwf ITERAZ
LoopDecifr8:
	call DSECRETKEYS8
; Recupero di B
	movlw h'2F'
	call SOTTR ; b = (b - s2i+1)
	bcf STATUS,RP0 ; Bank 0	
	movf 0x37,w
	bsf STATUS,RP0 ; Bank 1
	movwf SEQCNT
	btfsc SEQCNT,6	
	goto RgtRotazBD8
; Rotazioni a sinistra
	movlw h'3F'
	call LEFT_ROT 
	goto ContBD8
; Rotazioni a destra
RgtRotazBD8:
	movlw h'38'
	call RIGHT_ROT
ContBD8:
	btfss SEQCNT,0
	goto NoSwapBD8
; Swap di B
	movlw h'38'	
	call BYTESWAP
NoSwapBD8:
	movlw h'30'
	call BXORA ; b = (b xor a)
; Recupero di A
	movlw h'27'
	call SOTTR ; a = (a - s2i)
	bcf STATUS,RP0 ; Bank 0	
	movf 0x3F,w
	bsf STATUS,RP0 ; Bank 1
	movwf SEQCNT
	btfsc SEQCNT,6	
	goto RgtRotazAD8
; Rotazioni a sinistra
	movlw h'37'
	call LEFT_ROT 
	goto ContAD8
; Rotazioni a destra
RgtRotazAD8:
	movlw h'30'
	call RIGHT_ROT	
ContAD8:
	btfss SEQCNT,0
	goto NoSwapAD8
; Swap di A
	movlw h'30'	
	call BYTESWAP
NoSwapAD8:
	movlw h'38'
	call AXORB ; a = (a xor b)
	decfsz ITERAZ,1
	goto LoopDecifr8
; Fine della Decifratura	
	call STARTKEYS
	movlw h'27'
	call SOTTR ; a = (a - s0)
	movlw h'2F'
	call SOTTR ; b = (b - s1)
	return
;
;*****************************************************************
; DeSecret Keys A 8 BYTES S2i in 20-27 e S2i+1 in 28-2F
;*****************************************************************
;
DSECRETKEYS8:
	movlw h'10'
	movwf SEQCNT	
	movlw h'2F'	
	movwf FSR
	movf TBLNMB,w
	movwf PCLATH
LoopDSecret8:
	movf TBLADR,w
	call TABLE1
	movwf INDF
	decf TBLADR
	decf FSR
	decfsz SEQCNT,1
	goto LoopDSecret8
	movlw h'FF'
	subwf TBLADR,w
	btfss STATUS,Z
	return
	movlw h'02'
	subwf TBLNMB
	return
;
;*********************************************************************
; AXORB A N BYTES (xx-x+7) xor ((x+08)x-(x+08)x) = (xx-x+7)
;*********************************************************************
;
AXORB:	
	movwf FSR
	movf NBYTES,w
	movwf SEQCNT	
LoopXorA:	
	movf INDF,w
	movwf BYTEVL
	movf NBYTES,w
	subwf FSR
	movf BYTEVL,w
	xorwf INDF
	movf NBYTES,w
	addwf FSR
	incf FSR
	decfsz SEQCNT,1
	goto LoopXorA
	return
;
;*********************************************************************
; BXORA A N BYTES (xx-xx) xor ((x+8)x-(x+8)x) = (xx-xx)
;*********************************************************************
;
BXORA:	
	movwf FSR
	movf NBYTES,w
	movwf SEQCNT	
LoopXorB:	
	movf INDF,w
	movwf BYTEVL
	movf NBYTES,w
	addwf FSR
	movf BYTEVL,w
	xorwf INDF
	movf NBYTES,w
	subwf FSR
	incf FSR
	decfsz SEQCNT,1
	goto LoopXorB
	return
;
;************************************************************
; BYTESWAP
;************************************************************
;
BYTESWAP:
	movwf FSR
	movf NBYTES,w
	movwf COUNT1
SwapLoop:
	swapf INDF
	incf FSR
	decfsz COUNT1,1
	goto SwapLoop
	return
;
;************************************************************
; RIGHT_ROT A N BYTES 
;************************************************************
;
RIGHT_ROT:
	movwf FSR
	movf SEQCNT,w
	movwf COUNT2
	movlw h'3F'
	andwf COUNT2
LoopRgtRot:	
	movf NBYTES,w
	movwf COUNT1
	bcf STATUS,C ; azzera il Carry
RgtRot:
	rrf INDF
	incf FSR
	decfsz COUNT1,1
	goto RgtRot	
	rrf COUNT1 ; salva il valore del Carry in COUNT1 (che è azzerato)
	movf NBYTES,w
	subwf FSR ; riporta il puntatore al primo byte
	movf COUNT1,w ; recupera il Carry
	iorwf INDF
	decfsz COUNT2,1
	goto LoopRgtRot
	return
;
;************************************************************
; LEFT_ROT A N BYTES 
;************************************************************
;
LEFT_ROT:
	movwf FSR
	movf SEQCNT,w
	movwf COUNT2
	movlw h'3F'
	andwf COUNT2
LoopLftRot:	
	movf NBYTES,w
	movwf COUNT1
	bcf STATUS,C ; azzera il Carry
LftRot:
	rlf INDF
	decf FSR
	decfsz COUNT1,1
	goto LftRot	
	rlf COUNT1 ; salva il valore del Carry in COUNT1 (che è azzerato)
	movf NBYTES,w
	addwf FSR ; riporta il puntatore all'ultimo byte
	movf COUNT1,w ; recupera il Carry
	iorwf INDF
	decfsz COUNT2,1
	goto LoopLftRot
	return
;
;******************************************************************
; SOMMA A N BYTES (xx - xx+7) = (xx - xx+7) + ((x-10)x-(x-10)x)
;******************************************************************
;
SOMMA:	
	movwf FSR
	movf NBYTES,w
	movwf SEQCNT	
	clrf OLDCARRY ; azzera eventuale riporto di operazioni precedenti
LoopSum:
	clrf NEWCARRY ; inizializza riporto di operazioni successive
	movf INDF,w
	movwf BYTEVL ; salva il secondo addendo
	movlw h'10' 
	addwf FSR ; punta al primo addendo
	movf BYTEVL,w ; recupera il secondo addendo
	addwf INDF,w ; somma in w primo e secondo addendo
	btfsc STATUS,C ; se si genera un riporto
	incf NEWCARRY,f  ; incrementa NEWCARRY (per il byte successivo 
	addwf OLDCARRY,w ; somma in w anche il Carry precedente
	btfsc STATUS,C ; se si genera un riporto
	incf NEWCARRY,f  ; incrementa NEWCARRY (per il byte successivo	 
	movwf INDF ; salva il risultato
	movf NEWCARRY,w
	movwf OLDCARRY ; adesso NEWCARRY diventa OLDCARRY
	movlw h'10'
	subwf FSR
	decf FSR
	decfsz SEQCNT,1
	goto LoopSum
	return
;
;******************************************************************
; COMPLEMENTO A DUE A N BYTES 
;******************************************************************
;
COMPL:	
	movwf FSR
	movf NBYTES,w
	movwf SEQCNT	
	clrf OLDCARRY ; azzera eventuale riporto di operazioni precedenti
	movlw h'01'
LoopCompl:
	movwf BYTEVL ; salva il secondo addendo
	clrf NEWCARRY ; inizializza riporto di operazioni successive
	comf INDF ; esegue il complemento a uno del byte corrente
 	addwf INDF ; somma nel registro il byte '1'
	btfsc STATUS,C ; se si genera un riporto
	incf NEWCARRY,f  ; incrementa NEWCARRY (per il byte successivo
	movf OLDCARRY,w 
	addwf INDF ; somma nel registro anche il Carry precedente
	btfsc STATUS,C ; se si genera un riporto
	incf NEWCARRY,f  ; incrementa NEWCARRY (per il byte successivo	 
	movf NEWCARRY,w
	movwf OLDCARRY ; adesso NEWCARRY diventa OLDCARRY
	decf FSR
	movlw h'00' ; byte a zero da sommare per il complemento a due
	decfsz SEQCNT,1
	goto LoopCompl
	return
;
;************************************************************
; SOTTR A N BYTES (xx-xx) - ((x-10)x-(x-10)x) = (xx-xx)
;************************************************************
;
SOTTR:
	movwf COMPLRF ; salva indirizzo sottraendo	
	call COMPL ; esegue il complemento a due del sottraendo
	movf COMPLRF,w ; recupera indirizzo sottraendo
	call SOMMA ; esegue la somma
	return
;************************************************************
; START KEYS (S0 S1) 
;************************************************************
STARTKEYS:	
	bcf STATUS,RP0 ; Bank 0;s[0] = 'CB8196CA68D52AFC'
	movlw h'CB'
	movwf 0x20
	movlw h'81'
	movwf 0x21
	movlw h'96'
	movwf 0x22
	movlw h'CA'
	movwf 0x23
	movlw h'68'
	movwf 0x24
	movlw h'D5'
	movwf 0x25
	movlw h'2A'
	movwf 0x26
	movlw h'FC'
	movwf 0x27
;s[1] = '06F0886EC3C1ED6D'
	movlw h'06'
	movwf 0x28
	movlw h'F0'
	movwf 0x29
	movlw h'88'
	movwf 0x2A
	movlw h'6E'
	movwf 0x2B
	movlw h'C3'
	movwf 0x2C
	movlw h'C1'
	movwf 0x2D
	movlw h'ED'
	movwf 0x2E
	movlw h'6D'
	movwf 0x2F
	bsf STATUS,RP0 ; Bank 1
	return
;
; ************************************************
; ROUTINES DI GESTIONE
; ************************************************
;
;***********************************************
; DELAY Routine max 196,65 msec, min 0,771 msec
;***********************************************
;
DELAY_MAX:
	movlw h'FF'
DELAY:
	movwf COUNT2
Dly2:
	movlw h'FF'
	movwf COUNT1
Dly1:
	decfsz COUNT1,1
	goto Dly1
	decfsz COUNT2,1
	goto Dly2	
	return
;
;****************************************************
; LDELAY Routine lungo ritardo 1 ciclo circa 196 msec; max 49.8 sec circa
;****************************************************
;
LDELAY_STD:
	movlw h'02'
LDELAY:
	movwf ITERAZ
Dly3:
	call DELAY_MAX
	decfsz ITERAZ,1
	goto Dly3
	return
;
;*****************************************************************
; SEQVALID: Confronta SEQ1(xx) - SEQ2(xx+16) SEQCNT:Lunghezza Seq.
; CONFR = 0 non validata; CONFR = 1 validata
;*****************************************************************
;
SEQVALID:
	movwf FSR
	clrf CONFR
SeqValLoop:	
	movf INDF,w
	movwf BYTEVL
	movlw h'10'
	addwf FSR
	movf BYTEVL,w
	subwf INDF,w
	btfss STATUS,Z ;se risultato =0 Z=1 salta (e continua)
	return ; ritorna con CONFR = 0: non validata
	movlw h'10'
	subwf FSR
	incf FSR
	decfsz SEQCNT,1
	goto SeqValLoop
	incf CONFR ; ritorna con CONFR = 1: validata
	return
;
;*****************************************************************
; ZEROTEST: Confronta SEQ con zero SEQCNT:Lunghezza Seq.
; CONFR = 0 sequenza non zero; CONFR = 1 sequenza zero
;*****************************************************************
;
ZEROTEST:
	movwf FSR
	clrf CONFR
ZeroTestLoop:	
	movf INDF,w
	btfss STATUS,Z ;se risultato =0 Z=1 salta (e continua)
	return ; ritorna con CONFR = 0: sequenza non zero
	incf FSR
	decfsz SEQCNT,1
	goto ZeroTestLoop
	incf CONFR ; ritorna con CONFR = 1: sequenza zero
	return
;
;********************************************************************************
; COUNTER_COPY: 
;********************************************************************************
;
COUNTER_COPY:
; Salva il contatore in 50-53
	movlw h'04'
	movwf SEQCNT
	movlw h'30'
	movwf FSR
CntCpyLoop:
	movf INDF,w
	movwf BYTEVL
	movlw h'20'
	addwf FSR
	movf BYTEVL,w
	movwf INDF
	movlw h'20'
	subwf FSR
	incf FSR
	decfsz SEQCNT,1
	goto CntCpyLoop
	return
;
;***********************************************************************
; COUNTER_RECOV: carica in 40-43 il contatore della chiave puntata da 3F
; prelevandolo F4-FE della EEPROM 
;***********************************************************************
;
COUNTER_RECOV:
 	movlw h'40' 
	movwf TBLADR
	movlw h'04'
	movwf SEQCNT
	bcf STATUS,RP0 ; Bank 0
	movf CMDRCV,w
	bsf STATUS,RP0 ; Bank 1
	movwf EEADR
	movf TBLADR,w
	call INTEE_RD
	return
;
;********************************************************************************
; COUNTER_SAVE: Salva il contatore nella EEPROM 
; (senza l'ultimo byte) 
;********************************************************************************
;
COUNTER_SAVE:
 	movlw h'04'
	movwf SEQCNT
	bcf STATUS,RP0 ; Bank 0
	movf CMDRCV,w
	bsf STATUS,RP0 ; Bank 1
	movwf EEADR
	movlw h'30'
	call INTEE_WR	
	return
;
;***************************************************************
; LOCKID_RECOV: carica in 44-4E il codice serratura
;***************************************************************
;
LOCKID_RECOV:
	bcf STATUS,RP0 ; Bank 0
; LockId = '445566778899AABBCCDDEE'
	movlw h'44'
	movwf 0x44
	movlw h'55'
	movwf 0x45
	movlw h'66'
	movwf 0x46
	movlw h'77'
	movwf 0x47
	movlw h'88'
	movwf 0x48
	movlw h'99'
	movwf 0x49
	movlw h'AA'
	movwf 0x4A
	movlw h'BB'
	movwf 0x4B
	movlw h'CC'
	movwf 0x4C
	movlw h'DD'
	movwf 0x4D
	movlw h'EE'
	movwf 0x4E
	bsf STATUS,RP0 ; Bank 1	
	return
;********************************************************************************
; COUNTERS_RESET: Azzera tutti i contatori della EEPROM  
;********************************************************************************
;
COUNTERS_RESET:
 	movlw h'3C'
	movwf BYTCNT
	bcf STATUS,RP0 ; Bank 0
	clrf CMDRCV
	bsf STATUS,RP0 ; Bank 1	
CntRstLoop:
	call COUNTER_SAVE
	movlw h'04'
	bcf STATUS,RP0 ; Bank 0
	addwf CMDRCV,1
	bsf STATUS,RP0 ; Bank 1	
	decfsz BYTCNT,1
	goto CntRstLoop	
	return
;
;******************************************
; EEREAD Routine: indirizzo in w
;******************************************
;
EEREAD:
	movwf EEADR ;Address to read
	bsf EECON1,RD ;EE Read
	movf EEDAT,W ;risultato in w
	return
;
;*************************************************************
; EEWRITE Routine: byte in EEDAT, indirizzo in EEADR  
;*************************************************************
;
EEWRITE:
	bsf EECON1,WREN ;Enable write
	movlw h'55' ;Unlock write
	movwf EECON2
	movlw h'AA'
	movwf EECON2
	bsf EECON1,WR ;Start the write
	movlw h'0A' ; 06 è il minimo
	call DELAY
	return
;
;********************************************************************************
; INTEE_WR ROUTINE da RAM a EEPROM, lunghezza sequenza in SEQCNT 
;********************************************************************************
;
INTEE_WR:
	movwf FSR
IntEEWrLoop:
	movf INDF,w
	movwf EEDAT
	call EEWRITE
	incf FSR
	incf EEADR
	decfsz SEQCNT,1
	goto IntEEWrLoop
	return
;
;********************************************************************************
; INTEE_RD ROUTINE da EEPROM a RAM, lunghezza sequenza in SEQCNT 
;********************************************************************************
;
INTEE_RD:
	movwf FSR
IntEERdLoop:
	bsf EECON1,RD ;EE Read
	movf EEDAT,W ;risultato in w	
	movwf INDF
	incf FSR
	incf EEADR
	decfsz SEQCNT,1
	goto IntEERdLoop
	return
;
;******************************
;GESTIONE AC
;******************************
;
;*****************
; ACTUATOR CONTROL
;*****************
;
ACTCNT:
;
;	Syncronization	VALFL=0 Negative Polarity (Status Off)
;					VALFL=1 Positive Polarity (Status On)
;
	btfsc VALFL,0
	goto Syncr2 
; Negative Polarity
Syncr1:
	btfss PORTC,3
	goto Syncr1 ; waiting for AC=1
	goto LdPr
; Positive Polarity
Syncr2:
	btfsc PORTC,3
	goto Syncr2 ; waiting for AC=0
;
; Loading procedure
;
LdPr:
	call TRANSDET ; 0-->1
	call PWSPCNT
	return
;
; **********************
; Transition Detection
; **********************
;
TRANSDET:
	btfsc PORTC,3
	goto Tr10 ; jump if AC Signal=1
; AC Signal=0
Tr01:
	btfss PORTC,3	 
	goto Tr01 ; waiting for AC=1
	return
Tr10:
	btfsc PORTC,3
	goto Tr10 ; waiting for AC=0
	return
;
; **************************
; Power Supply Control Signal
; **************************
;
PWSPCNT:
	movlw h'FF'
	movwf PCOUNT1
PDly1:
	decfsz PCOUNT1
	goto PDly1
;	
;	Spike Emission
;
	bcf PORTC,5 ; Signal Active	
	movlw h'10' ; durata spike
	movwf PCOUNT1
Spk1:
	decfsz PCOUNT1
	goto Spk1
	bsf PORTC,5 ; Signal Inactive	
	return
;
;******************************************************************************
	end ; directive 'end of program'
;******************************************************************************
;