CONTROLLO NUMERICO DI UN TORNIO DI TIPO DIDATTICO



Documenti analoghi
Lezione 4. Figura 1. Schema di una tastiera a matrice di 4x4 tasti

CIRCUITO DI TEST E SOFTWARE UTILIZZATI

Lezione 8. Figura 1. Configurazione del registro INTCON

A/D CON PIC 16F877. Sommario INTRODUZIONE... 2 SELEZIONARE I BANCHI... 2 ADCON ADCS1, ADCS CH2, CH1 E CH GO/DONE... 6 ADON...

CORSO SERALE ( TDP ) DEMOBOARD FN1Z PER PIC 16F877/16F877A


Laboratorio di Informatica

Esame di INFORMATICA

ZIMO. Decoder per accessori MX81. Manuale istruzioni del. nella variante MX81/N per il formato dei dati NMRA-DCC

10. Funzionamento dell inverter

OSCILLATORI AL QUARZO: CONTASECONDI

Circuito di pilotaggio ON OFF con operazionale

TECNOLOGIA DELLE RESISTENZE

ESERCITAZIONE Scrittura di un programma CNC per la fresatura di un componente dato

Laboratorio di Ingegneria del software Sistema di controllo di un ascensore Requisisti preliminari

TASTIERA DI COMANDO E CONTROLLO PER INVERTERS EL.-5000

PROGETTAZIONE DI UN CONTROLLO ON-OFF CON CRITERI E METODOLOGIA

RIPETITORE DI SEGNALE WIRELESS PER SISTEMA VIA RADIO ART. 45RPT000

Alimentatore con controllo remoto per Protezione Catodica Mod. CT36

1). Descrizione dell impianto attraverso uno schema e specifica della funzione dei componenti.

SCHEDA DI CONTROLLO MOTORE BRUSHLESS BBL_198

INTEGRATORE E DERIVATORE REALI

ESERCIZI - SERIE N.1

COS'E' UN IMPIANTO FOTOVOLTAICO E COME FUNZIONA

Dispositivo di conversione di energia elettrica per aerogeneratori composto da componenti commerciali.

Controllo di un Motore Elettrico in Corrente Continua

Comprendere il funzionamento dei convertitori V/f Saper effettuare misure di collaudo

Chiave DTMF con PIC16F84. Angelo - IT9DOA

Manuale d uso. Display remoto MT-1 ITALIANO

INTERFACCIA PER PC MEDIANTE PORTA SERIALE

POLITECNICO DI TORINO

Costruzione e funzionamento

All interno del computer si possono individuare 5 componenti principali: SCHEDA MADRE. MICROPROCESSORE che contiene la CPU MEMORIA RAM MEMORIA ROM

