P
R
O
C
E
D
U
Il programma dell'antifurto.
Sono qui riportate le varie procedure e fasi che compongono il programma: fare clik su un nome per maggiori dettagli.
Dichiarazione registri standard / variabili.
Modifica dello Stato del sistema.
Inizializzazione registri e variabili.
I suoni e le segnalazioni acustiche.
Ricezione di un Byte del codice.
L'allarme e l'effetto panico.
Modifica Codice Utente.
Altre procedure.
Il Microcontrollore | Pagina Generale | Gli Schemi
Dichiarazione registri standard e delle variabili di programma
.Title "ALLARME" ; Titolo Del Programma .Vers "ST6210" ; Microprocessore Usato .W_On ; Abilita La Memoria A Finestre ;*********************************************************************** ; Assegnazione di nomi mnemonici ai registri del Micro ;*********************************************************************** A .Def 0ffh ;Registro Accumulatore X .Def 080h ;Registro X - Per indirizzamento indiretto Y .Def 081h ;Registro Y - Per indirizzamento indiretto V .Def 082h ;Registro V W .Def 083h ;Registro W - Per indirizzamento dei blocchi Port_A .Def 0c0h ;Registro Dati Porta A Port_B .Def 0c1h ;Registro Dati Porta B Port_C .Def 0c2h ;Registro Dati Porta C Pdir_A .Def 0c4h ;Registro Direzione Porta A Pdir_B .Def 0c5h ;Registro Direzione Porta B Pdir_C .Def 0c6h ;Registro Direzione Porta C Popt_A .Def 0cch ;Registro Opzioni Porta A Popt_B .Def 0cdh ;Registro Opzioni Porta B Popt_C .Def 0ceh ;Registro Opzioni Porta C Ior .Def 0c8h ;Registro Opzioni Per Le Interruzioni Addr .Def 0d0h ;Registro Dati Dell'A/D Converter Adcr .Def 0d1h ;Registro Di Controllo Dell'A/D Converter Psc .Def 0d2h ;Registro Per Il Prescaler Del Timer Tcr .Def 0d3h ;Registro Dati Del Timer Tscr .Def 0d4h ;Registro Tscr Del Timer Wd .Def 0d8h ;Registro Del Watchdog Drw .Def 0c9h ;Registro Della Zona Dati Rom (Rom Data Window) ;*********************************************************************** ; D I C H I A R A Z I O N E D E L L E V A R I A B I L I ;*********************************************************************** Tasti .Def 084h ;Cifre Del Codice Stato .Def 085h ;Stato Del Sistema H .Def 086h ;Nø Cicli Del Suono In Ingresso D .Def 087h ;Nø Cicli Del Suono Vero E Proprio Grande .Def 088h ;Ciclo Pi— Esterno Delle Ripetizioni Puntine .Def 089h ;Stato Delle Puntine All'Ultima Variazione Cont .Def 08ah ;Contatore generico di Cicli Punte .Def 08bh ;Stato Attuale Delle Puntine Invio .Def 08ch ;Valore EFFETTIVO del tasto di Invio TasCam .Def 08dh ;Tasto per cambiare il codice TasSuon .Def 08eh ;Tasto per far suonare l'allarme Tas1 .Def 08fh ;16 Byte di Codice *** NON CAMBIARE DI INDIRIZZO *** Tas2 .Def Tas1+1 Tas3 .Def Tas2+1 Tas4 .Def Tas3+1 Tas5 .Def Tas4+1 Tas6 .Def Tas5+1 Tas7 .Def Tas6+1 Tas8 .Def Tas7+1 Tas9 .Def Tas8+1 Tas10 .Def Tas9+1 Tas11 .Def Tas10+1 Tas12 .Def Tas11+1 Tas13 .Def Tas12+1 Tas14 .Def Tas13+1 Tas15 .Def Tas14+1 Tas16 .Def Tas15+1
È una parte di programma che non genera codice, ma serve al compilatore per riconoscere i nomi mnemonici che noi assegniamo ad una particolare cella di memoria, per evitarci di riscrivere ogni volta l'indirizzo di ogni registro. Vanno qui dichiarati:
Inizializzazione dei registri e delle variabili.
.Org 0880h ;Significa: da qui in poi memorizziamo il ;programma nella memoria Rom Ina Ldi Wd,255 Ldi Invio,4 ;Impostazioni dei vari tasti Ldi TasCam,8 ;Tasto per cambiare codice Ldi TasSuon,8 ;Tasto per l'effetto panico Ldi Tasti,3 ;Imposta un codice iniziale di 3 Cifre: Clr Tas1 ;0 Clr Tas2 ;0 Clr Tas3 ;0 Ldi Pdir_B,00000000b Ldi Popt_B,00000000b Ldi Port_B,00011111b Ldi Pdir_A,00000111b Ldi Popt_A,00000111b Ldi Port_A,00000010b Clr Stato ;Indica che all'accensione lo stato è ON ;*** Disabilita Gli Interrupt Che Non Servono Ldi Wd,255 Ldi Adcr,00 ;Disabilita A/D Interrupt Ldi Tscr,00 ;Disabilita Timer Interrupt Ldi Ior,00 Ldi Wd,255 Call On_Off Reti ; Alla Fine Della Inizializzazione Va Messa Jp Main ;Salta al programma principale
Vengono qui settati i valori preliminari (il codice alla prima accensione, le funzioni dei vari piedini, lo stato iniziale), si disattivano tutti gli interrupt (tranne l'NMI, naturalmente) e si settano i tasti funzione. Si ricordi che, parlando del 74922, si è detto che la disposizione dei tasti era indifferente, purché fissa: in questa parte del programma si assegnano i valori che il Micro vede per ogni tasto che noi premiamo. Se, ad esempio, volessimo far suonare l'allarme premendo il tasto "C" sulla tastiera, controllando la tabella delle equivalenze, sapremmo di dover assegnare alla variabile "TasSuon" il valore 14, o Eh. Qui si è invece usato il tasto "#", come anche per cambiare il codice, mentre si è usato il tasto "*" come Invio.
;********************************************************************** ;Carica nell'accumulatore gli ultimi 4 bit del Port B ;********************************************************************** Leggi Ldi Grande,150 A166 Ldi Cont,255 A144 Ldi Wd,255 Jrs 4,Port_B,Leggo ;Attende un livello alto di ricezione Dec Cont Jrnz A144 Dec Grande Jrnz A166 Jp Nonle Leggo ;Call Pausa2 ;Solo se direttamente da un decoder Ld A,Port_B Andi A,0fh ;Ld Y,A ;Inutile Jp HoLe ;********************************************************************** Ok Jp Leggi Leggir Ldi Wd,255 ;Set 3,Port_A ;Togliere, indica: in lettura Ldi Grande,150 F166 Ldi Cont,255 F144 Ldi Wd,255 Jrr 4,Port_B,Ok Dec Cont Jrnz F144 Dec Grande Jrnz F166 Nonle Ld A,Invio ;Res 3,Port_A ;Togliere Assolutamente HoLe Ldi Wd,255 Ret
Questa procedura, che può sembrare banale, ha invece diversi compiti molto importanti. Infatti, oltre a leggere il dato presente sul Port B ed a farne l'And con 16 per ottenere solo gli ultimi quattro bit, si occupa anche della temporizzazione. Se non riceve un segnale di tasto premuto entro un certo periodo di tempo, o se si tiene premuto un tasto troppo a lungo, la procedura si blocca per evitare di mandare in stallo il programma (sarebbe facile, altrimenti, per un ladro che si sia già procurato il telecomando giusto, tenere premuto un tasto per non far suonare l'allarme, e contemporaneamente smontare la moto per tentare di manomettere la centralina, o solo per rubare carena, benzina, specchietti o simili) restituendo il codice di Invio.
Si noti inoltre come, nell'ST6, il concetto di procedura non sia rigido e ben definito: richiamata una procedura con una Call, dall'interno di questa si può benissimo saltare ad un'altra (anche non dall'inizio) e sfruttare la Ret di quest'ultima per tornare dove il programma era stato interrotto per richiamare la prima. Si faccia però attenzione a far coincidere sempre il le Call con le Ret !
Ricezione e Riconoscimento del codice.
Ricevi Ld A,Tasti ;il numero di cifre di cui è composto il codice Ld W,A ;si ricordi che non è ammesso scrivere:Ld W,tasti Ldi X,8Fh Call Leggi Cp A,TasSuon ;Se si preme come primo tasto Jrnz Cic1 ;quello corrispondente al vaolre di "TasSuon" jrr 0,Stato,Cic1 ;si fa suonare l'allarme, Ldi A,144 Jp Fineric ;sempre che sia acceso Cic1 Cp A,(X) ;ciclo in cui si controllano le varie Jrnz Fineric ;cifre del codice: Inc X ;la "Leggi" restituisce il tasto letto nell' Call Leggir ;accumulatore, poi lo si confronta col byte Dec W ;puntato dal registro X, fino ad azzerare Jrnz Cic1 ;W che conteneva il numero di byte del codice. ;Res 3,Port_A ;Reinserire ;Accende Il Led Che Segnala Poss. Cambiare Cp A,TasCam ;Premere il tasto corrispondente a "TasCam" come ultimo per Jrz Cambia ;cambiare il codice; non altera lo stato dell'allarme Cp A,Invio ;Aggiunto dopo Jrnz Fineric ;Premere Invio come ultimo per convalidatre l'operazione: ;Si può anche non premere niente ed attendere il Time-Out ;di ricezione, ma non si può premere un altro tasto Hocamb Jp On_Off Fineric Ret
Acquisisce il codice che gli arriva dal telecomando (filtrato dalle procedure sopra descritte) e lo confronta con il codice che ha in memoria, fino a ricevere il codice di invio. Se dovesse però trovare un carattere differente, il ciclo si arresterebbe e la procedura terminerebbe. Se, invece, il codice è esatto, attende un ultimo carattere: se questo è un Invio, si cambia lo stato, se è uguale a "TasCam", si cambia il codice, altrimenti si annulla tutto.
Se però si preme come primo tasto "TasSuon" e l'antifurto è attivo, si pone nell'accumulatore il valore 144 (che non potrebbe mai essere un tasto, in quanto > 15) e si termina la procedura: sarà la procedura chiamante (la Ric, e non la Rice, che pure è abilitata a chiamare la ricevi) a passare alla procedura Rompo nel punto Soldi, per far suonale l'allarme.
Modifica del Codice Utente da telecomando
Cambia Ldi X,8Fh Call Leggir Cp A,Invio Jrz Finecam Ldi Tasti,1 ;Azzera il numero di Byte del codice. CicCamb Ld (X),A Inc X Call Leggir Cp A,Invio Jrz Finecam Inc Tasti Jrr 4,Tasti,CicCamb ;se Tasti
Procedura usata per cambiare il codice, ovvero per impostarne uno nuovo da 1 a 16 cifre (se ne sarebbero potute benissimo gestire anche il doppio: la memoria del Micro sarebbe bastata; quella di un uomo no!). Per interrompere prima di sedici cifre, premere Invio; se lo si preme come prima cifra, il codice non viene cambiato. Si può usare qualsiasi tasto, tranne l'Invio. Con 16 cifre le combinazioni sono, in base alla tastiera usata:
X = Tasti validi; n = Byte codice
Naturalmente i valori così ottenuti vanno moltiplicati per i 35 = 243 codici del telecomando, per un totale massimo di 1710 miliardi di miliardi di combinazioni (coraggio: provatele tutte!)
Modifica Stato e controllo uscite.
;********************************************************************** ;Procedura che cambia lo stato del sistema e delle uscite: si occupa ;della gestione dei segnali acustici e dell'avviamento della Moto. ;********************************************************************** On_Off Inc Stato Ldi Wd,255 Jrr 0,Stato,Spegni Ldi H,5 Set 1,Port_A Call Beep Fine Call Pausa1 Clr Puntine Jrr 6,Port_B,Finito Inc Puntine Finito Jp Fineric Spegni Ldi Wd,255 Ldi H,23 Res 1,Port_A Call Beep Jrr 3,Port_A,Folle ;se la moto non è a folle non si tenta Jp Fineric ;di avviarla per evitare probabili danni alle Folle Ldi H,75 ;persone ed alle cose. Ponticellare l'ingresso Ldi Punte,3 ;"Folle" a +12V per gli Scooter, a Massa per Zero Ld A,H ;auto o moto sprovviste di sensore del folle. Addi A,30 Ld H,A Call Rele Call Pausa1 Ldi Wd,255 Alp Ldi Cont,150 Cesso Call Pausa2 Ldi Wd,255 Beta2 Jrr 5,Port_B,Gamma ;Jrnz Piola ;Sonda Olio Dec Cont Jrnz Cesso Jp Fineric Gamma Dec Punte Jrz Delta Jp Zero Delta Ldi H,17 Call Beep Jp Fineric Rele Ldi Wd,255 Ld A,H Ld Grande,A Set 0,Port_A Mot Ldi Cont,255 Motore Ldi Wd,255 Dec Cont Jrnz Motore Dec Grande Jrnz Mot Res 0,Port_A Ret
Questa procedura Cambia lo stato (dato che esso è rappresentato dal solo LSB della variabile "Stato", è sufficiente incrementare quest'ultima), modifica l'uscita di sistema che controlla il TRIAC e, se si sta disattivando l'allarme, tenta per tre volte (con tempi sempre crescenti) di mettere in moto, sempre che non si accorga di una eventuale marcia inserita. Per controllare se il motore sia realmente partito, controlla la spia dell'olio, che si spegne (livello alto) quando il motore gira; se questa non è presente, si potrà usare il circuito di adattamento proposto tra gli schemi.
Si è fin qui detto che questo apparecchio è dedicato (o meglio, è stato pensato per essere applicato) alle moto, questo non perché in un'auto non funzionerebbe, ma perché ci sono delle piccole differenze, come le temperature, le difficoltà di installazione, ecc. Non ultimo: le auto non hanno (o almeno non tutte) il sensore del folle, se si lasciasse inavvertitamente la marcia inserita, disattivando l'antifurto si potrebbe fare molto danno (si consiglia quindi di non collegare la centralina all'impianto di avviamento e di lasciare l'ingresso "Folle" aperto o a + 12V)
I suoni di Sistema
;******************************************************************** ;Emette una nota acustica: specicficare in H il valore del ritardo ;******************************************************************** Beep Ldi Cont,2 Filini Ldi Grande,255 Rivai Call Suono Dec Grande Jrnz Rivai Dec Cont Jrnz Filini Ret ;*********************************************************************************** ;Genera un impulso positivo ed uno negativo. La durata dei due dipende da H ;*********************************************************************************** Suono Ld A,H Ld D,A Beta Set 2,Port_A Ldi Wd,255 Dec D Jrnz Beta Ld A,H Ld D,A Alpha Res 2,Port_A Dec D Jrnz Alpha Ret ;*************************************************************************** ;Determina che frequenza generare in base al valore del 6° bit di Cont ;*************************************************************************** Durata Jrs 6,Cont,Piu Ldi H,11 Call Suono Ret Piu Ldi H,3 Call Suono Call Suono Call Suono Call Suono Pori Ret
I suoni vengono generati da un'insieme di procedure:
L'allarme e l'effetto panico
Rice Call Ricevi Jrr 0,Stato,Main Jp Wolf Rompo Jrr 7,Port_B,Soldi Clr A Jrr 6,Port_B,Calcio Inc A Calcio Cp A,Puntine Jrnz Soldi Jp Rotto Soldi Ldi Grande,50 Lire Ldi Cont,255 Jrs 4,Port_B,Rice ;Solo se si vuole interrompere il ciclo del suono Wolf Call Durata Dec Cont Jrnz Wolf Dec Grande Jrnz Lire Call Pausa1 Clr Puntine Jrr 6,Port_B,Rotto Inc Puntine Jp Rotto Ric Call Ricevi Cpi A,144 Jrnz Main Jp Soldi ;Jp Main Main Jrs 4,Port_B,Ric Jrs 0,Stato,Rompo Rotto Ldi Wd,255 Jp Main
Se l'antifurto è attivo, il programma principale richiama la procedura "Rompo" che controlla un eventuale stato basso sul Port_B/7, o una variazione di stato del Port_B/6: se si rileva una delle condizioni, l'allarme comincia a "suonare". Solo se è inserita la riga " Jrs 4,Port_B,Rice", il ciclo potrà essere interrotto per controllare un'eventuale tentativo di inserimento codice da telecomando. In tal caso, al ritorno, viene ricontrollato lo stato per determinare se continuare a suonare o tornare al programma principale. Sempre da quest'ultimo verrà ancora controllato il telecomando e, tramite la Ric, si potrà attivare l'effetto panico.
Altre procedure
;********************************************************************** Pausa2 Ldi Grande,60 Cadmio Ldi Wd,255 Dec Grande Jrnz Cadmio Ret Pausa1 Ldi Grande,100 Turbo Ldi Cont,255 Look Ldi Wd,255 Nop Nop Nop Dec Cont Jrnz Look Dec Grande Jrnz Turbo Ret Main Jrs 4,Port_B,Ric Jrs 0,Stato,Rompo Rotto Ldi Wd,255 Jp Main .block 64-$%64 Io2 .Byte 80,114,111,103,114,97,109,109,97,32,105, .Byte 100,101,97,116,111,32,101,32,114,101,97, .Byte 108,105,122,122,97,116,111,32,100,97,32, .Byte 65,110,116,111,110,105,111,32,84,114,105, .Byte 99,97,114,105,99,111,32,45,32,84,82,67, .Byte 32,78,84,78,32,55,56,80,32,48,49,66,32, .Byte 49,56,48,32,75,32,84,101,108,46,32,48,56, .Byte 51,49,45,53,56,49,57,50,55,32,32,45,32, .Byte 32,66,114,105,110,100,105,115,105,32,40, .Byte 73,116,97,108,105,97,41 Ad_Int Reti Tim_Int Reti A_Int Reti Nmi_Int Reti Bc_Int Reti ;Reindirizzamento dei VETTORI di INTERRUPT .Org 0ff0h Jp Ad_Int ;Interrupt Del Conv. A/D Vttore #4 Jp Tim_Int ;Interrupt Del Timer Vttore #3 .Org 0ff4h Jp Bc_Int ;Interrupt Porte B E C Vttore #2 Jp A_Int ;Interrupt Porte A Vttore #1 .Org 0ffch Jp Nmi_Int ;Interrupt Non Mascherabile Vttore #0 Jp Ina ;Vttore Di Reset .End ; Fine Del Programma
Si tratta di procedure di facile comprensione, atte a generare pause, confronti o altri semplici controlli: non modificare, per nessun motivo, il contenuto della variabile Io2.