Comments
Description
Transcript
Microchip PIC16C5X
[email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) INTRODUZIONE MICROCHIP PIC • • • • Architettura Harvard Cpu tipo Risc Memoria di programma solo interna per molti modelli Ram usata solo come registro L' architettura dei microcontrollori di Microchip è particolare, si basa su una Cpu strettamente di tipo Risc, con separazione tra bus dati e bus istruzioni (tipo Harvard), nessuna possibilità di indirizzare memoria esterna e un elevato numero di registri interni, che costituiscono di fatto l' unica area di Ram utilizzabile. La Cpu utilizzata, che tratta dati a 8 bit, è di tipo strettamente Risc. Infatti, nella maggior parte dei modelli, il numero totale di istruzioni riconosciute è di solo 35. La semplicità della Cpu la rende molto veloce, in quanto le istruzioni vengono eseguite di solito in un ciclo macchina, solamente i salti impiegano più tempo. L' architettura è di tipo Harvard, con il bus dati a 8 bit e il bus istruzioni da 12 a 16 bit, a seconda della famiglia. Tranne il modello 17C42, tutti gli altri microcontrollori di Microchip non hanno la possibilità di gestire memoria esterna. Ciò limita la lunghezza del programma eseguibile, in quanto la lunghezza del programma che può risiedere nella memoria interna va da 512 a 2024 parole di istruzioni. Si noti che in compenso il codice macchina è molto compatto, in quanto la larghezza di parola per le istruzioni va da 12 a 16 bit. Tutta la Ram interna è vista come un insieme di registri da 8 bit, da 80 a 248 registri a seconda dei modelli, ai quali si affiancano dei registri speciali nei modelli dotati di periferiche interne. La disponibilità di molti registri rende molto veloce le commutazioni di contesto e le risposte alle interruzioni, ma la profondità dello stack è molto ridotta, da 2 livelli a 16 livelli. La programmazione è molto semplice, sia per il limitato numero di istruzioni disponibili sia per la quasi assoluta intercambiabilità dei registri. Praticamente tutte le operazioni aritmetiche e logiche possono avere come operandi due registri qualunque. E prevista una modalità di indirizzamento indiretto e la possibilità di spostare dati registrati dall' area delle istruzioni ai registri dati. I modelli di base della famiglia Pic sono completamente privi di ingressi per segnali di interruzione, mentre i modelli di fascia media e alta hanno molteplici ingressi, alcuni dei quali, collegati direttamente alle periferiche interne, come il timer. A parte il timer, sempre presente in una delle sue versioni in tutti i modelli, le altre periferiche disponibili in alcuni modelli sono dei moduli per le comunicazioni seriali, per la generazione di segnali Pwm e il convertitore A/D da 8 bit. Tutti i microcontrollori sono disponibili nella versione OTP, nelle versioni a basso consumo e con tensione di alimentazione ridotta, sino a 2V, mentre solo per alcuni modelli è prevista anche la versione con Rom interna oppure con Eeprom. 1 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) CAPITOLO PRIMO PIC16C5x CARATTERISTICHE TECNICHE Set di istruzioni limitato Massima frequenza di clock 20 Mhz Eprom interna da 512 bytex12bit a 2Kx12bit SRAM interna costituita da 25 a 72 registri a 8 bit Indirizzabili sia direttamente sia indirettamente 7 registri dedicati 2 livelli di stack Da 12 a 20 porte bidirezionali programmabili Prescaler interno a 8 bit Porte di I/O programmabili via software e con continuità anche durante il normale funzionamento, per ogni singolo bit sia in input sia in output Divide o conta il clock interno; Divide o conta un segnale digitale che giunge dall’esterno; Oscillatore interno Watchdog Controlla che la CPU non sia bloccata e, eventualmente forza con un reset interno la riesecuzione del programma. Eprom mascherabile alle lettura esterna SLEEP per risparmio di corrente Range di funzionamento 3-5.5 V Consumo < 2 mA a 5V 4 Mhz 15 uA a 3V 32 Khz < 3 uA in stand-by IL PIC E’ UN CONTROLLORE A 8 BIT, MA LE ISTRUZIONI VENGONO CODIFICATE, INSIEME AGLI OPERANDI IN UNA AREA DI DODICI BIT. BUS DATI=8 BIT BUS ISTRUZIONI=12÷16 BIT (a seconda della famiglia utilizzata) 2 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) 1.1 Le caratteristiche generali.. • I microcontrollori PIC possiedono un set di istruzioni molto ridotto che, se da un lato limita l' operatività, dall' altro ne facilita la velocità esecutiva. • La EPROM interna può variare da 512 byte x 12 bit a 2K x 12 bit, a seconda del modello di PIC scelto. In molte applicazione 512 byte di EPROM sono più che sufficienti, in quanto non vengono mai completamente utilizzati • Esiste, la possibilità di mascherare il programma memorizzato per mantenere la segretezza sul lavoro svolto dato che la mascheratura inibisce la copiatura del programma. • La RAM interna, è formata da un certo numero di registri a otto bit, indirizzabili sia direttamente che indirettamente. Sono a disposizione altri sette registri dedicati, il cui utilizzo verrà analizzato in seguito. • I livelli di stack, cioè il numero di chiamate a subroutine annidate, è fissato in due nei device di tipo 16C5x. • A seconda del dispositivo scelto, le porte di ingresso/uscita possono essere 12 oppure 20, tutte programmabili via software e con continuità, anche durante il normale funzionamento, per ogni singolo bit sia in input che in output. • Tutti i tipi di PIC possiedono il watchdog (letteralmente tradotto come " cane da guardia "), il quale controlla che la CPU ( termine con cui talvolta sono chiamati i microcontrollori) non sia in qualche modo bloccata e eventualmente, forza con un reset interno la riesecuzione del programma. • Tutti i PIC possiedono il prescaler che serve per dividere o contare il clock interno oppure un segnale digitale che giunge dall' esterno. • Ci sono quattro diversi tipi di oscillatori previsti per i PIC, anche se in commercio se ne trovano essenzialmente due: quello quarzato, che offre le migliori prestazioni e quello a rete RC. 1 1 9 RA 2 RA 3 R T C C M CL R R B 0 R B 1 R B 2 R B 3 R R OS OS A A C C R R R R B B B B P I C 16 C5 4 P I C 16 C5 6 1 0 1 2 + 7 6 5 4 18 10 14 R + N N R R R R R R R R R T C C C C A A A A B B B B B 0 1 2 3 0 1 2 3 4 M C L R O S C 1 O S C 2 R C 7 R C 6 R C 5 R C 4 R C 3 R C 2 R C 1 R C 0 RB 7 RB 6 RB 5 28 15 PIC 16 C5 5 PIC 16 C5 7 Fig.. 2 Pedinatura di alcuni tipi di PIC 16C5x 1.2 Applicazioni dei microcontroller I PIC si inseriscono nella fascia dei microcontroller, fornendo un’elevata versatilità, un ottimo rapporto prezzo / prestazioni e semplicità di programmazione; le dodici/venti linee digitali possono pilotare display, tastiere, relè e altri dispositivi di I/O. Dunque i PIC trovano naturale applicazione nell’automazione industriale e nella strumentazione di analisi e/o misura. 3 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) 1.3 Descrizione della architettura interna dei PIC 16C5x. In figura 3 è mostrato lo schema a blocchi dei microcontrollori modello PIC 16C5x che verrà di seguito analizzato. Fig.. 3 Architettura La prima componente da vedere è la EPROM: in tale memoria il PIC immagazzina il programma scritto dal progettista. La capacità della memoria potrà essere di 512 byte, di 1K oppure di 2K, a seconda del device scelto. Ogni cella della EPROM è di 12 bit. L'indirizzamento dell' istruzione viene garantito da un registro detto PROGRAM COUNTER ( PC ) che ha il compito di indirizzare una cella della EPROM; nello svolgimento del suo compito il PC tiene conto di alcuni elementi fondamentali: • il primo di questi è la cella da puntare dopo un reset (ad esempio quando viene data l' alimentazione) inizialmente il PC punta alla cella di indirizzo più alto; nel caso del PIC16C54 punta all’ indirizzo 1FFh (esadecimale). • Altro elemento fondamentale è il livello di stack in cui il PIC si trova; ci sono due registri, STACK1 e STACK2, che memorizzano un indirizzo in base a ogni istruzione CALL (chiamata a soubrutine) con sequenza di tipo LIFO ( Last In First Out ). Quindi, se nel programma il PIC trova una istruzione CALL, inserisce in STACK1 l' indirizzo attuale e nel PC viene memorizzato l' indirizzo a cui saltare. Se successivamente viene trovata un' altra istruzione CALL, il PIC memorizza il valore registrato in STACK1 dentro STACK2 e in STACK1 inserisce il nuovo valore attuale. Viceversa, a ogni istruzione RETLW (ritorno da soubrutine), viene riportato nel PC il valore presente nello STACK1 e, dopo, in STACK1 viene trasferito il valore di STACK2. • Ultimo elemento da tenere presente è il " ciclo di fetch ". Ogni CPU, infatti, ha il seguente modo di procedere nel suo lavoro: il PC punta a una cella di memoria che contiene l' istruzione da eseguire successivamente, che viene immagazzinata nel REGISTRO ISTRUZIONE. Da qui 4 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) passa alla zona attiva di DECODIFICA ISTRUZIONE e viene eseguita, incrementando di nuovo il PC. Il ciclo di fetch consiste nel far puntare il PC alla cella di memoria che contiene l’istruzione successiva a quella in esecuzione e di immagazzinarla nel REGISTRO ISTRUZIONE. Tale modo di procedere consente di risparmiare tempo. L’istruzione viene eseguita al Q1 successivo, come mostrato in figura 4. Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 OSC1 FASE 1 FASE 2 FASE 3 FASE 4 PC PC PC + 1 Fetch istruz. PC Execute istruz. PC - 1 PC + 2 Fetch istruz. PC + 1 Execute istruz. PC Fetch istruz. PC + 2 Execute istruz. PC + 1 Fig.. 4 Diagramma temporale del ciclo di fetch • Infine, dato che i vari tipi di PIC hanno memoria di diversa lunghezza, anche i bit del PC variano di conseguenza, come è possibile vedere nella mappa della memoria di figura 5: per indirizzare tutti e quattro i banchi del PIC16C57 sono necessari due bit in più rispetto al PIC 16C54. PIC16C54-------PAGE 0 PIC16C55-------PAGE 0-1 PIC16C56-------PAGE 0-1 PIC16C57-------PAGE 0-3 PIC16C54-------512 BYTE PIC16C55-------1K PIC16C56-------1K PIC16C57-------2K 000 PAGE 0 0FF 100 PAGE 1 2FF 300 PAGE 2 4FF 500 PAGE 3 6FF 700 1FF = 1 1111 1111 = 511 200 3FF = 0011 1111 1111 = 1023 400 5FF = 0101 1111 1111 = 1535 600 7FF = 0111 1111 1111 = 2047 Fig.. 5 Organizzazione della memoria SRAM 5 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) Tornando alla figura 3, si può notare che dopo la decodifica è possibile lavorare con i registri generali oppure con il registro W (Word). Quest' ultimo rappresenta uno dei registri più frequentemente usati dal programmatore poiché è coinvolto in molte istruzioni. Ad esempio, per utilizzare la ALU (Aritmetic Logic Unit), che è la componente che esegue le operazioni logiche, è necessario passare per W. Lo stato successivo a ogni operazione del PIC viene memorizzato nel registro di STATO, visibile in figura 6. 7 6 PA2 PA 1 5 PA0 4 3 TO PD 2 Z 1 DC 0 C C CARRY BIT DC DIGIT CARRY BIT Z ZERO BIT PD POWER DOWN BIT TO TIME-OUT BIT PA0..PA2 PAGE SELECT REGISTRO DI STATO Fig.. 6 Registro di stato • I tre bit PA0, PA1 e PA2, servono per selezionare i banchi possibili dei registri dei vari PIC; • il bit TO (time out) viene settato a uno durante il reset di alimentazione e dalle istruzioni CLRWDT e SLEEP, mentre viene resettato da un time-out del registro WATCHDOG; • il bit di PD (power down) è settato a 1 dalla sola istruzione CLRWDT e resettato dall' istruzione SLEEP; • Il bit Z (zero), è settato a 1 solo se il risultato dell' ultima operazione eseguita è zero; • I due bit DC (digit carry) e C (carry) sono, invece, settati se sopravviene un overflow. Osservando ancora la figura 3, si osserva che alla ALU sono connessi i registri F5, F6, F7, e i rispettivi TRIS_A, TRIS_B e TRIS_C. Questi registri controllano lo stato delle porte di ingresso/ uscita (I/O) e in figura 7 viene mostrata la struttura di un pin di I/O del PIC. Il flip-flop in alto corrisponde a un bit del registro relativo a una porta ( ad esempio la A ), mentre quello in basso corrisponde a un bit del registro TRIS_A ( sempre in riferimento alla porta A ). E'semplice intuire che quando il segnale sul clock del flip-flop in basso ha un fronte ascendente, il flip-flop memorizza sull' uscita Q il valore letto sull' ingresso D. Supponiamo che questo sia 1 e, quindi, Q si porta a 1 e il P-MOS viene interdetto e isola il pin di input dal positivo. Inoltre, essendo Q negato uguale a zero, anche il transistor N-MOS viene interdetto, isolando il pin di ingresso anche dal negativo. A questo punto il pin in questione è stato programmato per funzionare da INPUT e qualsiasi valore tenti di scriverci via software viene ignorato. Il dato di input potrà essere letto con un' istruzione che abiliti il three-state READ sul buffer di ingresso al BUS DATI. Supponiamo, invece, che il dato letto sia 0; allora i due transistor verranno abilitati a funzionare tramite le due porte OR e AND nel seguente modo: la porta AND darà un 1 in uscita quando il dato letto dal primo flip-flop e zero, mentre darà 1 in caso contrario. 6 [email protected] DAL BUS DATI PIC 16C5X – generalita’ (PIC16c5x.doc) Vdd D Q FLIP/FLOP WRITE _ Q CK P MOS PIN DI INPUT/OUTPUT BUS DATI READ DAL REGISTRO W D Q FLIP/FLOP TRIS f CK SET _ Q N MOS Vss RESET Fig.. 7 Struttura di un PIN di I/O Quindi, il transistor N-MOS porterà il pin input / output a massa se il dato immagazzinato nel primo flip-flop è 0 ( pin configurato come uscita bassa ). Viceversa, si attiverà il transistor P-MOS, portando il pin di input / output al positivo ( pin configurato come uscita alta ). In definitiva, si è visto, tornando alla figura 3, che il registro TRIS_A (TRIS_B e TRIS_C) serve a configurare i vari pin come input oppure come output, anche separatamente (corrispondenza con il flip-flop in basso), mentre il registro F5 (F6 e F7) viene utilizzato per settare a 1 o a 0 i pin già configurati come uscita (corrispondenza con il flip-flop in alto) e leggere lo stato di quelli settati come input. Il registro FSR serve per indirizzare indirettamente un altro registro. Il registro PRESCALER è un registro dedicato al conteggio di impulsi che possono arrivarvi sia dal clock interno che da un pin apposito, il RTCC ( Real Time Clock Counter ). Scopo del registro è quello di dividere gli impulsi in multipli di 2, fatto molto interessante se si pensa, ad esempio, di sfruttare il PIC come frequenzimetro o come lettore di rapporti impulso / pausa. Il registro OPTION viene impiegato per attivare o disattivare il prescaler, per variarne la scala di riduzione e per decidere se il segnale di RTCC deve essere valutato sul fronte di discesa oppure su quello di salita. In figura 8 è mostrata bit per bit la struttura del registro OPTION. 7 [email protected] PIC 16C5X – generalita’ 5 4 3 2 1 0 RTS RTE PSA PS2 RS1 RS0 (PIC16c5x.doc) RTS RTCC SIGNAL SOURCE RTE RTCC SIGNAL EDGE PSA PRESCALER ASSIGNMENT BIT PS2..PS0 PRESCALER VALUE REGISTRO OPTION Fig.. 8 Registro OPTION Il registro WATCHDOG invece, se attivato via software, consente di determinare se la CPU si è bloccata e in tale situazione, ha il compito di resettare il sistema. Questa funzione è molto utile specie in impianti dove il funzionamento di un certo circuito deve essere garantito in ogni momento. Infine, è presente un registro detto di CONFIGURAZIONE che non può essere scritto, ma solamente letto e che dà informazioni quali il device, il tipo di oscillatore e altre. Per concludere la spiegazione sui PIC, ne riportiamo in FIGURA 9 la struttura interna in relazione ai vari banchi di memoria possibili. 7 A 9 6 5 4 3 2 1 0 00 INDIRIZZ. INDIRETTO 01 RTCC 8 PC 03 STATO 04 FSR 05 PORTA A 06 PORTA B 07 PORTA C CALL RETLW A 9 8 7 6 5 4 3 2 1 0 A 9 8 7 STACK 1 6 5 4 3 2 1 0 STACK 2 7 6 5 4 3 2 1 0 TRIS A TRIS B TRIS C REGISTRI AD USO GENERALE ALU 5 4 3 2 1 0 OPTION W OF 00 10 11 12 01 30 31 32 3F 1F BANCO 0 10 11 50 51 52 5F BANCO 1 7F BANCO 2 BANCO 3 Fig.. 9 PIC e banchi di memoria 8 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) 1.4 Descrizione delle istruzioni Premettiamo che il PIC è un controllore ad otto bit, tuttavia le istruzioni vengono codificate, insieme agli operandi, in un' area di dodici bit. Ogni istruzione ha una codifica, un codice mnemonico, l' eventuale operando e può o meno modificare lo stato del registro di STATO. La prima operazione che prendiamo in esame è la NOP, ovvero la " no operation ", cioè quell' operazione che non modifica in alcun modo lo stato del PIC; vedremo in seguito, che verrà utilizzato obbligatoriamente per le attese e per ogni tipo di timer. La sua codifica vede tutti i bit a zero ( 000h ), non ha operandi e non produce cambi di stato, ma semplicemente fa passare un ciclo in più durante l' esecuzione di un programma. Anche l' istruzione MOVWF non altera il registro di stato del PIC, ma modifica il registro f (cioè il suo operando) immagazzinandovi ciò che trova nel registro W. Il numero di f potrà variare, a seconda del device, da zero a un massimo di 1Fh. Questa istruzione può essere utile ad esempio per settare un registro a un ben definito valore iniziale prima di un determinato conto. Ci sono poi due istruzioni che resettano il contenuto di W e di un registro f dato come operando e sono rispettivamente CLRW ( Clear W ) e CLRF ( Clear f ). La chiamata a entrambe fa in modo che venga modificato il bit numero 2 del registro di STATO; questo bit viene settato a 1 se il risultato di una istruzione è zero. La codifica per CLRW è 040h, mentre per CLRF è 06fh. Per valutare le successive istruzioni, fissiamo ora alcune notazioni: f è sempre considerato il numero di un registro e potrà variare tra 0 e 1fh, d invece indica la destinazione del risultato dell' operazione, che potrà essere W se d=0, oppure f se d=1. Vediamo un istruzione a due operandi, la SUBWF ( SUBtract W From ). Il primo operando indica il registro da cui sottrarre W e il secondo la destinazione: è possibile, infatti, sottrarre W ad esempio dal registro 09h e decidere se riscrivere il risultato in 09h oppure in W. La codifica di SUBWF è 08Fh e a istruzione avvenuta vengono modificati i bit C, DC e Z del registro di STATO. La DECF ( DECrement f ) decrementa il valore che trova nel registro f e pone il risultato in f o in W. Se il valore iniziale era zero, dopo questa operazione nel registro si troverà FFh. Il codice della DECF è 0CFh e anche questa modifica il registro di STATO nel bit 2. Può essere usata per introdurre dei cicli andando poi a testare il bit 2 di questo registro per vedere se si è arrivati a zero. Esistono due tipiche istruzioni da matematica booleana e cioè la IORWF ( Inclusive OR W and f ) e la ANDWF ( AND W and f ) che, rispettivamente eseguono l' operazione di or e di and fra W e i registri indicati come operandi. Il bit 2 del registro di STATO viene modificato in conseguenza. Le codifiche per le due istruzioni sono, rispettivamente, 10Fh e 14Fh. Come le precedenti, anche XORWF ( eXclusive OR W and f ) compie un operazione booleana e cioè l' or esclusivo tra W e il registro f. Il suo codice operativo è 18Fh e anch' essa modifica il registro di STATO. Le ultime tre operazioni di tipo booleano e cioè IORLW (Inclusive OR Literal and W), XORLW (eXclusive OR Literal and W) e ANDLW. Le operazioni booleane svolte da queste istruzioni sono le stesse viste per IORWF, ANDWF e XORWF con la differenza che la destinazione è sempre W e l' altro operando è un valore impostabile durante l' operazione stessa. 9 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) La ADDWF ( ADD W and f ) somma il valore di W a quello contenuto nel registro f e lo deposita in d. Poichè possono intervenire problemi di overflow, vengono interssati i bit C, DC e Z del registro di STATO. Il codice della ADDFW è 1 CFh. Un istruzione che" sposta "i contenuti dei registri è la MOVF (MOVe f). Con essa, il valore contenuto nel registro f viene immagazzinato nella destinazione d. Poichè la destinazione può essere esclusivamente o il registro stesso o W, nel primo caso si ha l' effetto di una NOP ( f viene riscritto con il suo valore ). Il codice di questa istruzione è 20Fh. Con la COMF ( COMplement f ) viene eseguito il complemento del registro f, cioè vengono sostituiti gli 1 con gli 0 e viceversa. Anche per questa istruzione viene influenzato il bit 2 del registro di STATO. Il codice operativo della COMF è 24Fh. L' istruzione complementare alla DECF vista precedentemente è la INCF ( INCrement f ): rispetta tutte le caratteristiche viste per la DECF, ma invece di decrementare il valore di f, lo incrementa di uno. Il suo codice operativo è 28Fh. Una istruzione molto importante e usata per la creazione di cicli è la DECFSZ ( DECrement f Skip se Zero ). Tale istruzione esegue un decremento unitario come la DEC, ma al termine controlla se il risultato è zero. Se ciò avviene, l' istruzione seguente nel programma viene saltata (skipped) e si passa a quella successiva. E'intuibile che in un ciclo si debba sempre testare se il conteggio è giunto alla fine o meno e questa istruzione esegue proprio questa operazione. Il suo codice è 2CFh. La INCFSZ ( INCrement f Skip se Zero ) ha le stesse caratteristiche viste per la DECFSZ, ma questa volta l' operazione sul valore del registro è di incremento e non di decremento, utile per i cicli con conteggio positivo. Il suo codice operativo è 3CFh. Ci sono poi tre istruzioni che manipolano il byte del registro f e cioè la RRF ( Rotate Right f ), la RLF ( Rotate Left f ) e la SWAPF ( SWAP halwes f ): • La RRF ruota i bit del registro f verso destra, cioè in pratica li " shifta " di una posizione: il bit ottavo va al posto del settimo, il settimo al posto del sesto e così via fino al primo che va nel bit C del registro di STATO. Il codice operativo dell’istruzione è 30Fh. • La RLF shifta anch' essa, ma verso sinistra con le stesse modalità operative della RRF. Il codice operativo dell’istruzione è 34Fh • La SWAPF, invece, scambia di posto i due nibble del byte da trattare. Il codice operativo dell’istruzione è 38Fh. Abbiamo visto così tutte le istruzioni orientate al byte che sono presenti in Tabella 1. In Tabella 2, invece, troviamo le sole quattro istruzioni orientate al bit. Precisiamo che f indica il solito registro, mentre, mentre b il numero dei bit su cui operare. b potrà valere da 0 a 7 essendo il registro f un 8 bit. La prima istruzione che valutiamo è la BCF (bit clear f) che pone a 0 il bit b del registro f. Questa istruzione è molto usata per disattivare un' uscita se, ad esempio, il registro è il 5, il 6 o il 7. Il suo codice operativo è 4BFh: La complementare della BCF è la BSF (Bit set f), che pone a 1 il bit b del registro f. Questa istruzione è utile per attivare le uscite del PIC. Il suo codice operativo è 5BFh. 10 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) Ci sono ora due istruzioni che testano il valore di un singolo bit e saltano l' istruzione successiva se tale bit è a zero (BTFSC cioè bit Test f Skip se Clear) oppure a uno (BTFSS cioè Test f Skip se Set). I loro codici operativi sono rispettivamente 6BFh e 7BFh. Al contrario delle due precedenti, queste istruzioni di test consentono di verificare il livello logico che ho su una porta di input. Le ultime operazioni che prendiamo in esame sono quelle visibili in tabella 3 e cioè quelle relative all' input di dati da programma (K indica il valore espresso in byte) e al controllo dei PIC. L' operazione OPTION (load OPTION register) carica nel registro OPTION il contenuto di W. Quindi questa istruzione sarà utile in fase di inizializzazione per settare correttamente le opzioni del PIC. Il suo codice operativo è 002h. L’istruzione SLEEP (go into standby mode) pone a zero il WDT (WatchDog Timer) e, quindi, ferma l' oscillatore, ottenendo un consumo totale del chip inferiore a 15 uA. Il suo codice operativo è 003h: Anche la CLRWDT (CleaR WAtchDog Timer) pone uno zero nel WDT, ma questa volta l' oscillatore non viene bloccato e il programma prosegue. E'molto utile per eseguire un controllo sull' effettivo funzionamento del PIC: se il programma azzera ripetutamente il WDT, il PIC funziona normalmente. Quando questo azzeramento viene a mancare, significa che per qualche motivo esterno il PIC non procede più con il programma regolare e allora interviene un reset interno automatico. Il codice operativo della CLRWDT è 004h. L' istruzione TRIS (TRIstate port) consente di programmare i singoli pin come ingressi o come uscite: scrivendo un 1 su di un bit corrispondente ad esempio al registro 6 bit 0 (porta B pin 0), si dice al PIC che quel pin deve essere di ingresso. Al contrario, scrivendoci 0 diciamo che quel pin deve essere in uscita. Il codice operativo è 00Fh. Le due istruzioni seguenti, consentono di introdurre delle subroutine e sono la RETLW (RETurn, place k in W) e CALL (CALL subroutine). Entrambe modificano il valore del PC e degli stack. I loro codici operativi sono rispettivamente 8KKh e 9KKh. L' istruzione GOTO (GO TO address), invece, offre la possibilità di saltare incondizionatamente a un indirizzo del programma scelto a piacere: Con l' operazione MOVLW (MOV e Literal to W), il registro W viene "caricato" con il valore k. Può essere molto utile per esempio per inizializzare dei registri con dei valori inseriti nel programma come dati. Abbiamo così valutato, una per una, tutte le possibili istruzioni per il PIC16C5X. "I PIC, IN VIRTU' DEL FATTO CHE SONO PROCESSORI "risc" DISPONGONO DI POCHE ISTRUZIONI, COMUNQUE SUFFICIENTI A SVOLGERE OPERAZIONI ANCHE COMPLESSE " 11 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) 1..5 L’oscillatore Si aggiungono ora alcuni dati che sono necessari per l' impiego di questo chip. La scelta di un tipo di oscillatore al posto di un altro deve essere ben motivata, e si vedranno i pregi e i difetti di ciascuno di questi. Diciamo inanzitutto che i tipi di oscillatori sono 4: XT, HS, RC, LP. La versione finestrata del PIC ha la possibilità di essere settata, tramite il software di programmazione, per funzionare con qualsiasi tipo di oscillatore, mentre la versione OTP (One Time Programmable) viene settata dal fabbricante stesso e, quindi, non più modificabile dall' utente. La differenza fondamentale tra gli oscillatori controllati con quarzo oppure con risuonatore ceramico e quelli RC è senza dubbio la stabilità in frequenza, mentre la secondaria è il costo di produzione. Si può vedere nella appendice1 lo slittamento di frequenza in funzione della temperatura con circuito oscillante di tipo RC. In tabella 1 sono riportati invece alcuni valori di R e di C per ottenere alcune frequenze standard. In figura 10 si possono vedere le connessioni con i vari tipi di oscillatore. FIG.. 10 Tipi di di oscillatori per i PIC 12 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) 13 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) 14 [email protected] PIC 16C5X – generalita’ TITLE ‘Programma di prova’ La prima linea del programma contiene la direttiva TITLE con cui si assegna un titolo al programma, inserito però tra due apici. LIST F=INHX16,P=16C54 La seconda riga indica al compilatore quale device si utilizza e quale formato di file si vuole in uscita; nel caso in esame si utilizza un PIC16C54 e un object file in formato 16 bit word. Inoltre, la prima dichiarazione list implica che verrà generato un file .LST che servirà successivamente per un miglior debug del programma. Da questo punto si fissano delle costanti e si rinominano dei registri per una comodità di lettura e di interpretazione: TIM0 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31 EQU 1AH ;Numero ripetizioni per delay10mS EQU 5 ;porta A EQU 6 ;porta B EQU 7 ;utilità generali EQU 8 EQU 9 EQU 0AH EQU 0BH EQU 0CH EQU 0DH EQU 0EH EQU 0FH EQU 10H EQU 11H EQU 12H EQU 13H EQU 14H EQU 15H EQU 16H EQU 17H EQU 18H EQU 19H EQU 1AH EQU 1BH EQU 1CH EQU 1DH ;per ritardo 1S EQU 1EH ; per ritardo 10mS EQU 1FH ; per ritardo 10mS ORG 0 OPTION (PIC16c5x.doc) Definizione di una costante TIM0 di valore 1AH; ogni registro viene ridenominato per fornire una più facile interpretazione: sicuramente è più istintivo chiamare un registro F31 che 1FH. Ogni frase scritta dopo il punto e virgola viene interpretata dal compilatore come commento e quindi non valutata. Da questo punto comincia il programma vero e proprio; ORG è una direttiva del compilatore e definisce l’origine del programma stesso. OPTION senza aver scritto niente in W, indica che non si vogliono utilizzare il WATCHDOG e il PRESCALER. 15 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) A questo punto del programma, in genere, vengono inserite le subroutine di uso più frequente, come quella per il ritardo di 10 mS riportata di seguito; ;ROUTINE DI RITARDO 10 mS DELAY DEL0 DEL1 DELAY MOVLW TIMO ;Carico il valore di TIM0 ( 1Ah ) in W MOVWF F30 ;Carico W in F30 ( 1Eh ) F30= 1Ah DEL 0 MOVWF F31 ;Carico W in F31 ( 1Fh ) NOP NOP NOP DECFSZ F31 ;Nessuna operazione ;Nessuna operazione ;Nessuna operazione ;Decremento F31, salto l’istruzione successiva se risultato è 0 ;Vado a DEL1 ;Decremento F30, salto l’istruzione successiva se il risultato è 0 ;Vado a DEL0 ;Ritorna da subroutine GOTO DEL1 DECFSZ F30 GOTO DEL0 RETLW 0 F31= 1Ah DEL 1 NOP NOP NOP F3 1=F3 1- 1 La scritta DELAY è una label, così come DEL0 e DEL1; queste consentono di saltare da un punto all’altro del programma con le istruzioni GOTO e CALL e di tornare, alla fine della routine, al punto della chiamata con RETLW. NO F3 1=0 CALCOLO DEL RITARDO: (1A=26) SI dopo 26 cicli riferiti a DEL 1, F31=0; dopo 26 cicli riferiti a DEL 0, F30=0; il caricamento del registro F30 il caricamento del registro F31 l’esecuzione di un NOP l’esecuzione di DECFSZ31 l’esecuzione di GOTO DEL 1 l’esecuzione di DECFSZ F30 l’esecuzione di GOTO DEL 0 per un totale di F30=F30- 1 avviene 1 volta; avviene 26 volte; avviene 26*26*3 volte; avviene 26*26 volte; avviene 26*26 volte; avviene 26 volte; avviene 26 volte; 3435 operazioni; F30=0 NO SI RETURN IL PIC SUDDIVIDE AL SUO INTERNO IL CLOCK PER QUATTRO, QUINDI OGNI 4 COLPI DI CLOCK ESEGUE UN’OPERAZIONE ; i colpi di clock per 3435 operazioni sono 4*3435= 13740; CON CK = 1 MHZ si ha un ritardo di circa 13,5 mS; 16 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) ;ROUTINE DI RITARDO 1S DELAY1 La routine DELAY viene chiamata 72 volte (48h = 72), MOVLW 48H ;Carico il valore di introducendo così un ritardo di circa 13,5*72 = 0,972 (48H) in W mS (circa 1 secondo). MOVWF F29 ;Carico W in F29 DEL2S CALL DELAY DECFSZ F29 GOTO DEL2S RETLW 0 Si descrive di seguito il programma principale, che può essere utilizzato per produrre l’accensione e lo spegnimento di un led, posto sul PIN A0 della porta 5 (F5), con intervalli di un secondo; 17 [email protected] PIC 16C5X – generalita’ MAIN MOVLW 00FH ;W=0000 1111 TRIS 6 ;PORTA B, definizione I/O B0..B3 IN B4..B7 OUT MOVLW 0FFH ;W=1111 1111 MOVWF F6 ;muovi W sulla porta B tutti 1 in uscita su B CLRW TRIS 5 ;azzera W ;PORTA A, definizione I/O A0....A3 OUT MOVWF F5 ;tutti i pin di A a zero (PIC16c5x.doc) MAIN 1 NO PORTA 5 BIT 0 =0 SI PORTA 5 BIT 0=0 PORTA 5 BIT 0=1 ASPETTA 1SEC ASPETTA 1 SEC MAIN 1 BTFSC F5,0 ;testa porta A bit 0, skippa se zero GOTO SETTA ;vai a SETTA BSF F5,0 ;setta a 1 bit 0 di porta A CALL DELAY1 ;ritardo di un secondo GOTO MAIN1 ;torna a MAIN1 SETTA BCF F5,0 ;setta a 0 bit 0 di porta A CALL DELAY1 GOTO MAIN1 ;torna a MAIN1 DATA “LAMPEGGIO DI UN LED” DATA “ BY Carbon and C” DATA “I H N” ORG 01FFFH GOTO MAIN END Alla fine del programma è possibile inserire dei dati personali per l’identificazione; occorre tenere conto, però, che questi dati vengono inseriti nella EPROM del PIC, quindi portano via spazio potenzialmente utilizzabile per lo sviluppo del programma. La fine di un programma viene definita dalle tre linee a lato; la prima riga indica al PIC la cella di memoria da cui partire a leggere le istruzioni. Nel caso del PIC 16C54 e PIC16C55 è obbligatorio dare 01FFh come origine (sarebbe l’ultimo indirizzo utile della EPROM). Poiché non è possibile proseguire incrementando tale indirizzo, l’istruzione da dare successivamente sarà per forza di cose GOTO MAIN. Infine l’ultima riga del programma deve avere la direttiva END, per comunicare all’assemblatore che il programma da assemblare è terminato. 18 [email protected] PIC 16C5X – generalita’ (PIC16c5x.doc) BUS DATI E BUS ISTRUZIONI SONO SEPARATI (ARCHITETTURA HARVARD) I REGISTRI DA 07 A 1F (PER UN TOTALE DI 25) SONO A DISPOSIZIONE DELL’UTENTE 19