7^ parte : Acquisizione della temperatura con LM35 e visualizzazione su display LCD. Author: Ing. Sebastiano Giannitto (ITIS M.

Progetto di un alimentatore con Vo = +5 V e Io = 1 A

1. Introduzione 2. Istruzioni per la sicurezza. 2 Verifica imballo Descrizione Specifiche Dati Tecnici 3 Dimensioni...

Ing. Paolo Domenici PREFAZIONE

Manuale Terminal Manager 2.0

EasyPrint v4.15. Gadget e calendari. Manuale Utente

Manuale di programmazione BerMar_Drive_Software

Le macchine elettriche

PLC Programmable Logic Controller

Visione d insieme DOMANDE E RISPOSTE SULL UNITÀ

Introduzione 2. Serie P20 4. Serie P28 6. Serie P35 8. Serie P Serie P Serie P Serie P Serie P85 18.

IL RISPARMIO ENERGETICO E GLI AZIONAMENTI A VELOCITA VARIABILE L utilizzo dell inverter negli impianti frigoriferi.

PROCESSOR 16F84A. ;configurazione FUSES: oscillatore XT, WDT disabilitato PWRT abilitato, CP disabilitato config 0x3FF1

La tecnica DDS. Un generatore di toni DTMF

PANNELLO REMOTO PER BARRIERE 48BFC000 E 48BFC001

Guida alla registrazione on-line di un DataLogger

Introduzione all analisi dei segnali digitali.

B 5000 Sistema di saldatura

Introduzione ai microcontrollori PIC

Corso di Automazione industriale

IL CONTROLLO AUTOMATICO: TRASDUTTORI, ATTUATORI CONTROLLO DIGITALE, ON-OFF, DI POTENZA

ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA ANNO SCOLASTICO 2015/2016

PREMESSA AUTOMAZIONE E FLESSIBILITA'

MODELLIZZAZIONE, CONTROLLO E MISURA DI UN MOTORE A CORRENTE CONTINUA

2 DESCRIZIONE MODALITÀ

Regolatore di carica per micro turbine eoliche. mod. EOREG700V54

Programmatore per telaio scheller

ISTITUTO D ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA

Impianti per il trasferimento di energia

BICI Versione 1.9

Manuale d uso per la raccolta: Sicurezza degli impianti di utenza a gas - Postcontatore

TERMOSTATO SETTIMANALE PROGRAMMABILE

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Caratteristiche elettriche

Verificare il funzionamento delle memorie RAM Saper effettuare misure di collaudo. Dip switch Pulsante n.a. Octal tri-state buffer IC2 = MM 2114

Carica batterie. ADATTATORE 9V PER ACCENDISIGARI Fornisce una tensione di +9V dalla presa accendisigari da 12V dell automobile.

Shine Vision Manuale utente

NTC E MISURA DELLA TEMPERATURA CON ARDUINO

SISTEMI DI NUMERAZIONE E CODICI

LABORATORIO DI SISTEMI

Architettura hardware

Motore passo passo: Laboratorio di Elettronica 1

Gli attuatori. Breve rassegna di alcuni modelli o dispositivi di attuatori nel processo di controllo

Ricevitore Supervisionato RX-24 Dati tecnici

Interruttore automatico

IL CONTATORE ELETTRONICO Istruzioni per l uso.

GW : OROLOGIO 2 CANALI

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

PLC51 AUTOMAZIONE. di G.Filella e C. Befera filella@tin.it

Cap. 3. APERTURA NUOVO PROGETTO

Dispensa di Informatica I.1

Invio SMS. DM Board ICS Invio SMS

ITIS MAX PLANCK ( Lancenigo di Villorba )

Serie 40 - Mini relè per circuito stampato ed a innesto A. Caratteristiche

QUADRO AUTOMATICO A MICROPROCESSORE PER GRUPPO ELETTROGENO D EMERGENZA AMICO INDICE PAG. 1. MANUALE DELL UTENTE 2 DESCRIZIONE

LP 2000 INSTALLAZIONE E MANUTENZIONE

ISTITUTO PROFESSIONALE PER L'INDUSTRIA E L ARTIGIANATO ALESSANDRO VOLTA GUSPINI. PROGRAMMA DIDATTICO con riferimento al programma ministeriale

Decremento patch / canale MIDI. Incremento patch / canale MIDI. Ingresso DC 12V Memorizzazione patch. Modalità funzionamento looper

Manuale Software e Hardware Control lights music 1.0. Sommario. Introduzione

Appunti sulla Macchina di Turing. Macchina di Turing

Manuale IT_VNA by IZ1PMX

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

ITIS ind. Elettronica etelecomunicazioni Classe IV A Area di progetto PIANOLA ELETTRONICA Studenti: Vari Manuel e Antonelli Davide

TUTORIAL: COME USARE UN LM35 PER MISURARE UNA TEMPERATURA SU TUTTA LA SCALA CENTIGRADA

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

PLC Sistemi a Logica Programmabile Il linguaggio Ladder-Parte

LA PROGRAMMAZIONE N10 G0 X5 Y5

Transcript:

CONTROLLO NUMERICO DI UN TORNIO DI TIPO DIDATTICO ELETTRONICA E TELECOMUNICAZIONI AREA DI PROGETTO TESINA PLURIDISCIPLINARE ISTITUTO TECNICO INDUSTRIALE STATALE MAX PLANCK o LANCENIGO VILLORBA (TV) CLASSE V A/Z anno scolastico 2001/2002 o CORSO SERALE Alla realizzazione della tesina hanno partecipato De Luca Domenico, Palù Riccardo, Crepaldi Stefano, Tosatto Mauro 1

INDICE Breve storia del tornio utilizzato pag. 3 Struttura e caratteristiche della macchina pag. 4 L idea di progetto pag. 5 Schemi elettrici pag. 7 Il display a cristalli liquidi pag. 11 Il tastierino esadecimale pag. 16 Interfaccia di potenza motori passo-passo pag. 19 Interfaccia di potenza controllo motore mandrino pag. 22 Alimentatore pag. 24 Analisi del software pag. 29 Manuale d uso pag. 73 2

IL TORNIETTO UTILIZZATO Tutto ebbe inizio tempo fa quando l insegnante di TDP,Prof. Zaniol Italo, scoprì di essere fortemente attratto da un rudimentale apparecchio di sembianze meccaniche, in grado, grazie ad un semplice moto rotatorio, di formare oggetti circolari. Il tornietto di dimensioni contenute, all incirca mezzo metro di lunghezza per trenta centimetri di larghezza, giaceva indisturbato nei sotterranei della scuola. Di difficile funzionamento a causa del tipo di controllo utilizzato,, andava pian piano arrugginendo per la mancata manutenzione. Infatti per poter funzionare aveva bisogno di un laborioso procedimento di avvio basato sulla lettura di un nastro magnetico che conteneva il programma di lavoro. La scheda di controllo, di dimensioni ingombranti, era basata su un microprocessore della INTEL (l 8088) che necessitava di numerosi integrati di supporto come memoria ROM, memoria RAM, interfacce di ingresso-uscita ( l 8255), timer (l 8253) e altri componenti. Bene, ora grazie ad un remaking, la scheda di controllo è di dimensioni compatte ( poco più di un decimetro quadrato). Il cuore del sistema di controllo è un microcontrollore, il PIC16F877, nato nel secondo semestre del 2000; da solo compie quasi tutte le funzioni necessarie per far funzionare il tornietto. Rimesso a nuovo, è ora in grado di compiere, con gli utensili opportuni, piccole torniture cilindriche e coniche. Nato a fini scolastici, il tornietto ha una risoluzione di due centesimi di millimetro. Non molto se si volessero eseguire lavori di altissima precisione. E dotato di motori passo-passo che limitano la potenza disponibile; si devono perciò eseguire asportazioni di pochi centesimi di mm per passata su materiali teneri. L ELETTRONICA PRIMA ( panello 1200 X 900 mm ) L ELETTRONICA DOPO ( circa 130 X 150 mm ) 3

STRUTTURA E CARATTERISTICHE DELLA MACCHINA Gli elementi essenziali che compongono il nostro tornio possono essere indicati in: Un motore elettrico monofase per l azionamento del mandrino porta pezzo; Due motori passo-passo per l azionamento degli assi x-y; Quattro fine corsa che delimitano gli spostamenti degli assi Per quanto riguarda l azionamento degli assi x-y, si tratta di realizzare un controllo di posizione di un asse che rappresenta una delle parti fondamentali di un controllo numerico; di norma tali controlli sono ad anello chiuso, cioè si usa la retroazione negativa effettuata per mezzo di trasduttori di posizione come encoder incrementale, encoder assoluto, oppure una cremagliera collegata ad un trasformatore differenziale o ad un potenziometro di precisione, tutti indispensabili per misurare la posizione. Nel nostro caso non si usa tale tecnica in quanto i motori sono di tipo passo-passo e la loro posizione viene controllata tramite impulsi di comando. Ad ogni impulso il motore compie un passo ( ad esempio una rotazione dell asse motore di 7.5 gradi), senza alcun bisogno di collegare un trasduttore in retroazione. A prima vista, sembrerebbe che l'utilizzo di motori passo-passo fosse vantaggioso per la semplicità del controllo, ma nella realtà essi vengono usati solo dove le potenze meccaniche richieste sono modeste. Nelle macchine a controllo numerico sono invece utilizzati motori in corrente continua, motori in corrente alternata pilotati da inverter e motori brushless. Generalmente nelle macchine utensili viene controllata anche la velocità del mandrino per avere una velocità di taglio costante. I motori passo-passo che equipaggiano il nostro tornietto hanno un passo di 7 e 30. Considerando che i carrelli degli assi si spostano tramite la rotazione di una vite senza con passo di un millimetro, si ottiene uno spostamento del carrello di 1/48 = 0.0208 mm./passo. La scheda che abbiamo realizzato, tenuto conto della meccanica a disposizione, comprende: un tastierino esadecimale e un display LCD per consentire all operatore di dialogare con il sistema operativo memorizzato nel microcontrollore una interfaccia di potenza per controllare i motori passo-passo una interfaccia di potenza per controllare il motore che aziona il mandrino una interfaccia di ingresso per ricevere informazioni dai fine corsa un led di segnalazione un pulsante per l arresto di emergenza della macchina 4

L idea di progetto La realizzazione Il tornio didattico visto frontalmente Elettronica di controllo 5

Il tornio didattico visto nella parte posteriore PARTICOLARI COSTRUTTIVI DELLA SCHEDA DI CONTROLLO IL MICROPROCESSORE PIC16F877 L INTERFACCIA DI POTENZA IL QUARZO PER IL CLOCK DEL MICROCONTROLLORE LA RETE RESISTIVA Rb 6

Schemi elettrici schema elettrico 220 V~ FINE CORA ASSI TASTIERINO NUMERICO INTERRUTORE GENERALE C6 ASSE Z- ALIMENTATORE STABILIZZATO +5 V 10 K Ω ASSE Z+ +5 V +5 V +5 V +12 V GND +5 V 10 KΩ ASSE X- 100 Ω 10 K Ω GND +5 V ASSE X+ +5 V 11 +5 V +5 V 10 K Ω 8 V SS V DD RD0/RD7-RC5/RC7 OUT interfaccia motore RE2 OSC1 OSC2 XTAL RC0 RC1 RC2 RC3 4 MHz C1 330 Ω RA0 RA1 RA2 RA3 RESET 330 Ω +12 V TIP 29 C3 LED 330 Ω +12 V 10 K Ω D1 C2 330 Ω TIP 29 10 K Ω RA4 RA5 RE0 RE1 MCLR RC4 RB0/RB7 330 Ω +12 V TIP 29 330 Ω +12 V TIP 29 330 Ω +12 V TIP 29 MOTORE ASSE X 330 Ω +12 V TIP 29 330 Ω +12 V TIP 29 +12 V TIP 29 MOTORE ASSE Z 7

CIRCUITO STAMPATO LATO RAME I.T.I.S. "MAX PLANCK" Classe 5 A/Z ASO 2001/2002 8

circuito stampato lato componenti I.T.I.S. "MAX PLANCK" Classe 5 A/Z ASO 2001/2002 9

SCHEDA PRINCIPALE componenti e morsetti Out display zoccolo collegamento flat display PIC 16F877 XTAL rete resistiva singola 330Ω zoccolo collegamento flat tastierino adesivo Out tastiera TIP 29 TIP 29 TIP 29 TIP 29 TIP 29 TIP 29 TIP 29 TIP 29 LED di funzionamento + 12 V -in- alimentatore ( Nero ) + 12 V Out motore asse Z ( nero ) Out motore asse Z ( Bianco ) Out motore asse Z ( Rosso ) Out motore asse Z ( Grigio ) Out motore asse Z ( Nero ) Out motore asse X ( Grigio ) Out motore asse X ( Rosso ) Out motore asse X ( Nero ) Out motore asse X ( Nero ) + 12 V -out- Motore asse X ( Nero ) + 5 V out interfaccia motore 220 V~ ( Verde ) + 5 V -in- alimentatore ( Blu ) Tasto STOP Fine corsa asse Z+ Fine corsa asse Z- Fine corsa asse X- Fine corsa asse X+ 10

O Il DISPLAY A CRISTALLI LIQUIDI o Il display a cristalli liquidi permette la percezione di simboli alfanumerici in ambienti illuminati, ma la sua visibilità è nulla al buio. I più comuni display sfruttano il fenomeno della diffusione della luce e sono formati da un vetrino, a contatto con l esterno, con elettrodi trasparenti ed elettricamente con-duttori che formano il carattere al-fanumerico (ad esempio l otto ha sette segmenti) e da un secondo ve-trino simile al primo ma collegato al circuito di comando; fra i due vetrini viene posto un sottile distanziatore (10 micron ) in modo che si formi una sottile camera (qualche centesimo di millimetro) nella quale è posto il cristallo liquido; infine vi è uno schermo scuro assorbente la luce. Se fra i due vetrini non vi è tensione il cristallo liquido rimane trasparente; se invece vi è qualche elettrodo del segno alfanumerico sot-to tensione, allora sotto di esso si sviluppa una turbolenza del cristallo liquido con relativa diffusione di luce e si ha, ad esempio, una immagine bianca dell elettrodo sotto tensione su sfondo scuro. Il tempo di risposta di questi display è dell ordine della decina di millisecondi e varia con la temperatura; la vita media è di molti anni e dipende dalla decomposizione delle molecole organiche dei cristalli dovuta sia all effetto elettrico che alla luce ultravioletta. 11

O Descrizione software gestione display (LCD ) II display LCD utilizzato in questo progetto e' di tipo alfanumerico cioè in grado di visualizzare simboli numerici e alfabetici. Inoltre esso presenta il grande vantaggio di implementare una logica di controllo delle funzioni e una logica di decodifica dei simboli da visualizzare che vengono forniti in codice ASCII.I simboli da visualizzare vengono caricati in un' area di memoria interna a 32 byte. Il pin outdel componente è a 16 terminali: -8 linee per bus dati ( DBO -DB7) -3 linee di controllo -3 linee alimentazione 12

-2 linee per la retroilluminazione Analisi linee di controllo: linea RS visualizzare -RS = 1 il display riconosce il dato presente sul bus come simbolo da -RS = O il display riconosce il dato presente sul bus come una istruzione Linea E -Un impulso L-H-L forza la lettura del dato presente sul, bus Linea R/W -R/W = O consente operazioni di scrittura di dati e istruzioni sull' LCD -R/W = I consente operazioni di lettura di dati dall' LCD Le istruzioni sono dei comandi che vengono dati al display come, ad esempio, pulisci display, porta il cursore ad inizio riga ecc. o o La tabella allegata riassume il set di istruzioni del display CDL4162 a 2 righe per 16 caratteri. o Si riportano alcuni esempi di routine utilizzate nel programma per il controllo del display. ;**********sottoprogramma configurazione LCD configura_lcd bcf portc,rw bcf portc,rs call ms1 movlw 0x38 ;dati a 8 bits - 2 righe movlw 0x0c ;display on - cursore off - blinking off movlw 6 ;avanzamento cursore movlw 1 ;pulisci display movlw 2 ;cursore home movlw 0x40 ;indirizza cgram movlw 0x80 ;indirizza prima riga bsf portc,rs ;scrivi prima riga "ITIS M. PLANCK" call home1 ;cursore inizio prima riga movlw 'I' movlw 'T' movlw 'I' movlw 'S' movlw 'M' movlw 'A' movlw 'X' 13

movlw 'P' movlw 'L' movlw 'A' movlw 'N' movlw 'C' movlw 'K' ;**********sottoprogramma invio dati a display display movwf portd ;invia dato bsf portc,e ;impulso di abilitazione bcf portc,e call ms1 ;ritardo 1ms ;**********sottoprogramma comando cursore inizio seconda riga home2 bcf portc,rs movlw 0xc0 ;display inizio seconda riga bsf portc,rs ;**********sottoprogramma comando cursore inizio prima riga home1 bcf portc,rs movlw 0x80 ;display inizio prima riga bsf portc,rs ;**********sottoprogramma blink on blink_on bcf portc,rs ;blink on call ms1 movlw 0d bsf portc,rs call ms1 ;**********sottoprogramma blink off blink_off bcf portc,rs call ms1 movlw 0c ;blink off bsf portc,rs call ms1 14

15

o IL TASTIERINO o E stato utilizzato un economico tastierino esadecimale. Esso è costituito da una matrice di interruttori, organizzati in righe e colonne come si vede in figura. La pressione di un tasto equivale alla connessione fra una riga e una colonna. La rilevazione del tasto premuto può avvenire secondo la seguente logica. Si collegano le colonne e le righe a delle resistenze di pull up ( il portob del PIC dispone internamente di queste resistenze per cui non è necessario prevederle esternamente ) si configurano i pin a cui sono collegate le colonne come ingressi si configurano i pin a cui sono collegate le righe come uscite Si pone a livello basso una riga mentre tutte le altre sono alte Si interrogano gli stati delle colonne. Se viene azionato un tasto che si trova all incrocio tra una qualsiasi colonna e la riga che si trova a livello basso, una colonna viene letta come livello basso e quindi identifica immediatamente il tasto azionato. La scansione viene ripetuta per tutte le righe La rilevazione può soffrire dei rimbalzi dei contatti; per ovviare all inconveniente si possono introdurre dei ritardi via software che consentono di rileggere lo stato del pulsante dopo che i rimbalzi si sono esauriti. Il tempo da noi fissato è di 20 ms. Il problema dei rimbalzi si ha anche al rilascio del pulsante. 16

Primo piano di tastierino e display Disegno di progetto 17

Si riporta di seguito una parte del software che consente di leggere la tastiera. Si noti che in fase di lettura viene attivata la funzione blinking del display che mostra i dati inseriti in modo lampeggiante. ;*************************TASTIERA************************************ tastiera bsf portc,rs call blink_on movlw b'11110111' ;riga rb3 bassa movwf portb btfss portb,4 ;premuto 0? goto tasto0 btfss portb,5 ;premuto 4? goto tasto4 btfss portb,6 ;premuto 8? goto tasto8 movlw b'11111011' ;riga rb2 bassa movwf portb btfss portb,4 ;premuto 1? goto tasto1 btfss portb,5 ;premuto 5? goto tasto5 btfss portb,6 ;premuto 9? goto tasto9 movlw b'11111101' ;riga rb1 bassa movwf portb btfss portb,4 ;premuto 2? goto tasto2 btfss portb,5 ;premuto 6? goto tasto6 movlw b'11111110' ;riga rb0 bassa movwf portb btfss portb,4 ;premuto 3? goto tasto3 btfss portb,5 ;premuto 7? goto tasto7 movlw b'11111101' movwf portb btfss portb,7 ;premuto ESC? goto tasto10 goto tastiera ;se nessun tasto premuto ripeti ;*****************************************TASTI********************** tasto0 call delay20ms ;elimina rimbalzi lpt1 btfss portb,4 ;pulsante rilasciato? goto lpt1 call delay20ms ;elimina rimbalzi movlw 0 ;memorizza lettura movwf memoria movlw '0' ;memorizza dato per display movwf mem_dis goto blink 18

O INTERFACCIA DI POTENZA MOTORI PASSO-PASSO L interfaccia è costituita da 8 transistor npn TIP29; questi transistor di potenza non sono altro che amplificatori binari in grado di fornire la corrente richiesta ai motori passo-passo che si aggira intorno ad un ampere. Dato che essi lavorano come interruttori, la dissipazione di potenza è assai limitata per cui non necessitano dissipatori di calore. Per evitare di distruggere la giunzione collettore-base dei transistori, è necessario inserire dei diodi tosatori in parallelo alle bobine dei motori che tagliano le sovratensioni che si manifestano sulle bobine stesse quando il transistore commuta da on ad off ( legge di Lenz ). Particolari costruttivi 19

- MOTORI PASSO-PASSO - I motori passo-passo, spesso chiamati anche step o stepper motor, sono caratterizzati nel panorama dei motori elettrici da una serie di particolarità che ne fanno la scelta (quasi) ideale per tutte quelle applicazioni che richiedono precisione nello spostamento angolare e nella velocità di rotazione, quali la robotica ed i servomeccanismi in genere dove la potenza richiesta è bassa. O I vantaggi: o E' possibile realizzare azionamenti di precisione controllati da computer in catena aperta, cioè senza utilizzare sensori di posizione o di velocità. Sono quindi utilizzabili con relativa semplicità e senza richiedere particolare potenza di calcolo. Hanno un'elevata robustezza meccanica ed elettrica: infatti non esistono contatti elettrici striscianti e, se necessario, possono essere realizzati anche in esecuzione completamente stagna. E' facile far compiere all'albero piccole rotazioni angolari arbitrarie in ambedue i versi e bloccarlo in una determinata posizione. La velocità di rotazione può essere molto bassa anche senza l'uso di riduttori meccanici. Di seguito vengono riportate le routine che controllano la rotazione di uno dei due motori in senso orario e antiorario. L azionamento avviene ad una fase per volta. L eccitazione di una fase dura 10 millesimi di secondo per cui il motore compie 100 passi al secondo, poco più di 2 giri al secondo (125 giri al minuto ). Se si aumentano i giri il motore rischia di perdere il passo. ;**********sottoprogramma controllo spostamento asse_dx dx incf assex movlw 4 subwf assex,0 goto sax clrf assex sax movf assex goto dx1 bcf porta,3 bsf porta,0 call ms10 dx1 movlw 1 subwf assex,0 goto dx2 20

bcf porta,0 bsf porta,2 call ms10 dx2 movlw 2 subwf assex,0 goto dx3 bcf porta,2 bsf porta,1 call ms10 dx3 bcf porta,1 bsf porta,3 call ms10 ;**********sottoprogramma controllo spostamento asse_sx sx decf assex movlw 0xff subwf assex,0 goto sbx movlw 3 movwf assex sbx movf assex goto sx1 bcf porta,2 bsf porta,0 call ms10 sx1 movlw 1 subwf assex,0 goto sx2 bcf porta,1 bsf porta,2 call ms10 sx2 movlw 2 subwf assex,0 goto sx3 bcf porta,3 bsf porta,1 call ms10 sx3 bcf porta,0 bsf porta,3 call ms10 21

INTERFACCIA DI POTENZA COMANDO MOTORE MANDRINO Il motore che comanda il mandrino e un motore monofase alimentato a 220 V. In un primo momento era stato deciso di comandare il motore mediante un classico relè controllato dal PIC. In fase di collaudo abbiamo verificato che la chiusura e l apertura dei contatti di questo relè causavano gravi disturbi che interferivano sull ottimale funzionamento del sistema. In particolare questi disturbi andavano ad influenzare il display LCD collegato al PIC tramite piattina a 16 fili. Presumibilmente sul segnale di controllo enable dell LCD si avevano dei disturbi che lo mandavano in tilt non consentendo una corretta visualizzazione dei messaggi. Abbiamo allora optato per un interruttore statico realizzato con un triac. Per isolare elettricamente la parte di potenza a 220Vca con quella di comando a bassa tensione, abbiamo utilizzato un fototriac MOC3042 che dispone inoltre di un circuito interno di controllo che innesca il triac quando la tensione di rete passa per lo zero ( 0 cross detect ). In questo modo e garantito che l azionamento del motore avviene in modo morbido a partire da tensione di rete istantanea nulla garantendo così una buona immunità alle armoniche fonte di disturbi. E da sottolineare che il costruttore del MOC garantisce una tensione di isolamento tra circuito di comando in bassa tensione e quello di potenza di 7500 Vca. La sicurezza elettrica è quindi assicurata in modo adeguato. Per quanto concerne il progetto di questa sezione abbiamo tenuto conto dei dati forniti dal costruttore del MOC e dei circuiti consigliati. Circuito stampato lato rame 22

o MOTORE DEL MANDRINO o Il motore del mandrino dispone di due velocità selezionabili con un commutatore. I) 3000 giri/min. 65 watt di potenza; II) 5000 giri/min 95 watt di potenza; Tramite un gruppo di rinvio si possono variare i giri del mandrino sfruttando così le due potenze a disposizione. Il gruppo permette una variazione di velocità compresa tra 130 e 4000 giri/m come indicato sul pannello del tornio. selezione della velocità mandrino Particolari del motore mandrino 23

