Lezione n° 3 - mrscuole.net
Transcript
Lezione n° 3 - mrscuole.net
Corso introduttivo sui microcontrollori A. S. 2007 – 2008 La programmazione dei PIC Nicola Amoroso [email protected] NA – L3 http://www.mrscuole.net/anxapic/ 1 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il softw are per il PIC • Come per qualsiasi sistema a microprocessore, anche per il PIC è necessario preparare un programma per farlo funzionare. • Un programma è costituito da una sequenza di instruzioni, ognuna delle quali identifica univocamente una funzione che il PIC deve svolgere. Ogni istruzione è rappresentata da un codice operativo (in inglese operation code o più brevemente opcode) composto da 14 bit ed è memorizzata in una locazione di memoria dell'area programma. Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione oppure una coppia istruzione/dato. • Questi codici, completamente privi di senso per un essere umano, sono gli unici che il PIC è in grado di capire. Per fortuna esistono alcuni strumenti che consentono di facilitare il compito al programmatore rendendo le istruzioni più comprensibili. NA – L3 http://www.mrscuole.net/anxapic/ 2 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il software per il PIC – 1° modo Il programma per il PIC si può scrivere in linguaggio assembly o assembler , usando direttamente le 35 istruzioni riconosciute dal microcontrollore. Il “codice” si scrive come un file di testo . Esso viene convertito in codice binario da un programma chiamato Assemblatore. Il file creato contiene codici esadecimali e ha estensione . HEX Per trasferire poi il file HEX nella memoria di programma del PIC occorre un dispositivo chiamato Programmatore Si usa un Personal Computer : • per scrivere il testo del programma, con un editor di testi ( non usando Word ! ) • per convertirlo in codice eseguibile, usando l’Assemblatore • per scriverlo nel PIC, usando un Programmatore. NA – L3 http://www.mrscuole.net/anxapic/ 3 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il software per il PIC – 1° modo La casa costruttrice Microchip fornisce un pacchetto integrato chiamato MPLAB [Download gratuito => http://www.microchip.com]. Esso comprende : MPLAB Editor : editor di testo per scrivere il testo del programma MPASM : il compilatore che traduce il testo in codice eseguibile (usando il codice esadecimale) Il compilatore MPASM è liberamente usabile. Si scarica dal sito della Microchip e si può usare indipendentemente dall’editor. Lavorando in Assembler, la parte più difficile è il debug , cioè l’eliminazione degli errori di programmazione. Esistono software di simulazione, a pagamento in genere, che consentono di controllare il funzionamento del programma NA – L3 http://www.mrscuole.net/anxapic/ 4 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ .asm Contiene il codice sorgente in formato assembler. .inc File header, intestazioni e defiizioni hardware per il micro .lst Contiene l’intero codice assembler e varie informazioni di compilazione .tre Albero di allocazione della memoria. .err File con errori di compilazione e numeri di linea. .hex File con il codice macchina, per la programmazione del microcontrollore NA – L3 http://www.mrscuole.net/anxapic/ 5 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il software per il PIC – 1° modo Esempio di file ASM … RestoreLoader lfsr 0, buff movlw UPPER Main movwf t1+3 bcf STATUS, C rrcf t1+3, F movlw B'11110000' iorwf t1+3, F movlw HIGH Main movwf t1+2 rrcf t1+2, F movlw LOW Main movwf t1 rrcf t1, F MOVLF 0xEF, t1+1 lfsr 1, t1 MOVLF 0x04, count rest_rep movff POSTINC1, POSTINC0 decf count, F bnz rest_rep movlw 0xFF movwf POSTINC0 movwf POSTINC0 movwf POSTINC0 NA – L3 ; Construct instructions in buff ; Upper byte of address to main ; Clear carry bit ; Rotate through carry ; Second word in goto must start with F. ; High byte of address to main. ; Low byte of address to main ; High byte in first word is EF ; two last nop ; ; ; buff should now contain 8 bytes : http://www.mrscuole.net/anxapic/ 6 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Set istruzioni PIC16F84 - 877 Sintassi Descrizione Microchip Operazione equivalente ADDLW k Add Literal and W ADDWF f,d Add W and f ANDLW k AND Literal with W ANDWF f,d AND W with f BCF f,b Bit Clear f BFS f,b Bit Set f BTFSC f,b Bit Test f, Skip if Clear BTFSS f,b Bit Test f, skip if Set CALL k Subroutine Call CLRF f Clear f CLRW Clear W Register CLRWDT Clear Watchdog Timer W=W+ k d = W + f (dove d può essere W o f) W = W AND k d = W AND f (dove d può essere W o f) f(b) = 0 f(b) = 1 f(b) = 0 ? Si, salta una istruzione f(b) = 1 ? Si, salta una istruzione Chiama la subroutine all'indirizzo k f=0 W= 0 Watchdog timer = 0 NA – L3 http://www.mrscuole.net/anxapic/ 7 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ DECF f,d Decrement f d = f -1 (dove d può essere W o f) DECFSZ f,d Decrement f, Skip if 0 d = f -1 (dove d può essere W o f) se d = 0 salta GOTO k Go to address Salta all'indirizzo k INCF f,d Increment f d = f +1 (dove d può essere W o f) INCFSZ f,d Increment f, Skip if 0 d = f +1 (dove d può essere W o f) se d = 0 salta IORLW k Inclusive OR Literal with W W = W OR k IORWF f,d Inclusive OR W with f d = f OR W (dove d può essere W o f) MOVLW k Move literal to W W=k MOVF f,d Move f d = f (dove d può essere W o f) MOVWF f Move W to f f=W NOP No Operation Nessuna operazione OPTION Load Option Register OPTION = W RETIE Return from Interrupt Ritorna da un interrupt handler RETLW k Return Literal to W Ritorna da una subroutine con W = k RETURN Return from Subroutine Ritorna da una subroutine RLF f,d Rotale Left f through Carry d = f << 1 (dove d può essere W o f) NA – L3 http://www.mrscuole.net/anxapic/ 8 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Set istruzioni PIC16F84 - 877 RLF f,d Rotale Left f through Carry RRF f,d Rotale Right f through Carry SLEEP Go into Standby Mode SUBLW k Subtract W from Literal SUBWF f,d Subtract W from f SWAPF f Swap f TRIS f Load TRIS Register XORLW k Exclusive OR Literal with W XORWF f,d Exclusive OR W with f NA – L3 d = f << 1 (dove d può essere W o f) d = f >> 1 (dove d può essere W o f) Mette in standby il PIC W= k - W d = f - W (dove d può essere W o f) f = Swap dei bit 0123 con 4567 di f TRIS di f = W W = W XOR k d = f XOR W (dove d può essere http://www.mrscuole.net/anxapic/ 9 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il software per il PIC – 2° modo Il programma per il PIC si può scrivere usando un Compilatore ad alto livello , ossia un software che usa istruzioni a livello più elevato , per velocizzare e facilitare la stesura del programma . Il Compilatore può essere • in linguaggio BASIC ( ad esempio il PicBasic) • in linguaggio C • di tipo grafico, ossia che usa simboli grafici al posto delle istruzioni. Ad esempio usa il simbolo di una porta AND al posto dell’istruzione assembler equivalente . Due esempi di compilatori grafici sono il Visual Parsic e il Proton+. I compilatori devono essere acquistati ; i più semplici in Basic o C sono a basso costo o anche freeware. Alcuni compilatori, come il Proton+, offrono delle versioni di prova dette Lite , cioè con funzioni limitate . NA – L3 http://www.mrscuole.net/anxapic/ 10 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il software per il PIC – 2° modo NA – L3 http://www.mrscuole.net/anxapic/ 11 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il sistema di sviluppo CCS PCWH NA – L3 http://www.mrscuole.net/anxapic/ 12 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Programmazione dei PIC Esempio di file HEX :1000000008308A00C92D0000FF00030E8301A10003 :100010000A08A0008A010408A2007708A300780853 :10002000A4007908A5007A08A6007B08A70083131E :1000300083128B1E1D280B1936288C308400801EDD :1000400023288C1A3928220884002308F700240862 :10005000F8002508F9002608FA002708FB00200808 :100060008A00210E8300FF0E7F0E09008A110A12FA :10007000E4288A110A1287280A108A100A118207B6 :1000800020344D34413441345234533420345334C9 :1000900054344134523454345534503420344D3473 .................... :103F10008A1525308316B0000A128A1183120426EE :103F20000A168A1501308316B0000A128A1183120C :103F300004260A168A1583162B08B0000A128A1165 :103F4000831204260A168A1523308316B0000A123B :103F50008A11831204260A168A15AE2F8A150A12B0 :103F6000B12E0A148A140A158207FE2CFE2CFE2C90 :023F7000FE2C25 :02400E00323F3F :00000001FF ;PIC16F876 NA – L3 http://www.mrscuole.net/anxapic/ 13 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Programmazione del PIC La famiglia PIC16F8X , che comprende il 16F84, il 16F877 ecc. , può essere programmata : • separatamente, con un Programmatore • direttamente, mentre si trova già montato nel circuito finale , aggiungendo nello schema del progetto un adatto connettore in più ( programmazione in-circuit) Dato che il PIC ha una memoria Flash di programma, sono possibili veloci variazioni o aggiornamenti del codice programma. NA – L3 http://www.mrscuole.net/anxapic/ 14 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Programmazione del PIC Dopo aver scritto il programma , cioè il codice sorgente, lo si compila: viene creato un file oggetto con estensione .HEX, il quale deve essere caricato nella memoria di programma del PIC. Per caricare il file .HEX nella memoria programma del PIC occorre: • Un personal computer • Un programmatore • Il software di gestione del programmatore NA – L3 http://www.mrscuole.net/anxapic/ 15 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il primo esercizio => Blinking Led Led lampeggiante che si accende e si spegne ogni mezzo secondo Punti fongamentali per: Analisi, progettazione e stesura del software •Analisi e stesura per punti cronologici del problema •Flow – Charts •Scrittura del codice NA – L3 http://www.mrscuole.net/anxapic/ 16 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi della soubroutine di ritardo di 500 ms Il concetto è molto semplice: il microcontrollore deve aspettare 500 ms “senza compiere alcuna operazione attiva”. Ad esempio se il controllore 1. Decrementa il contenuto di un registro (1 µs) 2. Torna a 1. se il contenuto del registro è <> 0 [Confronto] (2 µs) In totale avremo un tempo di esecuzione pari a 3 µs. Se ripetiamo questa operazione per 167.000 volte avremo un tempo di esecuzione pari a 501.000 µs cioè circa 500 ms Il nostro controllore possiede registri ad 8 bit allora possiamo sfruttare la seguente logica sfruttando 2 registri ad 8 bit e ricordando che i registri sono ciclici cioè 00 - 1= FF 1. Riserviamo due registri (delayL e delayH); set delayL 0 e delayH 0 2. Decrement delayL 3. se delayL ≠ 0 jump 2. else 4. 4. questa operazione viene ripetuta per FF 5. (256) volte cioè per 6. 4. Decrement delayH 7. se delayH ≠ 0 jump 2. else 6. 8. questa operazione viene ripetuta per FF 9. (256) volte cioè per 1 µs 2 µs 256 x 3 = 768 µs 1 µs 2 µs 256 x 3 = 768 µs Considerando che i due cicli sono “annidati” avremo che i due registri tornano ambedue a zero dopo un tempo pari a 768 x 768 = 589. 824 µs cioè quasi 500 ms. Fine Routine Return NA – L3 http://www.mrscuole.net/anxapic/ 17 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi della soubroutine di ritardo di 500 ms -> Flow Chart Il concetto è molto semplice: il microcontrollore deve aspettare 500 ms “senza compiere alcuna operazione attiva”. Ad esempio se il controllore • Decrementa il contenuto di un registro (1 µs) • Torna a 1. se il contenuto del registro è <> 0 [Confronto] (2 µs) In totale avremo un tempo di esecuzione pari a 3 µs. Se ripetiamo questa operazione per 167.000 volte avremo un tempo di esecuzione pari a 501.000 µs cioè circa 500 ms Il nostro controllore possiede registri ad 8 bit allora possiamo sfruttare la seguente logica sfruttando 2 registri ad 8 bit e ricordando che i registri sono ciclici cioè 00 - 1= FF 1. Riserviamo due registri (delayL e delayH); set delayL 0 e delayH 0 2. Decrement delayL 3. se delayL ≠ 0 jump 2. else 4. 2 µs 4. questa operazione viene ripetuta per FF 5. (256) volte cioè per 6. Decrement delayH 7. se delayH ≠ 0 jump 2. else 6. 8. questa operazione viene ripetuta per FF 9. (256) volte cioè per 1 µs 256 x 3 = 768 µs 1 µs 2 µs 256 x 3 = 768 µs Considerando che i due cicli sono “annidati” avremo che i due registri tornano ambedue a zero dopo un tempo pari a 768 x 768 = 589. 824 µs cioè quasi 500 ms. Fine Routine Return NA – L3 http://www.mrscuole.net/anxapic/ 18 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Il Listato completo ;*********************************************************** ;Led blinking -> ON/OFF ogni 500 ms ;Led collegato su RB0 ;N.A. October 2004 ;******************************************** PROCESSOR 16F877A ;Direttive preprocessore RADIX DEC INCLUDE "P16F877A.INC" ERRORLEVEL -302 __CONFIG 3FF1H LED EQU 0 ;Bit 1 della porta relativa Spegni ORG 20h ;Registro general purpose bcf PORTB,LED ;Spengo il led ram RES 2 ;Riservo due registri a 8 bit ORG 00H ;Start reset vector goto loop ;Jump a Loop bcf STATUS,RP1 ;Scelgo il Bank 1 bsf STATUS,RP0 ;RP1=0 RP0=1 Delay500 ;Sobroutine di ritardo movlw 00111111B ;Bit PORTA come input movwf TRISA movlw 11111110B ;Bit1 PORTB in Out movwf TRISB ;gli altri bit in input bcf STATUS,RP0 ;Torno al Bank0 bsf PORTB,LED ;Accendo il Led Loop ; Label call Delay500 ;Delay 500 ms btfsc PORTB,LED ;Spengo il led goto Spegni ;se è acceso bsf PORTB,LED ;Accendo il led goto loop ;Jump a Loop NA – L3 Clrf ram Clrf ram+1 ;Azzero i due registri ;riservati Ciclo_di_ritardo decfsz ram,1 ;Decremento il registro ram goto Ciclo_di_ritardo ;per 256 volte decfsz ram+1,1 ;Decremento il registro ram +1 goto Ciclo_di_ritardo ;per 256 volte return ;Fine soubroutine END ;Indispensabile alla fine del listato http://www.mrscuole.net/anxapic/ 19 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato Direttive Le direttive non sono delle istruzioni mnemoniche che il compilatore traduce nel rispettivo opcode, ma delle semplici indicazioni rivolte al compilatore per determinarne il funzionamento durante la compilazione PROCESSOR 16F877 PROCESSOR è una direttiva del compilatore assembler che consente di definire per quale microprocessore è stato scritto il nostro source. In questo caso informiamo il compilatore che le istruzioni che abbiamo inserito nel nostro source sono relative ad un PIC16F877 RADIX DEC La direttiva RADIX serve ad informare il compilatore che i numeri riportati senza notazione, sono da intendersi come numeri decimali ORG 00H Questa seconda direttiva fa riferimento ad un indirizzo in area programma nella EEPROM. Da questo punto in poi andremo infatti ad inserire le istruzioni mnemoniche che il compilatore dovrà convertire negli opportuni opcode per il PIC. Il primo opcode eseguito dal PIC dopo il reset è quello memorizzato nella locazione 0, da qui il valore 00H inserito nella ORG. NA – L3 http://www.mrscuole.net/anxapic/ 20 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato Direttive La direttiva EQU (parola riservata)è molto importante in quanto ci consente di definire delle costanti simboliche all'interno del nostro codice sorgente. In particolare : LED EQU 3 la parola LED (nome scelto da noi) da questo punto in poi nel sorgente sarà equivalente al valore 3 Nel prossimo esempio incontriamo una (label)etichetta : RAM e una direttiva: RES. La direttiva RES indica al compilatore che intendiamo riservare un certo numero di byte o meglio di file register all'interno dell'area dati: ORG 20h ram RES 2 in questo caso verranno riservate la locazione 20H e 21H . La label RAM, dove RAM è un nome scelto da noi, è un marcatore che nel resto del codice sorgente assumerà il valore dell'indirizzo in cui è stato inserito. ORG 00H Questa seconda direttiva ORG fà riferimento ad un indirizzo in area programma (nella EEPROM) anzichè in area dati. Da questo punto in poi andremo infatti ad inserire le istruzioni mnemoniche che il compilatore dovrà convertire negli opportuni opcode per il PIC. NA – L3 http://www.mrscuole.net/anxapic/ 21 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato OpCode • Il primo opcode eseguito dal PIC dopo il reset è quello memorizzato nella locazione 0, da qui il valore 00H inserito nella ORG. bsf STATUS,RP0 Ecco finalmente la prima istruzione mnemonica completa di parametri. • I PIC hanno una CPU interna di tipo RISC per cui ogni istruzione occupa una sola locazione di memoria, opcode e parametri inclusi. In questo caso l'istruzione mnemonica bsf sta per BIT SET FILE REGISTER ovvero metti a uno (condizione logica alta) uno dei bit contenuti nella locazione di ram specificata. • Il parametro STATUS viene definito nel file P16F877A.INC tramite una direttiva EQU. Il valore assegnato in questo file è 03H e corrisponde ad un file register (ovvero una locazione ram nell'area dati) riservato. • Anche il parametro RP0 viene definito nel file P16F877A.INC con valore 05H e corrisponde al numero del bit che si vuole mettere a uno. Ogni file register è lungo 8 bit e la numerazione di ciascuno parte da 0 (bit meno significativo) fino ad arrivare a 7 (bit più significativo) • Questa istruzione in pratica mette a 1 il quinto bit del file register STATUS, è necessaria per accedere ai file register TRISA e TRISB come vedremo ora. movlw 00011111B • Questa istruzione sta a significare: MOVE LITERAL TO W REGISTER ovvero muovi un valore costante nell'accumulatore. L'accumulatore è un particolare registro utilizzato dalla CPU in tutte quelle situazioni in cui vengono effettuate operazioni tra due valori oppure in operazioni di spostamento tra locazioni di memoria. In pratica è un registro di appoggio utilizzato dalla CPU per memorizzare temporaneamente un byte ogni volta che se ne presenta la necessità. • Il valore costante da memorizzare nell'accumulatore è 00011111B ovvero un valore binario a 8 bit dove il bit più a destra rappresenta il bit 0 o bit meno significativo. NA – L3 http://www.mrscuole.net/anxapic/ 22 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato OpCode Nell'istruzione successiva: movwf TRISA • il valore 00011111 viene memorizzato nel registro TRISA (come per il registro STATUS anche TRISA è definito tramite una direttiva EQU) la cui funzione è quella di definire il funzionamento di ogni linea di I/O della porta A. In particolare ogni bit ad uno del registro TRISA determina un ingresso sulla rispettiva linea della porta A mentre ogni 0 determina un'uscita. Nella seguente tabella viene riportata la configurazione che assumeranno i pin del PIC dopo l'esecuzione di questa istruzione: Come è possibile vedere i bit 6 e 7 non corrispondono a nessuna linea di I/O e quindi il loro valore non ha alcuna influenza. NA – L3 http://www.mrscuole.net/anxapic/ 23 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato OpCode Le due istruzioni successive svolgono le stesse funzioni per la porta B del PIC: movlw 11111110B Movwf TRISB in questo caso la definizione delle linee sarà la seguente: L'istruzione movwf TRISB trasferisce il valore contenuto nell'accumulatore (inizializzato opportunamente con l'istruzione movlw 11111110 B) nel registro TRISB. Il significato di movwf è infatti MOVE W TO FILE REGISTER. Si noti come il valore 0 nel bit 0 del registro TRISB determini la configurazione in uscita della rispettiva linea del PIC. Nella nostra applicazione infatti questa linea viene utilizzata per pilotare il LED da far lampeggiare. NA – L3 http://www.mrscuole.net/anxapic/ 24 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato OpCode bcf STATUS,RP0 • Questa istruzione è simile alla bsf vista in precedenza, con la sola differenza che azzera il bit anzichè metterlo a uno. La sigla un questo caso è BIT CLEAR FILE REGISTER. • Dal punto di vista funzionale questa istruzione è stata inserita per consentire l'accesso ai registri interni del banco 0 anzichè ai registri interni del banco 1 di cui fanno parte TRISA e TRISB. N.B:=> La direttiva assembler “BankSel …..” Viene oggi suggerita dalla microchip per la selezione dei registri dei rispettivi banchi di memoria; in seguito vedremo un uso appropriato di questa direttiva. bsf PORTB,LED • Con questa istruzione viene effettuata la prima operazione che ha qualche riscontro all'esterno del PIC. In particolare viene acceso il led collegato alla linea RB0. PORTB è una costante definita in P16F877A.INC e consente di referenziare il file register corrispondente alle linee di I/O della porta B mentre LED è il numero della linea da mettere a 1. All'inizio del source la costante LED è stata definita pari a 0, quindi la linea interessata sarà RB0. NA – L3 http://www.mrscuole.net/anxapic/ 25 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato OpCode Loop • Questa linea contiene una label ovvero un riferimento simbolico ad un indirizzo di memoria. Il valore della label, come detto in precedenza, viene calcolato in fase di compilazione in base al numero di istruzioni, alle direttive ORG e alle altre istruzione che in qualche modo allocano spazio nella memoria del PIC. In questo caso, se contiamo le istruzioni inserite a partire dall'ultima direttiva ORG possiamo calcolare il valore che verrà assegnato a MainLoop ovvero 09H. • In realtà il valore che assumono le label non ha molta importanza in quanto il loro scopo è proprio quello di evitare di dover conoscere la posizione precisa degli opcode nella memoria del PIC permettendo comunque di referenziare una determinata locazione di memoria. • In questo caso la label Loop viene utilizzata come punto di ingresso di un ciclo (dall'inglese Loop) di accensione e spegnimento del led, ovvero una parte di codice che verrà ripetuta ciclicamente all'infinito. call Delay500 • • Questa istruzione dermina una chiamata (dall'inglese call) ad una subroutine che inizia in corrispondenza della label Delay. Le subroutine sono delle parti di programma specializzare ad effettuare una funzione specifica. Ogni qualvolta è necessaria quella funzione è sufficiente richiamarla con una sola istruzione, anzichè ripetere ogni volta tutte le istruzioni necessarie ad effettuarla. In questo caso la subroutine inserisce un ritardo pari al tempo di accensione e spegnimento del led. NA – L3 http://www.mrscuole.net/anxapic/ 26 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato OpCode btfsc PORTB,LED • Il significato di questa istruzione è BIT TEST FLAG, SKIP IF CLEAR ovvero controlla lo stato di un bit all'interno di un registro e salta l'istruzione successiva se il valore di tale bit è zero. Il bit da controllare corrisponde alla linea di uscita cui è collegato il diodo led, tramite questo test potremo determinare quindi se il led è acceso o spento e quindi agire di conseguenza, ovvero se il led è gia acceso lo spegneremo, se il led è spento lo accenderemo. goto Spegni • Questa istruzione è un salto incondizionato (dall'inglese GO TO, vai a)alla label SetToZero dove troveremo le istruzioni per spegnere il led. Questa istruzione verrà saltata dall'istruzione successiva se il led è gia spento. bsf PORTB,LED goto Loop • Queste due istruzioni semplicemente accendono il led e rimandano il programma all'ingresso del ciclo di lampeggiamento. Spegni bcf PORTB,LED goto Loop • Queste istruzioni semplicemente spengono il led e rimandano il programma all'ingresso del ciclo di lampeggiamento. NA – L3 http://www.mrscuole.net/anxapic/ 27 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato La soubroutine Delay • Come descritto in precedenza questa subroutine inserisce un ritardo di circa un secondo e può essere chiamata più volte nel source tramite l'istruzione call Delay. La soubroutine di ritardo Delay500 clrf ram clrf ram+1 Ciclo_di_ritardo decfsz ram,1 goto Ciclo_di_ritardo decfsz ram+1,1 goto Ciclo_di_ritardo return END Delay e Ciclo_di_ritardo sono due label. Delay identifica l'indirizzo di inizio della subroutine e viene utilizzato per le chiamate dal corpo principale del programma. Ciclo_di_ritardo viene chiamato internamente dalla subrountine e serve come punto di ingresso per il ciclo (dall'inglese loop) di ritardo. In pratica il ritardo viene ottenuto eseguendo migliaia di istruzioni che non fanno nulla ! Questo tipo di ritardo si chiama ritardo software o ritardo a programma. E' il tipo di ritardo più semplice da implementare e può essere utilizzato quando non è richiesto che il PIC esegua altri compiti mentre esegue il ritardo. NA – L3 http://www.mrscuole.net/anxapic/ 28 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato La soubroutine Delay La soubroutine di ritardo • Delay500 clrf ram clrf ram+1 Ciclo_di_ritardo decfsz ram,1 goto Ciclo_di_ritardo decfsz ram+1,1 goto Ciclo_di_ritardo return END • Clrf ram clrf ram +1 CLEAR FILE REGISTER azzerano le due locazioni di ram riservate precedentemente con l'istruzione: ram RES 2 Queste due locazioni sono adiacenti a partire dall'indirizzo referenziato dalla label ram (in pratica 20H e 21H decfsz ram,1 • L'istruzione significa DECREMENT FILE REGISTER, SKIP IF ZERO ovvero decrementa il contenuto di un registro (in questo caso Count e salta l'istruzione successiva se il valore raggiunto è zero). Se il valore raggiunto non è zero viene eseguita l'istruzione successiva: goto Ciclo_di_ritardo • NA – L3 Che rimanda rimanda l'esecuzione all'inizio del ciclo di ritardo. http://www.mrscuole.net/anxapic/ 29 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ Analisi del listato La soubroutine Delay La soubroutine di ritardo Delay500 clrf ram clrf ram+1 Ciclo_di_ritardo decfsz ram,1 goto Ciclo_di_ritardo decfsz ram+1,1 goto Ciclo_di_ritardo return END • • Una volta raggiunto lo zero con il contatore ram vengono eseguite le istruzioni: decfsz ram+1,1 goto Ciclo_di_ritardo Che decremetano il registro seguente fino a che anche questo raggiunge lo zero. Il registro ram+1 in particolare verrà decrementato di uno ogni 256 decrementi di ram. Quando anche ram +1 avrà raggiunto lo zero l'istruzione: return • il cui significato è RETURN FROM SUBROUTINE determinerà l'uscita dalla routine di ritardo ed il proseguimento dell'esecuzione dall'istruzione successiva la call Delay. Per finire END è una direttiva (indispensabile) che indica al compilatore la fine del source assembler. NA – L3 http://www.mrscuole.net/anxapic/ 30 http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/
Documenti analoghi
Lezione n° 5 - mrscuole.net
Vediamo ora dei semplici esempi di programmazione dei PIC in assembler,
riordineremo i concetti sviluppati in precedenza e cercheremo di approfondire la
simulazione mediante MPSIM e Proteus.
Ricord...
Microcontrollori PIC
btfss = Bit Test File Register Skip Set = Esegui il test del bit del file register e salta se è settato
Corso PIC - Sistemi e reti di computer
Il pin MCLR (pin 4) serve per poter effettuare il reset del PIC. Normalmente viene mantenuto a 5 volt tramite la
resistenza di pull up R1 e messo a zero quando si desidera resettare il PIC. Grazie ...