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 Out tastiera zoccolo collegamento flat tastierino adesivo + 12 V Out motore asse Z ( nero ) Out motore asse Z ( Bianco ) TIP 29 Out motore asse Z ( Rosso ) rete resistiva singola 330Ω XTAL PIC 16F877 Out motore asse X ( Nero ) Out motore asse X ( Nero ) + 12 V -out- Motore asse X ( Nero ) TIP 29 TIP 29 + 5 V out interfaccia motore 220 V~ ( Verde ) TIP 29 TIP 29 Tasto STOP LED di funzionamento Out display + 5 V -in- alimentatore ( Blu ) Fine corsa asse X+ Fine corsa asse X- Fine corsa 10 Out motore asse X ( Rosso ) TIP 29 asse Z- Out motore asse X ( Grigio ) Fine corsa Out motore asse Z ( Nero ) TIP 29 asse Z+ Out motore asse Z ( Grigio ) zoccolo collegamento flat display SCHEDA PRINCIPALE componenti e morsetti + 12 V -in- alimentatore ( Nero ) TIP 29 O Il DISPLAY A CRISTALLI LIQUIDI 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 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 call display call display movlw 0x0c ;display on - cursore off - blinking off call display movlw 6 ;avanzamento cursore call display movlw 1 ;pulisci display call display movlw 2 ;cursore home call display movlw 0x40 ;indirizza cgram call display movlw 0x80 ;indirizza prima riga call display bsf portc,RS ;scrivi prima riga "ITIS M. PLANCK" call home1 ;cursore inizio prima riga movlw 'I' call display movlw 'T' call display movlw 'I' call display movlw 'S' call display movlw ' ' call display movlw 'M' call display movlw 'A' call display movlw 'X' call display movlw ' ' 13 call display movlw 'P' call display movlw 'L' call display movlw 'A' call display movlw 'N' call display movlw 'C' call display movlw 'K' call display movlw ' ' call display return ;**********sottoprogramma invio dati a display display movwf portd ;invia dato bsf portc,E ;impulso di abilitazione bcf portc,E call ms1 ;ritardo 1ms return ;**********sottoprogramma comando cursore inizio seconda riga home2 bcf portc,RS movlw 0xc0 ;display inizio seconda riga call display bsf portc,RS return ;**********sottoprogramma comando cursore inizio prima riga home1 bcf portc,RS movlw 0x80 ;display inizio prima riga call display bsf portc,RS return ;**********sottoprogramma blink on blink_on bcf portc,RS ;blink on call ms1 movlw 0d call display bsf portc,RS call ms1 return ;**********sottoprogramma blink off blink_off bcf portc,RS call ms1 movlw 0c ;blink off call display bsf portc,RS call ms1 return 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 btfss status,2 goto sax clrf assex sax movf assex btfss status,2 goto dx1 bcf porta,3 bsf porta,0 call ms10 return dx1 movlw 1 subwf assex,0 btfss status,2 goto dx2 20 dx2 dx3 bcf porta,0 bsf porta,2 call ms10 return movlw 2 subwf assex,0 btfss status,2 goto dx3 bcf porta,2 bsf porta,1 call ms10 return bcf porta,1 bsf porta,3 call ms10 return ;**********sottoprogramma controllo spostamento asse_sx sx decf assex movlw 0xff subwf assex,0 btfss status,2 goto sbx movlw 3 movwf assex sbx movf assex btfss status,2 goto sx1 bcf porta,2 bsf porta,0 call ms10 return sx1 movlw 1 subwf assex,0 btfss status,2 goto sx2 bcf porta,1 bsf porta,2 call ms10 return sx2 movlw 2 subwf assex,0 btfss status,2 goto sx3 bcf porta,3 bsf porta,1 call ms10 return sx3 bcf porta,0 bsf porta,3 call ms10 return 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: Fig 2.1 1. 2. 3. 4. -trasformatore; -raddrizzatore; -filtro; -stabilizzatore. O 1. TRASFORMATORE o 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 V1 e una corrente I1 e la restituisce con una tensione V2 e con una corrente I2, diverse e tali da soddisfare la relazione V1 x I1 = V2 x I2.= 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 N1 il numero di spire del primario e N2 quello delle spire del secondario, vale la relazione V1/V2=N1/N2=I2/I1.Il rapporto N1/N2 si chiama rapporto spire.Se N1 è minore di N2 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 R1 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 R2 = 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 y1l y1h gradino led msl dsl secl ms2 ds2 usec2 dsec2 umin2 dmin2 time mux mxl mxh myl myh mml mmh timeh timel mem1 mem2 mem3 mem4 em1 em2 em3 equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ 0x47 0x48 0x49 0x4a 0x4b 0x4c 0x4d 0x4e 0x4f 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 0x58 0x59 0x5a 0x5b 0x5c 0x5d 0x5e 0x5f 0x60 0x61 0x62 0x63 0x64 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 btfss status,2 goto esci1 incf ds movlw 0xa subwf ds,0 btfss status,2 goto esci1 incf sec esci1 movlw d'100' subwf msl,0 btfss status,2 goto esci2 incf dsl clrf msl movf led 33 btfsc bsf movlw subwf btfss goto movlw subwf btfss goto movlw xorwf clrf goto int1 movlw subwf btfss goto movlw subwf btfss goto movlw xorwf clrf goto int2 movlw subwf btfss goto clrf esci2 movf btfsc goto movlw subwf btfss goto incf clrf movlw subwf btfss goto clrf decf movlw subwf btfss goto movlw movwf movf btfss goto movf btfss goto movf btfss goto goto agg1 decf movlw subwf btfss goto movlw movwf status,2 portc,4 1 led,0 status,2 int1 4 dsl,0 status,2 int2 0x10 portc dsl esci2 2 led,0 status,2 int2 2 dsl,0 status,2 int2 0x10 portc dsl esci2 d'5' dsl,0 status,2 esci2 dsl time status,2 esci d'100' ms2,0 status,2 displayl ds2 ms2 0x0a ds2,0 status,2 displayl ds2 usec2 0xff usec2,0 status,2 displayl 9 usec2 dmin2,0 status,2 agg1 umin2,0 status,2 agg2 dsec2,0 status,2 agg3 displayl dsec2 0xff dsec2,0 status,2 displayl 5 dsec2 ;controlla se min=0 34 decf movlw subwf btfss goto movlw movwf decf goto agg2 decf movlw subwf btfss goto decf movlw movwf goto agg3 decf displayl movf btfss goto bcf incf goto mux1 movlw subwf btfss goto movlw movwf incf goto mux22 movlw subwf btfss goto bsf bcf incf goto mux2 movlw subwf btfss goto bsf incf goto mux3 movlw subwf btfss goto movf call movwf bsf bcf incf goto mux6 movlw subwf btfss goto movf call movwf bsf bcf umin2 0xff umin2,0 status,2 displayl 9 umin2 dmin2 displayl dsec2 0xff dsec2,0 status,2 displayl umin2 5 dsec2 displayl dsec2 ;visualizza tempo lavorazione mux status,2 mux1 portc,RS mux esci 1 mux,0 status,2 mux22 80 portd mux esci 2 mux,0 status,2 mux2 portc,E portc,E mux esci 3 mux,0 status,2 mux3 portc,RS mux esci 4 mux,0 status,2 mux6 dmin2,0 tab portd portc,E portc,E mux esci 5 mux,0 status,2 mux7 umin2,0 tab portd portc,E portc,E ;sposta cursore ;invia dato ;impulso di abilitazione ;invia dato ;impulso di abilitazione 35 incf goto mux7 movlw subwf btfss goto movlw movwf bsf bcf incf goto mux9 movlw subwf btfss goto movf call movwf bsf bcf incf goto mux12 movlw subwf btfss goto movf call movwf bsf bcf clrf esci mux esci 6 mux,0 status,2 mux9 ':' portd portc,E portc,E mux esci 7 mux,0 status,2 mux12 dsec2,0 tab portd portc,E portc,E mux esci 8 mux,0 status,2 esci usec2,0 tab portd portc,E portc,E mux bcf intcon,2 swapf stack2,0 movwf status swapf stack1 swapf stack1,0 retfie ;invia dato ;impulso di abilitazione ;invia dato ;impulso di abilitazione ;invia dato ;impulso di abilitazione ;azzera flag interrupt ;ripristina registro di stato ;ripristina accumulatore ;**********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 movwf bcf bcf clrf clrf bsf clrf clrf bcf bcf bcf bcf bcf movlw movwf movlw movwf call call call call movlw movwf clrf clrf inizio call loop movlw movwf btfss goto movlw movwf btfsc goto goto in00 call iniz1 movlw movwf movlw movwf nnn btfss goto call call lp777 call lp7 movlw movwf btfss goto movlw movwf btfsc goto lpconf movlw movwf nnn1 btfss goto lpconf1 movwf btfss goto movlw movwf btfsc goto movlw b'00000111' ;pin portoa e portoe come i/o ad status,5 porte,2 ;motore mandrino fermo time ;azzera flag visualizzazione tempo mux ;azzera puntatore multiplexing display portc,4 ;diodo on led porta ;motore1 off portc,0 ;motore2 off portc,1 portc,2 portc,3 portc,E ;enable display OFF 9 ;inizializza timer tmr b'10100000' ;abilita interrupt timer intcon configura_lcd ;configura lcd enter ;premere # per continuare ok ;controlla se premuto enter okoff 1 ;lampeggio led led assex ;azzera puntatori controllo motori assey posizionare00 b'11111101' portb portb,6 in00 b'11111110' portb portb,6 loop iniz1 zeroxy 1 led b'11111110' portb portb,6 nnn posizionare zero_zero lavorazione b'11111101' portb portb,6 avanti b'11111110' portb portb,6 lp7 call cil_conf b'11111110' portb portb,6 nnn1 movlw b'11111101' portb portb,6 lp9 b'11111110' portb portb,6 lpconf1 b'11111110' ;premuto S ? ;premuto N ? ;posizione zero per torretta ;lampeggio led ;rilasciato ? ;posiziona utensile in 0,0 ;posizionamento manuale utensile ;chiedere se lavorazione conica ;premuto S ? ;premuto N ? ;rilasciato N ? ;premuto S ? ;premuto N ? 37 movwf btfss goto goto lp9 call lp91 movlw movwf btfss goto movlw movwf btfss goto movlw movwf btfsc goto goto lp99 call profondita' lp101 movlw movwf btfss goto movlw movwf btfsc goto goto lav1 movlw movwf call call goto avanti lp991 movlw movwf btfss goto movlw movwf btfsc goto goto avanti1 lp990 movlw movwf btfss goto movlw movwf btfsc goto goto lav2 movlw movwf call call goto nnn2 portb portb,6 nnn2 lp777 dati_cil_lun b'11111101' portb portb,6 lp99 b'11111101' portb portb,7 lp777 b'11111110' portb portb,6 lp91 lp9 dati_cil_prof ;rilasciato N ? ;richiede dati lavorazione cilindrica ;premuto S ? ;premuto ESC ? ;premuto N ? ;se confermati vai a richiedere b'11111101' portb portb,6 ;premuto S ? lav1 b'11111110' portb portb,6 ;premuto N ? lp101 lp99 2 ;lampeggio led led lav_corso ;messaggio per display lav_cilindrica ;esegui lavorazione in00 call dati_con_lun ;richiede dati conica lunghezza b'11111101' portb portb,6 ;premuto S ? avanti1 b'11111110' portb portb,6 ;premuto N ? lp991 avanti call dati_con_prof1 ;richiedi diametro1 b'11111101' portb portb,6 ;premuto S ? lav2 b'11111110' portb portb,6 ;premuto N ? lp990 avanti1 2 ;lampeggio led led lav_corso ;messaggio per display lav_conica ;esegui lavorazione in00 ;************************* fine main ******************************* ;**********sottoprogramma configurazione LCD configura_lcd bcf portc,RW bcf portc,RS call ms1 movlw 0x38 ;dati a 8 bits - 2 righe call display 38 call display movlw 0x0c call display movlw 6 call display movlw 1 call display movlw 2 call display movlw 0x40 call display movlw 0x80 call display bsf portc,RS call home1 movlw 'I' call display movlw 'T' call display movlw 'I' call display movlw 'S' call display movlw ' ' call display movlw 'M' call display movlw 'A' call display movlw 'X' call display movlw ' ' call display movlw 'P' call display movlw 'L' call display movlw 'A' call display movlw 'N' call display movlw 'C' call display movlw 'K' call display movlw ' ' call display return ;display on - cursore off - blinking off ;avanzamento cursore ;pulisci display ;cursore home ;indirizza cgram ;indirizza prima riga ;scrivi prima riga ;**********sottoprogramma posizionare posizionare call home1 movlw 'P' call display movlw 'O' call display movlw 'S' call display movlw 'I' call display movlw 'Z' call display movlw 'I' call display movlw 'O' call display movlw 'N' call display movlw 'A' 39 "ITIS M. PLANCK" call display movlw 'R' call display movlw 'E' call display movlw ' ' call display movlw 'U' call display movlw 'T' call display movlw 'E' call display movlw 'N' call display call home2 movlw 'S' call display movlw 'I' call display movlw 'L' call display movlw 'E' call display movlw ' ' call display movlw '#' call display movlw ' ' call display movlw 'S' call display movlw 'E' call display movlw ' ' call display movlw 'V' call display movlw 'A' call display movlw 'L' call display movlw 'I' call display movlw 'D' call display movlw 'O' call display return ;**********sottoprogramma che richiede tipo di lavorazione lavorazione call home1 movlw 'T' call display movlw 'O' call display movlw 'R' call display movlw 'N' call display movlw 'I' call display movlw 'T' call display movlw 'U' call display movlw 'R' call display 40 movlw 'A' call display movlw ' ' call display movlw 'C' call display movlw 'O' call display movlw 'N' call display movlw 'I' call display movlw 'C' call display movlw 'A' call display call home2 movlw '(' call display movlw 'S' call display movlw '/' call display movlw 'N' call display movlw ')' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display call blink_on bcf portc,RS movlw 0xc4 return ;sposta cursore alla casella 4 ;*********************routine conferma lavorazione cilindrica******* cil_conf call home1 movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw 'C' call display movlw 'O' call display 41 movlw 'N' call display movlw 'F' call display movlw 'E' call display movlw 'R' call display movlw 'M' call display movlw 'A' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display call home2 movlw 'C' call display movlw 'I' call display movlw 'L' call display movlw 'I' call display movlw 'N' call display movlw 'D' call display movlw 'R' call display movlw 'I' call display movlw 'C' call display movlw 'A' call display movlw ' ' call display movlw '?' call display movlw ' ' call display movlw 'S' call display movlw '/' call display movlw 'N' call display return ;**********sottoprogramma che richiede dati lavorazione cilindica dati_cil_lun call home1 movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw '0' 42 call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call bcf call lunghezza movlw call bsf call call movlw subwf btfsc goto movf movwf movf display '0' display '0' display '.' display '0' display ' ' display ' ' display ' ' display ' ' display ' ' display ' ' display home2 ' ' display ' ' display ' ' display 'L' display 'U' display 'N' display 'G' display 'H' display 'E' display 'Z' display 'Z' display 'A' display ' ' display ' ' display ' ' display ' ' display portc,RS ms1 ;richiedi dati lunghezza ;centx,decx,unx e decimix sono i valori della 85 display portc,RS ms1 tastiera 10 memoria,0 status,2 dati_cil_lun memoria,0 centx mem_dis,0 43 call display call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_cil_lun movf memoria,0 movwf decx movf mem_dis,0 call display call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_cil_lun movf memoria,0 movwf unx movf mem_dis,0 call display bcf portc,RS ;SALTA PUNTO call ms1 movlw 89 call display bsf portc,RS call ms1 call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_cil_lun movf memoria,0 movwf decimix movf mem_dis,0 call display call conferma ;conferma dati ? return ;**********sottoprogramma che visualizza messaggio posizionare00 call home1 movlw 'P' call display movlw 'O' call display movlw 'S' call display movlw 'I' call display movlw 'Z' call display movlw 'I' call display movlw 'O' call display movlw 'N' call display movlw 'A' call display movlw 'R' call display movlw 'E' call display movlw ' ' call display movlw 'U' call display movlw 'T' call display movlw 'E' 44 call display movlw 'N' call display call home2 movlw 'S' call display movlw 'I' call display movlw 'L' call display movlw 'E' call display movlw ' ' call display movlw 'I' call display movlw 'N' call display movlw ' ' call display movlw '0' call display movlw '/' call display movlw '0' call display movlw '?' call display movlw ' ' call display movlw 'S' call display movlw '/' call display movlw 'N' call display return ;**********sottoprogramma che richiede dati lavorazione cilindica dati_cil_prof call home1 movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw '0' call display movlw '0' call display movlw '.' call display movlw '0' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display 45 movlw call movlw call call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call bcf call profondita' movlw call bsf call call movlw subwf btfsc goto movf movwf movf call call movlw subwf btfsc goto movf movwf movf call bcf call movlw call bsf call call ' ' display ' ' display home2 ' ' display ' ' display ' ' display 'P' display 'R' display 'O' display 'F' display 'O' display 'N' display 'D' display 'I' display 'T' display 'A' display '`' display ' ' display ' ' display portc,RS ms1 ;richiedi dati lunghezza ;decy,uny e decimiy sono i valori della 86 display portc,RS ms1 tastiera 10 memoria,0 status,2 dati_cil_prof memoria,0 decy mem_dis,0 display tastiera 10 memoria,0 status,2 dati_cil_prof memoria,0 uny mem_dis,0 display portc,RS ;salta punto ms1 89 display portc,RS ms1 tastiera 46 movlw 10 subwf memoria,0 btfsc status,2 goto dati_cil_prof movf memoria,0 movwf decimiy movf mem_dis,0 call display call conferma ;conferma dati ? return ;**********sottoprogramma che richiede dati lavorazione conica lunghezza dati_con_lun call home1 movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw '0' call display movlw '0' call display movlw '0' call display movlw '.' call display movlw '0' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display call home2 movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw 'L' call display movlw 'U' call display movlw 'N' call display movlw 'G' call display movlw 'H' call display movlw 'E' call display movlw 'Z' 47 call display movlw 'Z' call display movlw 'A' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display bcf portc,RS ;richiedi dati lunghezza call ms1 ;centx,decx,unx e decimix sono i valori della lunghezza movlw 85 call display bsf portc,RS call ms1 call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_con_lun movf memoria,0 movwf centx movf mem_dis,0 call display call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_con_lun movf memoria,0 movwf decx movf mem_dis,0 call display call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_con_lun movf memoria,0 movwf unx movf mem_dis,0 call display bcf portc,RS ;salta punto call ms1 movlw 89 call display bsf portc,RS call ms1 call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_con_lun movf memoria,0 movwf decimix movf mem_dis,0 call display call conferma ;conferma dati ? return ;**********sottoprogramma che richiede dati lavorazione conica angolo dati_con_prof1 call home1 movlw ' ' call display movlw ' ' 48 call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call bcf call movlw call bsf call call display ' ' display ' ' display ' ' display ' ' display ' ' display '0' display '0' display ' ' display ' ' display ' ' display ' ' display ' ' display ' ' display ' ' display home2 'C' display 'O' display 'N' display 'I' display 'C' display 'I' display 'T' display 'A' display '`' display ' ' display 'I' display 'N' display ' ' display '%' display ' ' display ' ' display portc,RS ms1 87 display portc,RS ms1 tastiera ;richiedi dati conicita' ; 49 movlw 10 subwf memoria,0 btfsc status,2 goto dati_con_prof1 movf memoria,0 movwf COND movf mem_dis,0 call display call tastiera movlw 10 subwf memoria,0 btfsc status,2 goto dati_con_prof1 movf memoria,0 movwf CONU movf mem_dis,0 call display call conferma ;conferma dati ? return ;**********sottoprogramma lavorazione in corso lav_corso call home1 movlw ' ' call display movlw ' ' call display movlw ':' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw 'T' call display movlw 'E' call display movlw 'M' call display movlw 'P' call display movlw 'O' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display call home2 movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw 'L' call display movlw 'A' 50 call display movlw 'V' call display movlw 'O' call display movlw 'R' call display movlw 'A' call display movlw 'Z' call display movlw 'I' call display movlw 'O' call display movlw 'N' call display movlw 'E' call display return ;***********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 btfsc status,2 goto lavc_x call dy decf x1l ;controlla se zero goto lav_cil lavc_x movf x1h btfsc status,2 goto lavc_1 call dy decf x1h decf x1l goto lav_cil lavc_1 movf yl ;controlla posizione asse y btfsc status,2 goto lavc_y call dx decf yl goto lavflag lavc_y movf yh btfsc status,2 goto lav_cout call dx decf yh decf yl lavflag incf flag movlw 1 subwf flag,0 51 btfss status,2 goto lav_ci movf xl,0 movwf x1l movf xh,0 movwf x1h lavr1 movf x1l btfsc status,2 goto lavr2 call sy decf x1l goto lavr1 lavr2 movf x1h btfsc status,2 goto lavc_1 call sy decf x1h decf x1l goto lavr1 lav_cout bcf porte,2 call terminata call zeroxy return ;memorizza dati in x1 ;controlla se zero ;controlla se zero ;motore off ;***********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 btfsc status,2 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 btfsc status,2 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 btfsc status,2 goto fine_con decf xh ritorno movf x1l ;ritorno con lavorazione btfsc status,2 goto lavrc_x call sy decf x1l ;controlla se zero goto ritorno lavrc_x movf x1h btfsc status,2 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 btfsc status,2 goto rito_v1 call dy decf x1l ;controlla se zero goto rito_v rito_v1 movf x1h btfsc status,2 goto in_con call dy decf x1h decf x1l goto rito_v fine_con bcf porte,2 ;stop motore call terminata call zeroxy return ;**********sottoprogramma conversione dati in binario spostamento assex binariox clrf xl clrf xh lpx1 movf centx ;controlla valore centinaia btfsc status,2 ;se zero passa a controllo decine goto lpx2 53 lpx2 lpx3 lpx4 lpx5 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 movf decx btfsc status,2 goto lpx3 movlw d'100' addwf xl btfsc status,0 incf xh decf decx goto lpx2 movf unx btfsc status,2 goto lpx4 movlw d'10' addwf xl btfsc status,0 incf xh decf unx goto lpx3 movf decimix btfsc status,2 goto lpx5 movlw 1 addwf xl btfsc status,0 incf xh decf decimix goto lpx4 return ;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 btfsc status,2 ;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' btfsc status,2 ;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 btfsc status,2 goto lpx5y movlw 1 addwf yl btfsc status,0 incf yh decf decimiy goto lpx4y lpx5y return ;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' btfsc status,2 ;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 ;controlla valore decimi btfsc status,2 goto lpM5y movlw 1 addwf ylC btfsc status,0 ;c'e' riporto incf yhC decf CONU goto lpM4y lpM5y return ;**********sottoprogramma lavorazione terminata terminata clrf time ;blocca visualizzazione tempo call home1 movlw ' ' call display movlw ' ' call display movlw 'L' call display movlw 'A' call display movlw 'V' call display movlw 'O' call display movlw 'R' call display movlw 'A' call display movlw 'Z' call display movlw 'I' call display movlw 'O' call display movlw 'N' call display movlw 'E' call display movlw ' ' call display movlw ' ' 55 call display movlw ' ' call display call home2 movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw 'T' call display movlw 'E' call display movlw 'R' call display movlw 'M' call display movlw 'I' call display movlw 'N' call display movlw 'A' call display movlw 'T' call display movlw 'A' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display movlw ' ' call display return ;*******************routine conferma dati inseriti conferma call home2 movlw 'C' call display movlw 'O' call display movlw 'N' call display movlw 'F' call display movlw 'E' call display movlw 'R' call display movlw 'M' call display movlw 'A' call display movlw ' ' call display movlw '(' call display movlw 'S' call display movlw '/' call display movlw 'N' call display movlw ')' call display 56 movlw '?' call display movlw ' ' call display return ;*************************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 call delay20ms lpt2 btfss portb,4 goto lpt2 call delay20ms movlw 1 movwf memoria movlw '1' movwf mem_dis goto blink tasto2 call delay20ms lpt3 btfss portb,4 goto lpt3 call delay20ms movlw d'2' 57 movwf movlw movwf goto tasto3 lpt4 tasto4 lpt5 tasto5 lpt6 tasto6 lpt7 tasto7 lpt8 tasto8 lpt9 tasto10 lptesc tasto9 lpt10 memoria '2' mem_dis 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 return call delay20ms btfss portb,6 goto lpt10 call delay20ms 58 blink movlw d'9' movwf memoria movlw '9' movwf mem_dis call blink_off return ;********sottoprogramma controllo tasto enter ok movlw b'11111110' movwf portb lpen btfsc portb,7 goto lpen call delay20ms ;elimina rimbalzi return ;********sottoprogramma controllo tasto enter rilasciato okoff movlw b'11111110' movwf portb lpenr btfss portb,7 goto lpenr call delay20ms ;elimina rimbalzi return ;**********sottoprogramma invio dati a display display movwf portd ;invia dato bsf portc,E ;impulso di abilitazione bcf portc,E call ms1 ;ritardo 1ms return ;**********sottoprogramma comando cursore inizio seconda riga home2 bcf portc,RS movlw 0xc0 ;display inizio seconda riga call display bsf portc,RS return ;**********sottoprogramma comando cursore inizio prima riga home1 bcf portc,RS movlw 0x80 ;display inizio prima riga call display bsf portc,RS return ;**********sottoprogramma blink on blink_on bcf portc,RS ;blink on call ms1 movlw 0d call display bsf portc,RS call ms1 return ;**********sottoprogramma blink off blink_off bcf portc,RS call ms1 movlw 0c ;blink off call display bsf portc,RS call ms1 return ;**********sottoprogramma scritta (#) per continuare enter call home2 movlw '#' call display 59 movlw ' ' call display movlw 'P' call display movlw 'E' call display movlw 'R' call display movlw ' ' call display movlw 'C' call display movlw 'O' call display movlw 'N' call display movlw 'T' call display movlw 'I' call display movlw 'N' call display movlw 'U' call display movlw 'A' call display movlw 'R' call display movlw 'E' call display return ;**********sottoprogramma ritardo 1ms ms1 clrf ms lp_ms movf ms btfsc status,2 goto lp_ms return ;**********sottoprogramma ritardo 1ms ms10 clrf ms lp_ms3 movlw d'10' subwf ms,0 btfss status,2 goto lp_ms3 return ;**********sottoprogramma ritardo 20ms delay20ms clrf ms lp_ms20 movlw d'20' subwf ms,0 btfss status,2 goto lp_ms20 return ;**********sottoprogramma ritardo 100ms ms100 clrf ms lp_ms100 movlw d'100' subwf ms,0 btfss status,2 goto lp_ms100 return ;**********sottoprogramma controllo spostamento asse_dx dx incf assex movlw 4 subwf assex,0 btfss status,2 60 sax dx1 dx2 dx3 goto sax clrf assex movf assex btfss status,2 goto dx1 bcf porta,3 bsf porta,0 call ms10 return movlw 1 subwf assex,0 btfss status,2 goto dx2 bcf porta,0 bsf porta,2 call ms10 return movlw 2 subwf assex,0 btfss status,2 goto dx3 bcf porta,2 bsf porta,1 call ms10 return bcf porta,1 bsf porta,3 call ms10 return ;**********sottoprogramma controllo spostamento asse_sx sx decf assex movlw 0xff subwf assex,0 btfss status,2 goto sbx movlw 3 movwf assex sbx movf assex btfss status,2 goto sx1 bcf porta,2 bsf porta,0 call ms10 return sx1 movlw 1 subwf assex,0 btfss status,2 goto sx2 bcf porta,1 bsf porta,2 call ms10 return sx2 movlw 2 subwf assex,0 btfss status,2 goto sx3 bcf porta,3 bsf porta,1 call ms10 return sx3 bcf porta,0 bsf porta,3 call ms10 return ;**********sottoprogramma controllo spostamento asse dy dy incf assey movlw 4 61 ddy dy1 dy2 dy3 subwf assey,0 btfss status,2 goto ddy clrf assey movf assey btfss status,2 goto dy1 bcf portc,3 bsf portc,0 call ms10 return movlw 1 subwf assey,0 btfss status,2 goto dy2 bcf portc,0 bsf portc,1 call ms10 return movlw 2 subwf assey,0 btfss status,2 goto dy3 bcf portc,1 bsf portc,2 call ms10 return bcf portc,2 bsf portc,3 call ms10 return ;**********sottoprogramma controllo spostamento asse sy sy decf assey movlw 0xff subwf assey,0 btfss status,2 goto sby movlw 3 movwf assey sby movf assey btfss status,2 goto sy1 bcf portc,1 bsf portc,0 call ms10 return sy1 movlw 1 subwf assey,0 btfss status,2 goto sy2 bcf portc,2 bsf portc,1 call ms10 return sy2 movlw 2 subwf assey,0 btfss status,2 goto sy3 bcf portc,3 bsf portc,2 call ms10 return sy3 bcf portc,0 bsf portc,3 call ms10 return ;**********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 ? return goto lp1 lp2 call mot_off movlw b'11111101' movwf portb btfss portb,7 ;premuto ESC ? return btfss porta,4 ;controlla se azionato FCRY collegato a RA4 goto lp222 call mot_off return 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 return allarme goto zero_zero ;***************motori a riposo mot_off clrf porta ;motore1 off bcf portc,0 ;motore2 off 63 bcf portc,1 bcf portc,2 bcf portc,3 return nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ;area rom libera per salto pagina 64 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ;**********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 bcf rlf rlf bcf rlf rlf bcf rrf rrf movf addwf btfsc incf movf addwf bcf rrf rrf bcf rrf rrf bcf rrf rrf movf addwf btfsc incf movf addwf clrf clrf clrf movf movwf movwf movf movwf movwf movf movwf movf movwf lav_cie movf movwf movf movwf lav_cile movf btfsc goto incf movlw subwf btfss goto clrf movlw addwf btfsc incf e1 decf goto lavc_xe btfsc goto y1h status,0 yl yh status,0 yl yh status,0 y1h y1l y1l,0 yl status,0 yh y1h,0 yh status,0 y1h y1l status,0 y1h y1l status,0 y1h y1l y1l,0 yl status,0 yh y1h,0 yh em1 timel timeh xl,0 mxl x1l xh,0 mxh x1h yl,0 mem1 yh,0 mem2 clrf flag mxl,0 x1l mxh,0 x1h ;emula lavorazione cilindrica x1l status,2 lavc_xe em1 d'100' em1,0 status,0 e1 em1 1 timel status,0 timeh x1l lav_cile movf x1h status,2 lavc_1e ;controlla se zero ;memorizza dati per lavorazione ;inizio lavorazione ;memorizza dati in x1 ;controlla se zero 66 incf movlw subwf btfss goto clrf movlw addwf btfsc incf e2 decf decf goto lavc_1e btfsc goto incf movlw subwf btfss goto clrf movlw addwf btfsc incf e3 decf goto lavc_ye btfsc goto incf movlw subwf btfss goto clrf movlw addwf btfsc incf e4 decf decf lavflage incf movlw subwf btfss goto movf movwf movf movwf lavr1e btfsc goto incf movlw subwf btfss goto clrf movlw addwf btfsc incf e5 decf goto lavr2e em1 d'100' em1,0 status,0 e2 em1 1 timel status,0 timeh x1h x1l lav_cile movf mem1 status,2 lavc_ye em1 d'100' em1,0 status,0 e3 em1 1 timel status,0 timeh mem1 lavflage movf mem2 status,2 lav_coute em1 d'100' em1,0 status,0 e4 em1 1 timel status,0 timeh mem2 mem1 flag 1 flag,0 status,2 lav_cie mxl,0 x1l mxh,0 x1h movf x1l status,2 lavr2e em1 d'100' em1,0 status,0 e5 em1 1 timel status,0 timeh x1l lavr1e movf x1h ;controlla posizione asse y ;memorizza dati in x1 ;controlla se zero ;controlla se zero 67 btfsc status,2 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 btfsc status,2 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 return 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 return ;************* 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 btfsc status,2 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 btfsc status,2 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 btfsc status,2 goto fine_cone decf mxh ritornoe movf x1l ;ritorno con lavorazione btfsc status,2 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 btfsc status,2 goto torne incf em1 70 movlw subwf btfss goto clrf movlw addwf btfsc incf ee5 decf decf goto torne movf movwf movf movwf rito_ve btfsc goto incf movlw subwf btfss goto clrf movlw addwf btfsc incf ee6 decf goto rito_v1e movf btfsc goto incf movlw subwf btfss goto clrf movlw addwf btfsc incf ee7 decf decf goto fine_cone incf movlw subwf btfss goto movlw addwf btfsc incf ee9 clrf movf movwf lt11 movlw subwf btfss goto subwf incf goto lt21 movf d'100' em1,0 status,0 ee5 em1 1 timel status,0 timeh x1h x1l ritornoe mxl,0 x1l mxh,0 x1h movf x1l status,2 rito_v1e em1 d'100' em1,0 status,0 ee6 em1 1 timel status,0 timeh x1l rito_ve ;memorizza dati in x1 ;ritorno senza lavorazione ;controlla se zero x1h status,2 in_cone em1 d'100' em1,0 status,0 ee7 em1 1 timel status,0 timeh x1h x1l rito_ve em1 d'100' em1,0 status,0 ee9 1 timel status,0 timeh mem1 timel,0 mem2 d'60' mem2 status,0 lt21 timel mem1 lt11 timeh ;aggiusta tempo di 1 secondo ;converti tempo in minuti 71 btfsc status,2 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 return 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 VISTA FRONTALE DEL TORNIO 7 14 8 15 9 10 11 12 16 VISTA DALL’ALTO DEL TORNIO 75 13 17 6 1) Interruttore per l’ accensione 2) Pulegge per variare i giri del mandrino 3) Mandrino 4) Motore asse X 5) Contropunta 6) Motore asse Z 7) Segnalatore luminoso per indicare modi di funzionamento 8) Display 9) Scheda elettronica di controllo 10) Interruttore comando motore 11) Motore mandrino 12) Finecorsa asse X13) Finecorsa asse Z+ 14) Tasto reset 15) Tastierino 16) Finecorsa asse Z17) Finecorsa asse X+ 76 | MODI DI IMPIEGO | AVVERTENZE: prima di usare il tornio leggere attentamente le istruzioni riportate in questo manuale d’uso Questa unità può lavorare principalmente leghe leggere, soprattutto materiale plastico. La lavorazione di altri materiali non è consentita a causa della limitata potenza dei motori. TIPI DI LAVORAZIONI CHE SI POSSONO ESEGUIRE Le lavorazioni possibili sono cilindriche e coniche. Per la lavorazione cilindrica viene esportato uno spessore di materiale pari a 20 micron per ogni passata dell' utensile. La lavorazione conica viene effettuata a gradini, l'altezza di ogni gradino e' di 20 micron. PRECAUZIONI PER L'USO L'accesso ai circuiti elettronici non solo li può danneggiare ma e' anche pericoloso nonostante l'apparecchiatura preveda il rispetto delle normative di sicurezza. Posare il tornio su una superficie piatta, stabile ed in piano. Evitare scosse violente o urti. Non chiudere le fessure di ventilazione necessarie ad impedire che la temperatura dei circuiti elettronici aumenti eccessivamente per il cattivo ricircolo di aria. Essendo il tornio sprovvisto di sistemi di protezione, non toccare gli organi meccanici in movimento durante la lavorazione. EMERGENZE Se durante la lavorazione ci fossero anomalie di funzionamento o per qualsiasi altra emergenza, premere il pulsante rosso di emergenza posto sopra il tastierino che arresta immediatamente la macchina. • • • • • • • • • PRIMA DI PROCEDERE Verificare che la tensione di alimentazione sia quella standard prevista nella rete di distribuzione italiana Verificare se il pezzo da lavorare richiede la contro punta Nel caso si utilizzi la contro punta dare una pressione moderata ( una pressione elevata provoca il riscaldamento degli organi meccanici durante la lavorazione) Bloccare molto bene il pezzo. Un bloccaggio insicuro è fonte spesso di infortuni, dunque si raccomanda la massima attenzione. Verificare la velocità del mandrino agendo sull’interruttore in posizione 1 o 2 di rotazione. Si può inoltre agire sulle pulegge poste dietro al mandrino per selezionare la velocità desiderata. Controllare se le guide della macchina sono oliate a sufficienza ( in caso di mancanza di lubrificante il tornio potrebbe non eseguire correttamente le lavorazioni a causa della perdita del passo dei motori). Durante la lavorazione fare attenzione ai trucioli ( i trucioli possono provocare abrasioni ed ustioni ). Usare occhiali di protezione e guanti. Prima della lavorazione accertarsi che l'utensile sia affilato. Si consiglia di eseguire una manutenzione ordinaria ogni 40 ore di lavoro oppure una verifica generale delle condizioni di funzionamento. 77 ACCENSIONE DELLA MACCHINA Inserire la spina in una presa provvista di impianto di messa a terra. Alimentare il tornio attivando l’interruttore del relè magnetotermico posto sul lato sinistro della macchina. Il LED che segnala lo stato della macchina è acceso Sul display compare il messaggio: I.T.I.S. MAX PLANCK # PER CONTINUARE Premere il tasto # del tastierino esadecimale Il LED lampeggia e segnala che i successivi comandi mettono in movimento la torretta portautensile POSIZIONAMENTO AUTOMATICO UTENSILE dopo aver azionato il pulsante #, sul display compare il messaggio: POSIZIONARE UTEN SILE IN 0/0? S/N Se viene premuto il tasto S l'utensile viene portato automaticamente nel punto 0,0 che equivale al punto estremo D x , Dy Se durante il posizionamento automatico si preme il tasto ESC si esce da questa funzione e si entra in quella successiva Se viene premuto il tasto N si accede alla funzione successiva che consente di posizionare l'utensile manualmente per la lavorazione POSIZIONAMENTO MANUALE UTENSILE Dopo la precedente operazione sul display compare il messaggio: POSIZIONARE UTEN SILE # SE VALIDO VALIDO a questo punto e' possibile posizionare l'utensile mediante i tasti freccia . Premendo il tasto # si stabilisce il punto iniziale per la lavorazione cilindrica o conica. in caso di lavorazione cilindrica, la prima passata dell'utensile avviene verso il mandrino in caso di lavorazione conica la prima passata dell'utensile avviene nel verso opposto al mandrino SELEZIONARE TIPO DI LAVORAZIONE TORNITURA CONICA (S/N) 78 viene ora richiesto il tipo di lavorazione: premendo S si accede alla lavorazione conica, in caso contrario a quella cilindrica DATI PER LA LAVORAZIONE CILINDRICA viene richiesta una conferma della lavorazione selezionata mediante il messaggio CONFERMA CILINDRICA ? S / N in caso di conferma si procede, altrimenti si torna al punto Selezionare tipo lavorazione 0O0 . 0 LUNGHEZZA il cursore lampeggiante consente di caricare la lunghezza della tornitura cilindrica in decimi di millimetro. se durante il caricamento dei dati si commettono degli errori e' possibile, premendo il tasto ESC, ricominciare il caricamento dei dati. Dopo aver caricato i dati viene richiesta conferma dei dati caricati 0125 . 5 CONFERMA ( S / N ) viene ora richiesta la profondità della lavorazione cilindrica e poi la conferma dei dati inseriti. 00.O PROFONDITA’ 01.5 CONFERMA ( S / N ) LAVORAZIONE CILINDRICA dopo aver confermato la profondità, inizia la lavorazione. Il LED lampeggia a frequenza maggiore della precedente segnalando lavorazione in corso. Il mandrino viene posto in rotazione automaticamente e fermato al termine della lavorazione Premendo il pulsante di EMERGENZA si arresta la lavorazione in qualsiasi momento e si torna al punto iniziale che visualizza I.T.I.S. MAX PLANCK. durante la lavorazione compare sul display il tempo residuo di tornitura 79 03:45 TEMPO LAVORAZIONE TERMINE DELLA LAVORAZIONE Terminata la lavorazione il mandrino si ferma automaticamente. sul display compare il messaggio LAVORAZIONE TERMINATA L' utensile viene portato automaticamente sul punto 0,0. Premendo il tasto ESC si annulla il posizionamento automatico. AI termine della precedente funzione si torna al punto POSIZIONAMENTO UTENSILE PER LAVORAZIONE rendendo così possibile una nuova lavorazione. DATI PER LA LAVORAZIONE CONICA dopo aver confermato la richiesta di una lavorazione conica, vengono richiesti i dati della lavorazione in modo simile a quelli della lavorazione cilindrica 00O.0 LUNGHEZZA Dopo aver caricato i dati viene richiesta conferma con i valori inseriti: 006.0 006.0 CONFERMA S/N viene ora richiesta la conicità e la relativa conferma: 00 CONICITA’ IN % 35 CONFERMA ( S / N ) LAVORAZIONE CONICA dopo aver confermato la conicità inizia la lavorazione. Il LED lampeggia a frequenza maggiore della precedente segnalando lavorazione in corso. 80 durante la lavorazione compare il tempo residuo come per il caso della lavorazione cilindrica. Anche la procedura di fine lavorazione e' analoga. Note : _______________________________________________ _______________________________________________ _______________________________________________ _______________________________________________ _______________________________________________ La VA/Z si riserva il diritto di apportare cambiamenti al progetto in qualsiasi momento e senza preavviso. E vietata la riproduzione o la traduzione anche parziale di questo libretto, senza l’autorizzazione scritta della VA/Z . Giugno 2002 81