o ALIMENTATORE o Questo dispositivo ha lo scopo di alimentare i circuiti elettronici del controllo ed i motori passopasso sfruttando la tensione di rete a 220V e 50Hz. In pratica la tensione alternata inviata dalla rete di distribuzione, viene raddrizzata e filtrata dall alimentatore e resa in uscita continua e di valore desiderato. Gli alimentatori sono costituiti da 4 blocchi fondamentali come vediamo in (fig2.1), e rispettivamente sono: 1. -trasformatore; 2. -raddrizzatore; 3. -filtro; 4. -stabilizzatore. O 1. TRASFORMATORE o Fig 2.1 Il trasformatore è una macchina elettrica statica (priva di organi in movimento) che trasferisce energia elettrica da un circuito (primario) a un altro (secondario) modificando tensione e corrente.il trasformatore riceve energia elettrica con una tensione V 1 e una corrente I 1 e la restituisce con una tensione V 2 e con una corrente I 2, diverse e tali da soddisfare la relazione V 1 x I 1 = V 2 x I 2. = P (in pratica variano i singoli parametri, ma la potenza rimane con valore costante). Il trasformatore è costituito da un circuito magnetico chiuso, realizzato con lamierini di ferro al silicio, e da due bobine dette primario e secondario. Detto N 1 il numero di spire del primario e N 2 quello delle spire del secondario, vale la relazione V 1 /V 2 =N 1 /N 2 =I 2 /I 1.Il rapporto N 1 /N 2 si chiama rapporto spire.se N 1 è minore di N 2 il trasformatore è detto elevatore, in caso contrario è detto abbassatore. Nel caso specifico il nostro trasformatore è composto da 2 avvolgimenti secondari che forniscono ciascuno 12 V oppure 24 V efficaci. O 2. RADDRIZZATORE o Questo circuito consente di ottenere, da una tensione sinusoidale, una tensione pulsante unipolare. Nel nostro caso, utilizziamo un raddrizzatore a quattro diodi a ponte di Graetz. (componete illustrato nella fig.2.1.1) 24

Fig. 2.1.1 FILTRO La tensione pulsante, all uscita del raddrizzatore, è formato da una componente continua (valor medio), cui è sovrapposta una componente periodica, avente frequenza doppia di quella di rete e chiamata tensione di ripple. Il filtro di tipo passa-basso, detto anche di livellamento, ha il compito di rendere costante la tensione, tutta positiva o tutta negativa. Esso è costituito da un condensatore in parallelo al carico. Per il calcolo del filtro si deve tener conto che la frequenza delle onde raddrizzate è doppia f = 100Hz rispetto a quella di rete ( 50 Hz ). Stabilizzatore di tensione E un circuito che ha la funzione di rendere la tensione continua di uscita praticamente insensibile alle variazioni della tensione di rete e del carico. In pratica riduce il ripple a livelli accettabili mediante reiezione di almeno 30dB. L elemento fondamentale di uno stabilizzatore di tensione è rappresentato da una rete di retroazione che, misurando la tensione di uscita, modifica il proprio comportamento in modo da compensare tali variazioni. PROGETTO ALIMENTATORE STABILIZZATO Dati di progetto L alimentatore deve fornire due tensioni una di 5 volt per alimentare il circuito di controllo e il display LCD e l altra di 12 volt per l alimentazione dei motori passo-passo Per il calcolo della corrente che deve erogare l alimentatore abbiamo tenuto conto che: gli avvolgimenti dei motori passo-passo presentano una resistenza di 8 ohm per cui a regime la corrente assorbita da ogni motore vale: I = V / R = 12 / 8 = 1.5 A. La potenza dissipata sarà di conseguenza 18 W. Per i componenti alimentati a 5 volt la potenza necessaria è stata stimata secondo questo criterio: Microcontrollore: 1W Display LCD 0.5W Resistenze di base dei BJT, resistenze limitazione corrente nel LED 0.5W La potenza totale dissipata dal circuito di controllo risulta quindi di 2W a cui corrisponde una corrente di 0.4A La corrente totale che dovrà erogare l alimentatore sarà quindi di 3.4A; abbiamo leggermente sovradimensionato la corrente totale fissandola a 4A. In conclusione l alimentatore dovrà erogare 4 A massimi e dovrà fornire due tensioni di 12V e 5V. L alimentatore progettato è un alimentatore di tipo lineare con due regolatori integrati: il 7805 è utilizzato per fornire i 5 V e dovrà erogare una corrente I MAX di 0.4 A. Per fornire i 12 V abbiamo usato un LM 317. Poiché tale regolatore può fornire una corrente massima di 1 A, è stato previsto nello schema elettrico un BJT di potenza in parallelo al regolatore. 25

Trasformatore : Il trasformatore utilizzato nel progetto ha un rapporto di trasformazione 220/12 con potenza 50W. La corrente nominale al secondario sarà quindi di circa 4 A mentre la tensione massima sul secondario sarà di circa 17V. Ponte raddrizzatore: Il ponte è stato scelto in base alla corrente media massima che dovrà erogare l alimentatore. A disposizione c era un ponte con corrente media 10 A e quindi adatto alla nostra applicazione. Filtro di livellamento: Per dimensionare la capacità di livellamento abbiamo tenuto conto che l LM 317 ha una tensione di drop out di 1.2 volt e quindi la tensione di ingresso non dovrà essere inferiore a 13.2 V. Di conseguenza la massima tensione di ripple picco-picco non dovrà superare i : 17 13.2 = 3.8 V. Abbiamo fissato tale tensione a 3.5 V. Il condensatore è stato dimensionato tenendo conto che nel semiperiodo della tensione di rete ( 10ms ) esso non dovrà scaricarsi di oltre 3.5 V quando erogherà la massima corrente di circa 4A necessaria ad alimentare i due motori passo-passo. Quindi, tenendo conto della legge fondamentale del condensatore e ipotizzando la scarica del condensatore a corrente costante, si ottiene: C = I * T/Vpp = 4200 µf Nel progetto sono stati utilizzati due condensatori elettrolitici ognuno da 2200µF. Dimensionamento alimentatore 12V Dimensionamento della resistenza di polarizzazione del BJT di potenza: Si è deciso di far entrare in conduzione il BJT di potenza quando la corrente di ingresso all LM317 raggiunge i 10 ma. In tali ipotesi, tenuto conto che la tensione di soglia del BJT risulta di 0.55 V, abbiamo calcolato R secondo la legge di ohm: R = Vγ /I = 0.55 / 10mA = 55 Ω. E stata utilizzata una resistenza di 68 Ω Dimensionamento del partitore per LM317: Poiché il regolatore di tensione LM317 fornisce in uscita una tensione di 1.25 V con il morsetto Adj collegato a massa, è necessario utilizzare un partitore di tensione adeguato per avere i 12 V richiesti. E stato previsto un trimmer per la regolazione precisa della tensione di uscita. Analizzando i data sheets forniti dal costruttore, è consigliato di utilizzare per R 1 un valore di 240Ω ; abbiamo utilizzato una resistenza di valore commerciale 220 Ω. In tali condizioni, utilizzando la relazione fornita dal costruttore Vout = 1.25 ( 1 + R2/R1 ), abbiamo calcolato R 2 = 1890Ω. Abbiamo suddiviso tale resistenza in una fissa di 1200 Ω e una variabile (trimmer) di 1K Ω. Dimensionamento transistore di potenza Il BJT di potenza utilizzato nel progetto è l MJ 2955, cioè il complementare del più noto 2N3055. La corrente di collettore massima che il transistore può reggere è di 15 A, quindi ben superiore alle nostre esigenze. Abbiamo scelto questo componente in quanto a disposizione della scuola. Resta quindi da dimensionare il dissipatore termico. 26

Il BJT, secondo i precedenti calcoli, erogherà una corrente massima di 3Ampere con una tensione media tra collettore ed emettitore di 3.25 volt. La potenza massima dissipata sarà quindi di circa 10 Watt. La resistenza termica massima del dissipatore da utilizzare sarà: Rth = ( Tjmax Ta ) /Pmax - Rthjc = (200 40 )/10 2.5 = 13.5 C/W. Dimensionamento alimentatore 5V Per quanto concerne questa sezione dell alimentatore e solo necessario il dimensionamento termico del 7805 in quanto il regolatore fornisce direttamente i 5 V richiesti senza reti esterne.tenuto conto che la tensione media in ingresso del regolatore e piuttosto alta e vale 15.25 V ( vedi sopra ), la potenza dissipata sarà : P = ( Vin Vout ) * Imax = ( 15.25 5 ) * 0.6 = 6.15 W La resistenza termica massima del dissipatore sarà : Rth = ( Tjmax Ta ) /Pmax - Rthjc= (150 40 )/6.15 5.5 = 12.3 C/W Abbiamo utilizzato un dissipatore per dispositivi di potenza con contenitore TO220 con resistenza termica 9 C /W. Lato componenti 27

28

ANALISI DEL SOFTWAREo La stesura del software ha seguito i principi della programmazione top-down che consiste nel suddividere il problema in tanti sottoproblemi la cui soluzione viene demandata a delle routine richiamate dal programma principale o main. In questo modo il main risulta compatto, di facile stesura e comprensione. Il suo ruolo e quello di organizzare in modo logico la soluzione del problema richiamando le subroutine piu opportune. Per la soluzione di queste ultime e necessario concentrarsi solamente sulla soluzione di un determinato problema ignorando cosi l organizzazione logica del problema. I sottoprogrammi sviluppati risolvono problemi come: - configurazione display intelligente - invio messaggi al display per il dialogo con l utente - gestione tastierino esadecimale - gestione motori passo-passo - gestione segnali di controllo provenienti dai fine corsa - posizionamento automatico utensile - calcolo tempo esecuzione lavorazione Inoltre quando certi moduli di programma venivano ad essere ripetuti piu volte all interno dei vari sottoprogrammi si e deciso di organizzarli sotto forma di routine. Alcuni esempi possono essere: - temporizzazioni - invio di un carattere al display - posizionamento cursore display su riga 1 o riga2 o in posizione home - eliminazione rimbalzi sui contatti del tastierino Per la gestione delle periferiche di ingresso si e utilizzata la tecnica del polling e dell interrupt. In particolare per il controllo del tastierino, e dei fine corsa, si e utilizzato il polling che consiste nell interrogare ciclicamente i vari contatti. L interrupt e stato utilizzato per costruire un orologio ( real time clock ) necessario a realizzare molteplici temporizzazioni quali il comando dei motori passo-passo, il lampeggio del led, il controllo del display LCD ecc. La routine di interrupt viene lanciata automaticamente ogni millisecondo cosi la risoluzione dell orologio e di un millisecondo. L interrupt e provocato da overflow del registro speciale timer che come noto e un contatore a 8 bits. Il clock per tale timer e quello di sistema; la sua frequenza viene opportunamente divisa utilizzando il prescaler interno al microcontrollore. Per quanto riguarda il calcolo del tempo necessario alla esecuzione della lavorazione impostata, si e simulato l esecuzione della lavorazione senza comandare i motori. Poiche ogni spostamento di un passo di ogni motore avviene in 10 millisecondi, e stato facile, con l uso di alcune locazioni di memoria RAM, misurare il tempo incrementando di 10 millisecondi il tempo di esecuzione della lavorazione ad ogni passo di ogni motore. Il tempo totale e poi stato convertito in minuti e secondi e infine in BCD per poter essere visualizzato sul display. Per quanto riguarda la qualità del sistema operativo si può dire che questo potrebbe essere migliorato e potenziato mediante l introduzione di ulteriori tipi di lavorazione meccaniche come: 29

- lavorazione conica da dx a sx - lavorazione frontale - torniture che seguano un determinato profilo in questo ultimo caso sarebbe necessario prevedere un collegamento di tipo seriale con un PC cosa del resto possibile in quanto il microcontrollore e equipaggiato con una USART. Inoltre potrebbe essere migliorata anche l interfaccia con le esigenze dell utente (operatore addetto alla esecuzione delle lavorazioni ). Del resto il software utilizza circa un terzo della memoria programmi disponibile ( si veda la mappa di memoria allegata che e stata ricavata dal file listing ottenuto nella compilazione). Anche la memoria RAM utilizzata e limitata rispetto a quanto disponibile ed in particolare circa 80 locazioni su 368. Naturalmente i tempi limitati per l esecuzione dell area di progetto non hanno consentito di sviluppare ulteriori funzioni e di potenziare il sistema operativo. Sicuramente si e dimostrato come i microcontrollori possano essere utilizzati in innumerevoli applicazioni compresi sistemi di controllo di media complessita. oy USAGE MAP ('X' = Used, '-' = Unused) O 0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0140 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0180 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 01C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0200 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0240 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0280 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 02C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0300 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0340 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0380 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 03C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 30

0400 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0440 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0480 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 04C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0500 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0540 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0580 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 05C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0600 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0640 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0680 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 06C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0700 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0740 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0780 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 07C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0800 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0840 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0880 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 08C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0900 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0940 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 0980 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 09C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXX------ - ---------------- All other memory blocks unused. Program Memory Words Used: 2534 Program Memory Words Free: 5658 31

CODICE SORGENTE COMPLETO ;******************************************************** ;********* ************** ;********* CONTROLLO NUMERICO DI UN TORNIO ************** ;********* CL. 5A/Z ************** ;********* A.S. 20001/2002 ************** ;******************************************************** list p=16f877 ;**********dichiarazione dei registri speciali banco0 tmr equ 1 pcl equ 2 status equ 3 porta equ 5 portb equ 6 portc equ 7 portd equ 8 porte equ 9 pch equ 0x0a intcon equ 0x0b ;**********dichiarazione dei registri speciali banco1 opzioni equ 1 ddra equ 5 ddrb equ 6 ddrc equ 7 ddrd equ 8 ddre equ 9 ad equ 0x1f ;**********dichiarazione dei registri RAM conta equ 0x20 stack1 equ 0x21 stack2 equ 0x22 ms equ 0x23 ds equ 0x24 sec equ 0x25 assex equ 0x26 assey equ 0x27 centx equ 0x28 decx equ 0x29 unx equ 0x2a decimix equ 0x30 memoria equ 0x2b mem_dis equ 0x2f decy equ 0x32 uny equ 0x33 decimiy equ 0x34 centin equ 0x35 decine equ 0x36 unita equ 0x37 decimi equ 0x38 xl equ 0x39 xh equ 0x3a yl equ 0x3b yh equ 0x3c x1l equ 0x3d x1h equ 0x3e COND equ 0x3f CONU equ 0x40 ylc equ 0x42 yhc equ 0x43 contat equ 0x44 pendl equ 0x45 pendh equ 0x46 32

flag equ 0x47 y1l equ 0x48 y1h equ 0x49 gradino equ 0x4a led equ 0x4b msl equ 0x4c dsl equ 0x4d secl equ 0x4e ms2 equ 0x4f ds2 equ 0x50 usec2 equ 0x51 dsec2 equ 0x52 umin2 equ 0x53 dmin2 equ 0x54 time equ 0x55 mux equ 0x56 mxl equ 0x57 mxh equ 0x58 myl equ 0x59 myh equ 0x5a mml equ 0x5b mmh equ 0x5c timeh equ 0x5d timel equ 0x5e mem1 equ 0x5f mem2 equ 0x60 mem3 equ 0x61 mem4 equ 0x62 em1 equ 0x63 em2 equ 0x64 em3 equ 0x65 ;**********dichiarazione segnali di controllo DISPLAY #define RW 6 #define RS 5 #define E 7 ;**********vettore di RESET e vettore di INTERRUPT org 0 goto main org 4 ;**********sottoprogramma risposta interrupt timer interrupt movwf stack1 ;salva accumulatore swapf status,0 ;salva registro di stato movwf stack2 movlw 9 ;carica timer movwf tmr incf ms ;aggiorna orologio incf msl incf ms2 movlw d'100' subwf ms,0 goto esci1 incf ds movlw 0xa subwf ds,0 goto esci1 incf sec esci1 movlw d'100' subwf msl,0 goto esci2 incf dsl clrf msl movf led 33

bsf portc,4 movlw 1 subwf led,0 goto int1 movlw 4 subwf dsl,0 goto int2 movlw 0x10 xorwf portc clrf dsl goto esci2 int1 movlw 2 subwf led,0 goto int2 movlw 2 subwf dsl,0 goto int2 movlw 0x10 xorwf portc clrf dsl goto esci2 int2 movlw d'5' subwf dsl,0 goto esci2 clrf dsl esci2 movf time goto esci movlw d'100' subwf ms2,0 goto displayl incf ds2 clrf ms2 movlw 0x0a subwf ds2,0 goto displayl clrf ds2 decf usec2 movlw 0xff subwf usec2,0 goto displayl movlw 9 movwf usec2 movf dmin2,0 goto agg1 movf umin2,0 goto agg2 movf dsec2,0 goto agg3 goto displayl agg1 decf dsec2 movlw 0xff subwf dsec2,0 goto displayl movlw 5 movwf dsec2 ;controlla se min=0 34

decf umin2 movlw 0xff subwf umin2,0 goto displayl movlw 9 movwf umin2 decf dmin2 goto displayl agg2 decf dsec2 movlw 0xff subwf dsec2,0 goto displayl decf umin2 movlw 5 movwf dsec2 goto displayl agg3 decf dsec2 displayl ;visualizza tempo lavorazione movf mux goto mux1 bcf portc,rs ;sposta cursore incf mux goto esci mux1 movlw 1 subwf mux,0 goto mux22 movlw 80 movwf portd incf mux goto esci mux22 movlw 2 subwf mux,0 goto mux2 bsf portc,e bcf portc,e incf mux goto esci mux2 movlw 3 subwf mux,0 goto mux3 bsf portc,rs incf mux goto esci mux3 movlw 4 subwf mux,0 goto mux6 movf dmin2,0 call tab movwf portd ;invia dato bsf portc,e ;impulso di abilitazione bcf portc,e incf mux goto esci mux6 movlw 5 subwf mux,0 goto mux7 movf umin2,0 call tab movwf portd ;invia dato bsf portc,e ;impulso di abilitazione bcf portc,e 35

incf mux goto esci mux7 movlw 6 subwf mux,0 goto mux9 movlw ':' movwf portd ;invia dato bsf portc,e ;impulso di abilitazione bcf portc,e incf mux goto esci mux9 movlw 7 subwf mux,0 goto mux12 movf dsec2,0 call tab movwf portd ;invia dato bsf portc,e ;impulso di abilitazione bcf portc,e incf mux goto esci mux12 movlw 8 subwf mux,0 goto esci movf usec2,0 call tab movwf portd ;invia dato bsf portc,e ;impulso di abilitazione bcf portc,e clrf mux esci bcf intcon,2 ;azzera flag interrupt swapf stack2,0 ;ripristina registro di stato movwf status swapf stack1 ;ripristina accumulatore swapf stack1,0 retfie ;**********tabella dati tab addwf pcl retlw '0' retlw '1' retlw '2' retlw '3' retlw '4' retlw '5' retlw '6' retlw '7' retlw '8' retlw '9' ;**********programma principale main bsf status,5 ;*****configura i porti movlw b'00110000' ;RA0-RA3 out motore 1 -- RA4 e RA5 input 2 fine corsa movwf ddra movlw b'11110000' ;PBH in - PBL out lettura tastiera movwf ddrb clrf ddrc ;RC0-RC3 out motore 2 -- RC4-RC7 out controllo display e led clrf ddrd ;out dati display bcf porte,2 ;RE0 e RE1 input 2 fine corsa -- RE2 out moc movlw b'00000001' ;abilita pull up portb - configura prescaler tmr0 movwf opzioni 36

movlw b'00000111' ;pin portoa e portoe come i/o movwf ad bcf status,5 bcf porte,2 ;motore mandrino fermo clrf time ;azzera flag visualizzazione tempo clrf mux ;azzera puntatore multiplexing display bsf portc,4 ;diodo on clrf led clrf porta ;motore1 off bcf portc,0 ;motore2 off bcf portc,1 bcf portc,2 bcf portc,3 bcf portc,e ;enable display OFF movlw 9 ;inizializza timer movwf tmr movlw b'10100000' ;abilita interrupt timer movwf intcon call configura_lcd ;configura lcd call enter ;premere # per continuare call ok ;controlla se premuto enter call okoff movlw 1 ;lampeggio led movwf led clrf assex ;azzera puntatori controllo motori clrf assey inizio call posizionare00 loop movlw b'11111101' movwf portb btfss portb,6 ;premuto S? goto in00 movlw b'11111110' movwf portb btfsc portb,6 ;premuto N? goto loop goto iniz1 in00 call zeroxy ;posizione zero per torretta iniz1 movlw 1 ;lampeggio led movwf led movlw b'11111110' movwf portb nnn btfss portb,6 ;rilasciato? goto nnn call posizionare ;posiziona utensile in 0,0 call zero_zero ;posizionamento manuale utensile lp777 call lavorazione ;chiedere se lavorazione conica lp7 movlw b'11111101' movwf portb btfss portb,6 ;premuto S? goto avanti movlw b'11111110' movwf portb btfsc portb,6 ;premuto N? goto lp7 lpconf call cil_conf movlw b'11111110' movwf portb nnn1 btfss portb,6 ;rilasciato N? goto nnn1 lpconf1 movlw b'11111101' movwf portb btfss portb,6 ;premuto S? goto lp9 movlw b'11111110' movwf portb btfsc portb,6 ;premuto N? goto lpconf1 movlw b'11111110' 37

movwf portb nnn2 btfss portb,6 ;rilasciato N? goto nnn2 goto lp777 lp9 call dati_cil_lun ;richiede dati lavorazione cilindrica lp91 movlw b'11111101' movwf portb btfss portb,6 ;premuto S? goto lp99 movlw b'11111101' movwf portb btfss portb,7 ;premuto ESC? goto lp777 movlw b'11111110' movwf portb btfsc portb,6 ;premuto N? goto lp91 goto lp9 lp99 call dati_cil_prof ;se confermati vai a richiedere profondita' lp101 movlw b'11111101' movwf portb btfss portb,6 ;premuto S? goto lav1 movlw b'11111110' movwf portb btfsc portb,6 ;premuto N? goto lp101 goto lp99 lav1 movlw 2 ;lampeggio led movwf led call lav_corso ;messaggio per display call lav_cilindrica ;esegui lavorazione goto in00 avanti call dati_con_lun ;richiede dati conica lunghezza lp991 movlw b'11111101' movwf portb btfss portb,6 ;premuto S? goto avanti1 movlw b'11111110' movwf portb btfsc portb,6 ;premuto N? goto lp991 goto avanti avanti1 call dati_con_prof1 ;richiedi diametro1 lp990 movlw b'11111101' movwf portb btfss portb,6 ;premuto S? goto lav2 movlw b'11111110' movwf portb btfsc portb,6 ;premuto N? goto lp990 goto avanti1 lav2 movlw 2 ;lampeggio led movwf led call lav_corso ;messaggio per display call lav_conica ;esegui lavorazione goto in00 ;************************* fine main ******************************* ;**********sottoprogramma configurazione LCD configura_lcd bcf portc,rw bcf portc,rs call ms1 movlw 0x38 ;dati a 8 bits - 2 righe 38

movlw 0x0c ;display on - cursore off - blinking off movlw 6 ;avanzamento cursore movlw 1 ;pulisci display movlw 2 ;cursore home movlw 0x40 ;indirizza cgram movlw 0x80 ;indirizza prima riga bsf portc,rs ;scrivi prima riga "ITIS M. PLANCK" call home1 movlw 'I' movlw 'T' movlw 'I' movlw 'S' movlw 'M' movlw 'A' movlw 'X' movlw 'P' movlw 'L' movlw 'A' movlw 'N' movlw 'C' movlw 'K' ;**********sottoprogramma posizionare posizionare call home1 movlw 'P' movlw 'O' movlw 'S' movlw 'I' movlw 'Z' movlw 'I' movlw 'O' movlw 'N' movlw 'A' 39

movlw 'R' movlw 'E' movlw 'U' movlw 'T' movlw 'E' movlw 'N' call home2 movlw 'S' movlw 'I' movlw 'L' movlw 'E' movlw '#' movlw 'S' movlw 'E' movlw 'V' movlw 'A' movlw 'L' movlw 'I' movlw 'D' movlw 'O' ;**********sottoprogramma che richiede tipo di lavorazione lavorazione call home1 movlw 'T' movlw 'O' movlw 'R' movlw 'N' movlw 'I' movlw 'T' movlw 'U' movlw 'R' 40

movlw 'A' movlw 'C' movlw 'O' movlw 'N' movlw 'I' movlw 'C' movlw 'A' call home2 movlw '(' movlw 'S' movlw '/' movlw 'N' movlw ')' call blink_on bcf portc,rs ;sposta cursore alla casella 4 movlw 0xc4 ;*********************routine conferma lavorazione cilindrica******* cil_conf call home1 movlw 'C' movlw 'O' 41

movlw 'N' movlw 'F' movlw 'E' movlw 'R' movlw 'M' movlw 'A' call home2 movlw 'C' movlw 'I' movlw 'L' movlw 'I' movlw 'N' movlw 'D' movlw 'R' movlw 'I' movlw 'C' movlw 'A' movlw '?' movlw 'S' movlw '/' movlw 'N' ;**********sottoprogramma che richiede dati lavorazione cilindica dati_cil_lun call home1 movlw '0' 42

movlw '0' movlw '0' movlw '.' movlw '0' call home2 movlw 'L' movlw 'U' movlw 'N' movlw 'G' movlw 'H' movlw 'E' movlw 'Z' movlw 'Z' movlw 'A' bcf portc,rs ;richiedi dati lunghezza call ms1 ;centx,decx,unx e decimix sono i valori della lunghezza movlw 85 bsf portc,rs call ms1 call tastiera movlw 10 subwf memoria,0 goto dati_cil_lun movf memoria,0 movwf centx movf mem_dis,0 43

call tastiera movlw 10 subwf memoria,0 goto dati_cil_lun movf memoria,0 movwf decx movf mem_dis,0 call tastiera movlw 10 subwf memoria,0 goto dati_cil_lun movf memoria,0 movwf unx movf mem_dis,0 bcf portc,rs ;SALTA PUNTO call ms1 movlw 89 bsf portc,rs call ms1 call tastiera movlw 10 subwf memoria,0 goto dati_cil_lun movf memoria,0 movwf decimix movf mem_dis,0 call conferma ;conferma dati? ;**********sottoprogramma che visualizza messaggio posizionare00 call home1 movlw 'P' movlw 'O' movlw 'S' movlw 'I' movlw 'Z' movlw 'I' movlw 'O' movlw 'N' movlw 'A' movlw 'R' movlw 'E' movlw 'U' movlw 'T' movlw 'E' 44

movlw 'N' call home2 movlw 'S' movlw 'I' movlw 'L' movlw 'E' movlw 'I' movlw 'N' movlw '0' movlw '/' movlw '0' movlw '?' movlw 'S' movlw '/' movlw 'N' ;**********sottoprogramma che richiede dati lavorazione cilindica dati_cil_prof call home1 movlw '0' movlw '0' movlw '.' movlw '0' 45

call home2 movlw 'P' movlw 'R' movlw 'O' movlw 'F' movlw 'O' movlw 'N' movlw 'D' movlw 'I' movlw 'T' movlw 'A' movlw '`' bcf portc,rs ;richiedi dati lunghezza call ms1 ;decy,uny e decimiy sono i valori della profondita' movlw 86 bsf portc,rs call ms1 call tastiera movlw 10 subwf memoria,0 goto dati_cil_prof movf memoria,0 movwf decy movf mem_dis,0 call tastiera movlw 10 subwf memoria,0 goto dati_cil_prof movf memoria,0 movwf uny movf mem_dis,0 bcf portc,rs ;salta punto call ms1 movlw 89 bsf portc,rs call ms1 call tastiera 46

movlw 10 subwf memoria,0 goto dati_cil_prof movf memoria,0 movwf decimiy movf mem_dis,0 call conferma ;conferma dati? ;**********sottoprogramma che richiede dati lavorazione conica lunghezza dati_con_lun call home1 movlw '0' movlw '0' movlw '0' movlw '.' movlw '0' call home2 movlw 'L' movlw 'U' movlw 'N' movlw 'G' movlw 'H' movlw 'E' movlw 'Z' 47

movlw 'Z' movlw 'A' bcf portc,rs ;richiedi dati lunghezza call ms1 ;centx,decx,unx e decimix sono i valori della lunghezza movlw 85 bsf portc,rs call ms1 call tastiera movlw 10 subwf memoria,0 goto dati_con_lun movf memoria,0 movwf centx movf mem_dis,0 call tastiera movlw 10 subwf memoria,0 goto dati_con_lun movf memoria,0 movwf decx movf mem_dis,0 call tastiera movlw 10 subwf memoria,0 goto dati_con_lun movf memoria,0 movwf unx movf mem_dis,0 bcf portc,rs ;salta punto call ms1 movlw 89 bsf portc,rs call ms1 call tastiera movlw 10 subwf memoria,0 goto dati_con_lun movf memoria,0 movwf decimix movf mem_dis,0 call conferma ;conferma dati? ;**********sottoprogramma che richiede dati lavorazione conica angolo dati_con_prof1 call home1 48

movlw '0' movlw '0' call home2 movlw 'C' movlw 'O' movlw 'N' movlw 'I' movlw 'C' movlw 'I' movlw 'T' movlw 'A' movlw '`' movlw 'I' movlw 'N' movlw '%' bcf portc,rs ;richiedi dati conicita' call ms1 ; movlw 87 bsf portc,rs call ms1 call tastiera 49

movlw 10 subwf memoria,0 goto dati_con_prof1 movf memoria,0 movwf COND movf mem_dis,0 call tastiera movlw 10 subwf memoria,0 goto dati_con_prof1 movf memoria,0 movwf CONU movf mem_dis,0 call conferma ;conferma dati? ;**********sottoprogramma lavorazione in corso lav_corso call home1 movlw ':' movlw 'T' movlw 'E' movlw 'M' movlw 'P' movlw 'O' call home2 movlw 'L' movlw 'A' 50

movlw 'V' movlw 'O' movlw 'R' movlw 'A' movlw 'Z' movlw 'I' movlw 'O' movlw 'N' movlw 'E' ;***********sottoprogramma lavorazione cilindrica lav_cilindrica bsf porte,2 ;motore mandrino on call binariox call binarioy movf xl,0 movwf x1l movf xh,0 movwf x1h bcf intcon,7 ;disabilita interrupt bsf pch,3 ;seleziona banco1 ROM call visual_tempo ;calcola tempo lavorazione bcf pch,3 ;seleziona banco0 ROM bsf intcon,7 ;riabilita interrupt incf time ;fa partire tempo lav_ci clrf flag ;inizio lavorazione movf xl,0 ;memorizza dati in x1 movwf x1l movf xh,0 movwf x1h lav_cil movf x1l ;controlla se zero goto lavc_x call dy decf x1l ;controlla se zero goto lav_cil lavc_x movf x1h goto lavc_1 call dy decf x1h decf x1l goto lav_cil lavc_1 movf yl ;controlla posizione asse y goto lavc_y call dx decf yl goto lavflag lavc_y movf yh goto lav_cout call dx decf yh decf yl lavflag incf flag movlw 1 subwf flag,0 51

goto lav_ci movf xl,0 movwf x1l movf xh,0 movwf x1h lavr1 movf x1l ;memorizza dati in x1 ;controlla se zero goto lavr2 call sy decf x1l ;controlla se zero goto lavr1 lavr2 movf x1h goto lavc_1 call sy decf x1h decf x1l goto lavr1 lav_cout bcf porte,2 ;motore off call terminata call zeroxy ;***********sottoprogramma lavorazione conica lav_conica bsf porte,2 ;motore mandrino on call binariox call binario_con bcf intcon,7 ;disabilita interrupt bsf pch,3 ;seleziona banco ROM1 call passi_m ;calcola passi assex bcf pch,3 ;seleziona banco1 ROM bsf intcon,7 ;riabilita interrupt bcf status,0 ;calcola l*2/conicita' rlf pendl ;per calcolo lunghezza scalino rlf pendh clrf gradino ;azzera risultato quoziente movlw 8 movwf conta mul bcf status,0 rlf gradino bcf status,0 rlf pendl rlf pendh movf y1l,0 subwf pendh,0 btfss status,0 goto testd movf pendh incf gradino testd decfsz conta goto mul bcf intcon,7 ;disabilita interrupt bsf pch,3 ;seleziona banco ROM1 call visual_tempo1 ;calcola tempo lavorazione bcf pch,3 ;seleziona banco1 ROM bsf intcon,7 ;riabilita interrupt incf time ;start visualizzazione tempo in_con movf gradino,0 movwf contat movf xl,0 ;memorizza dati per lavorazione movwf x1l movf xh,0 movwf x1h lavo_c movf x1l ;controlla se zero goto lavoc_x 52

call sy decfsz contat ;aggiorna calcolo gradino goto ccc1 goto salto_g ccc1 decf x1l ;controlla se zero goto lavo_c lavoc_x movf x1h goto fine_con call sy decf x1h decf x1l decfsz contat ;aggiorna calcolo gradino goto ccc2 goto salto_g ccc2 goto lavo_c salto_g call dx movf gradino,0 subwf xl btfsc status,0 goto ritorno movf xh goto fine_con decf xh ritorno movf x1l ;ritorno con lavorazione goto lavrc_x call sy decf x1l ;controlla se zero goto ritorno lavrc_x movf x1h goto torn call sy decf x1h decf x1l goto ritorno torn movf xl,0 ;memorizza dati in x1 movwf x1l movf xh,0 movwf x1h rito_v movf x1l ;ritorno senza lavorazione goto rito_v1 call dy decf x1l ;controlla se zero goto rito_v rito_v1 movf x1h goto in_con call dy decf x1h decf x1l goto rito_v fine_con bcf porte,2 ;stop motore call terminata call zeroxy ;**********sottoprogramma conversione dati in binario spostamento assex binariox clrf xl clrf xh lpx1 movf centx ;controlla valore centinaia ;se zero passa a controllo decine goto lpx2 53

movlw d'250' addwf xl btfsc status,0 incf xh movlw d'250' addwf xl btfsc status,0 incf xh movlw d'250' addwf xl btfsc status,0 incf xh movlw d'250' addwf xl btfsc status,0 incf xh decf centx goto lpx1 lpx2 movf decx goto lpx3 movlw d'100' addwf xl btfsc status,0 incf xh decf decx goto lpx2 lpx3 movf unx goto lpx4 movlw d'10' addwf xl btfsc status,0 incf xh decf unx goto lpx3 lpx4 movf decimix goto lpx5 movlw 1 addwf xl btfsc status,0 incf xh decf decimix goto lpx4 lpx5 ;c'e' riporto ;c'e' riporto ;c'e' riporto ;c'e' riporto ;controlla valore decine ;se zero passa a controllo unita' ;c'e' riporto ;controlla valore unita' ;se zero passa a controllo decimi ;c'e' riporto ;controlla valore decimi ;c'e' riporto ;**********sottoprogramma conversione dati in binario spostamento assey binarioy clrf yl clrf yh lpx2y movf decy ;controlla valore decine ;se zero passa a controllo decine goto lpx3y movlw d'100' addwf yl btfsc status,0 ;c'e' riporto incf yh decf decy goto lpx2y lpx3y movf uny ;controlla valore unita' ;se zero passa a controllo unita' goto lpx4y movlw d'10' addwf yl btfsc status,0 ;c'e' riporto incf yh decf uny 54

goto lpx3y lpx4y movf decimiy goto lpx5y movlw 1 addwf yl btfsc status,0 incf yh decf decimiy goto lpx4y lpx5y ;controlla valore decimi ;c'e' riporto ;**********sottoprogramma conversione dati in binario per conica binario_con clrf ylc clrf yhc lpm3y movf COND ;controlla valore unita' ;se zero passa a controllo unita' goto lpm4y movlw d'10' addwf ylc btfsc status,0 ;c'e' riporto incf yhc decf COND goto lpm3y lpm4y movf CONU goto lpm5y movlw 1 addwf ylc btfsc status,0 incf yhc decf CONU goto lpm4y lpm5y ;controlla valore decimi ;c'e' riporto ;**********sottoprogramma lavorazione terminata terminata clrf time ;blocca visualizzazione tempo call home1 movlw 'L' movlw 'A' movlw 'V' movlw 'O' movlw 'R' movlw 'A' movlw 'Z' movlw 'I' movlw 'O' movlw 'N' movlw 'E' 55

call home2 movlw 'T' movlw 'E' movlw 'R' movlw 'M' movlw 'I' movlw 'N' movlw 'A' movlw 'T' movlw 'A' ;*******************routine conferma dati inseriti conferma call home2 movlw 'C' movlw 'O' movlw 'N' movlw 'F' movlw 'E' movlw 'R' movlw 'M' movlw 'A' movlw '(' movlw 'S' movlw '/' movlw 'N' movlw ')' 56

movlw '?' ;*************************TASTIERA************************************ ******* tastiera bsf portc,rs call blink_on movlw b'11110111' ;riga rb3 movwf portb btfss portb,4 ;premuto 0? goto tasto0 btfss portb,5 ;premuto 4? goto tasto4 btfss portb,6 ;premuto 8? goto tasto8 movlw b'11111011' ;riga rb2 movwf portb btfss portb,4 ;premuto 1? goto tasto1 btfss portb,5 ;premuto 5? goto tasto5 btfss portb,6 ;premuto 9? goto tasto9 movlw b'11111101' ;riga rb1 movwf portb btfss portb,4 ;premuto 2? goto tasto2 btfss portb,5 ;premuto 6? goto tasto6 movlw b'11111110' ;riga rb0 movwf portb btfss portb,4 ;premuto 3? goto tasto3 btfss portb,5 ;premuto 7? goto tasto7 movlw b'11111101' movwf portb btfss portb,7 ;premuto ESC? goto tasto10 goto tastiera ;se nessun tasto premuto ripeti ;*****************************************TASTI*********************** * tasto0 call delay20ms ;elimina rimbalzi lpt1 btfss portb,4 ;pulsante rilasciato? goto lpt1 call delay20ms ;elimina rimbalzi movlw 0 ;memorizza lettura movwf memoria movlw '0' ;memorizza dato per display movwf mem_dis goto blink tasto1 lpt2 tasto2 lpt3 call delay20ms btfss portb,4 goto lpt2 call delay20ms movlw 1 movwf memoria movlw '1' movwf mem_dis goto blink call delay20ms btfss portb,4 goto lpt3 call delay20ms movlw d'2' 57

tasto3 lpt4 tasto4 lpt5 tasto5 lpt6 tasto6 lpt7 tasto7 lpt8 tasto8 lpt9 tasto10 lptesc tasto9 lpt10 movwf memoria movlw '2' movwf mem_dis goto blink call delay20ms btfss portb,4 goto lpt4 call delay20ms movlw d'3' movwf memoria movlw '3' movwf mem_dis goto blink call delay20ms btfss portb,5 goto lpt5 call delay20ms movlw d'4' movwf memoria movlw '4' movwf mem_dis goto blink call delay20ms btfss portb,5 goto lpt6 call delay20ms movlw d'5' movwf memoria movlw '5' movwf mem_dis goto blink call delay20ms btfss portb,5 goto lpt7 call delay20ms movlw d'6' movwf memoria movlw '6' movwf mem_dis goto blink call delay20ms btfss portb,5 goto lpt8 call delay20ms movlw d'7' movwf memoria movlw '7' movwf mem_dis goto blink call delay20ms btfss portb,6 goto lpt9 call delay20ms movlw d'8' movwf memoria movlw '8' movwf mem_dis goto blink call delay20ms btfss portb,7 goto lptesc call delay20ms movlw 10 movwf memoria call delay20ms btfss portb,6 goto lpt10 call delay20ms 58

blink movlw d'9' movwf memoria movlw '9' movwf mem_dis call blink_off ;********sottoprogramma controllo tasto enter ok movlw b'11111110' movwf portb lpen btfsc portb,7 goto lpen call delay20ms ;elimina rimbalzi ;********sottoprogramma controllo tasto enter rilasciato okoff movlw b'11111110' movwf portb lpenr btfss portb,7 goto lpenr call delay20ms ;elimina rimbalzi ;**********sottoprogramma invio dati a display display movwf portd ;invia dato bsf portc,e ;impulso di abilitazione bcf portc,e call ms1 ;ritardo 1ms ;**********sottoprogramma comando cursore inizio seconda riga home2 bcf portc,rs movlw 0xc0 ;display inizio seconda riga bsf portc,rs ;**********sottoprogramma comando cursore inizio prima riga home1 bcf portc,rs movlw 0x80 ;display inizio prima riga bsf portc,rs ;**********sottoprogramma blink on blink_on bcf portc,rs ;blink on call ms1 movlw 0d bsf portc,rs call ms1 ;**********sottoprogramma blink off blink_off bcf portc,rs call ms1 movlw 0c ;blink off bsf portc,rs call ms1 ;**********sottoprogramma scritta (#) per continuare enter call home2 movlw '#' 59

movlw 'P' movlw 'E' movlw 'R' movlw 'C' movlw 'O' movlw 'N' movlw 'T' movlw 'I' movlw 'N' movlw 'U' movlw 'A' movlw 'R' movlw 'E' ;**********sottoprogramma ritardo 1ms ms1 clrf ms lp_ms movf ms goto lp_ms ;**********sottoprogramma ritardo 1ms ms10 clrf ms lp_ms3 movlw d'10' subwf ms,0 goto lp_ms3 ;**********sottoprogramma ritardo 20ms delay20ms clrf ms lp_ms20 movlw d'20' subwf ms,0 goto lp_ms20 ;**********sottoprogramma ritardo 100ms ms100 clrf ms lp_ms100 movlw d'100' subwf ms,0 goto lp_ms100 ;**********sottoprogramma controllo spostamento asse_dx dx incf assex movlw 4 subwf assex,0 60

goto sax clrf assex sax movf assex goto dx1 bcf porta,3 bsf porta,0 call ms10 dx1 movlw 1 subwf assex,0 goto dx2 bcf porta,0 bsf porta,2 call ms10 dx2 movlw 2 subwf assex,0 goto dx3 bcf porta,2 bsf porta,1 call ms10 dx3 bcf porta,1 bsf porta,3 call ms10 ;**********sottoprogramma controllo spostamento asse_sx sx decf assex movlw 0xff subwf assex,0 goto sbx movlw 3 movwf assex sbx movf assex goto sx1 bcf porta,2 bsf porta,0 call ms10 sx1 movlw 1 subwf assex,0 goto sx2 bcf porta,1 bsf porta,2 call ms10 sx2 movlw 2 subwf assex,0 goto sx3 bcf porta,3 bsf porta,1 call ms10 sx3 bcf porta,0 bsf porta,3 call ms10 ;**********sottoprogramma controllo spostamento asse dy dy incf assey movlw 4 61

subwf assey,0 goto ddy clrf assey ddy movf assey goto dy1 bcf portc,3 bsf portc,0 call ms10 dy1 movlw 1 subwf assey,0 goto dy2 bcf portc,0 bsf portc,1 call ms10 dy2 movlw 2 subwf assey,0 goto dy3 bcf portc,1 bsf portc,2 call ms10 dy3 bcf portc,2 bsf portc,3 call ms10 ;**********sottoprogramma controllo spostamento asse sy sy decf assey movlw 0xff subwf assey,0 goto sby movlw 3 movwf assey sby movf assey goto sy1 bcf portc,1 bsf portc,0 call ms10 sy1 movlw 1 subwf assey,0 goto sy2 bcf portc,2 bsf portc,1 call ms10 sy2 movlw 2 subwf assey,0 goto sy3 bcf portc,3 bsf portc,2 call ms10 sy3 bcf portc,0 bsf portc,3 call ms10 ;**********sottoprogramma posizionamento in x,y=0,0 62

zeroxy lp1 btfsc porte,1 goto lp2 ;controlla se azionato FCRX collegato a RE1 call sx movlw b'11111101' movwf portb btfss portb,7 ;premuto ESC? goto lp1 lp2 call mot_off movlw b'11111101' movwf portb btfss portb,7 ;premuto ESC? btfss porta,4 ;controlla se azionato FCRY collegato a RA4 goto lp222 call mot_off lp222 call sy goto lp2 ;****************routine posiziona utensile in 0,0 zero_zero movlw b'11111110' movwf portb btfsc portb,6 goto zzz1 btfsc porte,0 goto allarme call dx call mot_off zzz1 movlw b'11111101' movwf portb btfsc portb,6 goto zzz2 btfsc porte,1 goto allarme call sx call mot_off zzz2 movlw b'11111011' movwf portb btfsc portb,7 goto zzz3 btfsc porta,4 goto allarme call sy call mot_off zzz3 movlw b'11110111' movwf portb btfsc portb,7 goto zzz4 btfsc porta,5 goto allarme call dy call mot_off zzz4 movlw b'11111110' ;premuto #? movwf portb btfsc portb,7 goto zero_zero call mot_off allarme goto zero_zero ;***************motori a riposo mot_off clrf porta ;motore1 off bcf portc,0 ;motore2 off 63

64 bcf portc,1 bcf portc,2 bcf portc,3 ;area rom libera per salto pagina

;**********routine che calcola tempo lavorazione cilindrica******* visual_tempo ;moltiplica dati lavorazione x 4.8 movf xl,0 ;memorizza dati in x1 movwf x1l movf xh,0 movwf x1h bcf status,0 rlf xl rlf xh bcf status,0 rlf xl rlf xh bcf status,0 rrf x1h rrf x1l movf x1l,0 addwf xl btfsc status,0 incf xh movf x1h,0 addwf xh bcf status,0 rrf x1h rrf x1l bcf status,0 rrf x1h rrf x1l bcf status,0 rrf x1h rrf x1l movf x1l,0 addwf xl btfsc status,0 incf xh movf x1h,0 addwf xh movf yl,0 ;memorizza dati in y1 movwf y1l movf yh,0 65

movwf y1h bcf status,0 rlf yl rlf yh bcf status,0 rlf yl rlf yh bcf status,0 rrf y1h rrf y1l movf y1l,0 addwf yl btfsc status,0 incf yh movf y1h,0 addwf yh bcf status,0 rrf y1h rrf y1l bcf status,0 rrf y1h rrf y1l bcf status,0 rrf y1h rrf y1l movf y1l,0 addwf yl btfsc status,0 incf yh movf y1h,0 addwf yh clrf em1 ;emula lavorazione cilindrica clrf timel clrf timeh movf xl,0 ;memorizza dati per lavorazione movwf mxl movwf x1l movf xh,0 movwf mxh movwf x1h movf yl,0 movwf mem1 movf yh,0 movwf mem2 lav_cie clrf flag ;inizio lavorazione movf mxl,0 ;memorizza dati in x1 movwf x1l movf mxh,0 movwf x1h lav_cile movf x1l ;controlla se zero goto lavc_xe incf em1 movlw d'100' subwf em1,0 btfss status,0 goto e1 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh e1 decf x1l ;controlla se zero goto lav_cile lavc_xe movf x1h goto lavc_1e 66

e2 incf em1 movlw d'100' subwf em1,0 btfss status,0 goto e2 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh decf x1h decf x1l goto lav_cile lavc_1e movf mem1 ;controlla posizione asse y goto lavc_ye incf em1 movlw d'100' subwf em1,0 btfss status,0 goto e3 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh e3 decf mem1 goto lavflage lavc_ye movf mem2 goto lav_coute incf em1 movlw d'100' subwf em1,0 btfss status,0 goto e4 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh e4 decf mem2 decf mem1 lavflage incf flag movlw 1 subwf flag,0 goto lav_cie movf mxl,0 ;memorizza dati in x1 movwf x1l movf mxh,0 movwf x1h lavr1e movf x1l ;controlla se zero goto lavr2e incf em1 movlw d'100' subwf em1,0 btfss status,0 goto e5 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh e5 decf x1l ;controlla se zero goto lavr1e lavr2e movf x1h 67

goto lavc_1e incf em1 movlw d'100' subwf em1,0 btfss status,0 goto e6 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh e6 decf x1h decf x1l goto lavr1e lav_coute incf em1 ;aggiusta tempo di 1 secondo movlw d'100' subwf em1,0 btfss status,0 goto e9 movlw 1 addwf timel btfsc status,0 incf timeh e9 clrf mem1 ;converti tempo in minuti movf timel,0 movwf mem2 lt11c movlw d'60' subwf mem2 btfss status,0 goto lt21c subwf timel incf mem1 goto lt11c lt21c movf timeh goto lt31c decf timeh movlw d'60' subwf timel incf mem1 goto lt11c lt31c clrf dmin2 ;converti minuti in BCD movf mem1,0 movwf mem2 lt331c movlw d'10' subwf mem2 btfss status,0 goto lt41c subwf mem1 incf dmin2 goto lt331c lt41c movf mem1,0 movwf umin2 clrf dsec2 ;converti secondi in BCD movf timel,0 movwf mem2 lt441c movlw d'10' subwf mem2 btfss status,0 goto lt51c subwf timel incf dsec2 goto lt441c lt51c movf timel,0 movwf usec2 68

;**********routine che calcola passi motore ******* passi_m ;moltiplica dati lavorazione x 4.8 movf xl,0 ;memorizza dati in x1 movwf x1l movwf pendl movf xh,0 movwf x1h movwf pendh bcf status,0 rlf xl rlf xh bcf status,0 rlf xl rlf xh bcf status,0 rrf x1h rrf x1l movf x1l,0 addwf xl btfsc status,0 incf xh movf x1h,0 addwf xh bcf status,0 rrf x1h rrf x1l bcf status,0 rrf x1h rrf x1l bcf status,0 rrf x1h rrf x1l movf x1l,0 addwf xl btfsc status,0 incf xh movf x1h,0 addwf xh movf ylc,0 ;memorizza dati in y1 movwf y1l movf xl,0 ;salva dati per calcolo tempo movf xh,0 ;************* routine che calcola tempo lavorazione ******** visual_tempo1 clrf em1 ;emula lavorazione conica clrf timel clrf timeh movf xl,0 ;memorizza dati per lavorazione movwf mxl movf xh,0 movwf mxh in_cone movf gradino,0 movwf contat movf mxl,0 ;memorizza dati per lavorazione movwf x1l movf mxh,0 movwf x1h lavo_ce movf x1l ;controlla se zero goto lavoc_xe incf em1 movlw d'100' subwf em1,0 btfss status,0 goto ee1 clrf em1 69

movlw 1 addwf timel btfsc status,0 incf timeh ee1 decfsz contat ;aggiorna calcolo gradino goto ccc1e goto salto_ge ccc1e decf x1l ;controlla se zero goto lavo_ce lavoc_xe movf x1h goto fine_cone incf em1 movlw d'100' subwf em1,0 btfss status,0 goto ee2 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh ee2 decf x1h decf x1l decfsz contat ;aggiorna calcolo gradino goto ccc2e goto salto_ge ccc2e goto lavo_ce salto_ge incf em1 movlw d'100' subwf em1,0 btfss status,0 goto ee3 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh ee3 movf gradino,0 subwf mxl btfsc status,0 goto ritornoe movf mxh goto fine_cone decf mxh ritornoe movf x1l goto lavrc_xe incf em1 movlw d'100' subwf em1,0 btfss status,0 goto ee4 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh ee4 decf x1l ;controlla se zero goto ritornoe lavrc_xe movf x1h goto torne incf em1 ;ritorno con lavorazione 70

movlw d'100' subwf em1,0 btfss status,0 goto ee5 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh ee5 decf x1h decf x1l goto ritornoe torne movf mxl,0 ;memorizza dati in x1 movwf x1l movf mxh,0 movwf x1h rito_ve movf x1l ;ritorno senza lavorazione goto rito_v1e incf em1 movlw d'100' subwf em1,0 btfss status,0 goto ee6 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh ee6 decf x1l ;controlla se zero goto rito_ve rito_v1e movf x1h goto in_cone incf em1 movlw d'100' subwf em1,0 btfss status,0 goto ee7 clrf em1 movlw 1 addwf timel btfsc status,0 incf timeh ee7 decf x1h decf x1l goto rito_ve fine_cone incf em1 ;aggiusta tempo di 1 secondo movlw d'100' subwf em1,0 btfss status,0 goto ee9 movlw 1 addwf timel btfsc status,0 incf timeh ee9 clrf mem1 ;converti tempo in minuti movf timel,0 movwf mem2 lt11 movlw d'60' subwf mem2 btfss status,0 goto lt21 subwf timel incf mem1 goto lt11 lt21 movf timeh 71

goto lt31 decf timeh movlw d'60' subwf timel incf mem1 goto lt11 lt31 clrf dmin2 ;converti minuti in BCD movf mem1,0 movwf mem2 lt331 movlw d'10' subwf mem2 btfss status,0 goto lt41 subwf mem1 incf dmin2 goto lt331 lt41 movf mem1,0 movwf umin2 clrf dsec2 ;converti secondi in BCD movf timel,0 movwf mem2 lt441 movlw d'10' subwf mem2 btfss status,0 goto lt51 subwf timel incf dsec2 goto lt441 lt51 movf timel,0 movwf usec2 end 72

MODELLO unimat 3 Progetto della classe V A/Z Coordinatore del progetto :Ins. ZANIOL ITALO Équipe Riccardo Palù Domenico De Luca Stefano Crepaldi Mauro Tosatto Loris Visintin 73

Egregio Cliente, ci congratuliamo e La ringraziamo per aver scelto il nostro prodotto UNIMAT 3. Abbiamo preparato questo libretto di istruzioni per consentirle di apprezzare le qualità di questo tornio. Le raccomandiamo di leggerloattentamente in tutte le sue parti prima di accingersi per la prima volta all utilizzo. In esso sono contenute informazioni, consigli e Avvertenze. All interno del manuale sono stati inseriti dei consigli utili per la manutenzione periodica e per l uso coretto di UNIMAT 3 e del suo mantenimento ottimale. Cordialmente. V A/Z serale 74

NOME DEI COMPONENTI E FUNZIONI 1 2 3 4 5 6 VISTA FRONTALE DEL TORNIO 7 8 9 10 11 12 13 14 15 16 17 VISTA DALL ALTO DEL TORNIO 75